首页
社区
课程
招聘
[原创]Hook Api lib 0.5 - 2008.04.16更新
发表于: 2008-4-16 11:15 96029

[原创]Hook Api lib 0.5 - 2008.04.16更新

2008-4-16 11:15
96029
收藏
免费 7
支持
分享
最新回复 (99)
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
26
pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);


你只挂了钩子,并没有hook
2008-4-22 09:05
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
[QUOTE=海风月影;444120]
pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);


你只挂了钩子,并没有hook[/QUOTE]

请看那个钩子函数的代码,在里面hook了啊

__declspec(dllexport) BOOL WINAPI InstallHook()
 {
   // 初始化挂钩函数
   g_hHook=SetWindowsHookEx(3,KeyboardProc,(HINSTANCE)handle,0);
   if (!g_hHook)
   {
     return FALSE;
   }

   return TRUE;
 }


LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
 {
   // 安装ApiHook
   if (!pHookEnv)
   {
     pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);
     if (pHookEnv)
     {
       ::MessageBoxA(NULL,"1111111","Very Good!!",MB_ICONINFORMATION);
      }
     
     
   }
   return CallNextHookEx(g_hHook,nCode,wParam,lParam); 
   
}
2008-4-22 11:58
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
28
放个bin出来看看

你放的代码不全
2008-4-22 11:59
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
29
你挂的是键盘钩子,要有键盘动作才会执行你的

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
2008-4-22 12:00
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
我贴的就是核心代码啊,晕死,还有什么代码???
2008-4-22 12:01
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
关键就是在这!钩子的回调函数只是一个形式而已,起什么名字都可以,具体的我安装的hook类型是WH_GETMESSAGE ,换成别的全局类型的钩子也是无效,所以很想弄明白是如何全局HookApi的.
我在里面检测了,如果已经hook了,就把钩子函数传递到下一个.

#define WH_MIN              (-1)
#define WH_MSGFILTER        (-1)
#define WH_JOURNALRECORD    0
#define WH_JOURNALPLAYBACK  1
#define WH_KEYBOARD         2
#define WH_GETMESSAGE       3
#define WH_CALLWNDPROC      4
#define WH_CBT              5
#define WH_SYSMSGFILTER     6
#define WH_MOUSE            7
#if defined(_WIN32_WINDOWS)
#define WH_HARDWARE         8
#endif
#define WH_DEBUG            9
#define WH_SHELL           10
#define WH_FOREGROUNDIDLE  11
#if(WINVER >= 0x0400)
#define WH_CALLWNDPROCRET  12
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#endif // (_WIN32_WINNT >= 0x0400)
2008-4-22 12:05
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
32
放个可以执行的东西
2008-4-22 12:06
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
33
#define WH_GETMESSAGE       3
#define WH_CBT              5
#define WH_MOUSE            7

装这3个钩子,90%的程序你都能注入进去了
2008-4-22 12:11
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
我把exe和dll的工程给你发上来.
上传的附件:
2008-4-22 12:19
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
35
1,HookApi.cpp用Release方式编译,如果工程想用debug方式,那么用hookapi.lib去编译

2,改一下代码,hook后不能随便FreeLibrary
UnHook后再Free
void CHookApiAppDlg::OnOK() 
{
	//_asm cpuid
	__pfnInstallHook InstallHook;
	HINSTANCE hinstLib = LoadLibrary("HookApiDll.dll");
	InstallHook = (__pfnInstallHook)GetProcAddress(hinstLib,"InstallHook");
	BOOL bRet = InstallHook();
	//FreeLibrary(hinstLib);

}


void CHookApiAppDlg::OnCancel() 
{
	__pfnUnHook UnHook;
	HINSTANCE hinstLib = LoadLibrary("HookApiDll.dll");
	UnHook = (__pfnUnHook)GetProcAddress(hinstLib,"UnHook");
	BOOL bRet = UnHook();
	FreeLibrary(hinstLib);
	FreeLibrary(hinstLib);
	//CDialog::OnOK();
}
2008-4-22 13:34
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
不管dll还是exe我都是用Release方式编译的,请问你那里编译执行成功了嘛?
我就是用OD跟踪的,到执行dll中的函数InstallHook完成后停下的,还没有FreeLib呢,这个时候我用OD打开别的程序,发觉要Hook的函数并没有改变.
2008-4-22 14:28
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
感觉还是下面的代码没有安装成功ApiHook,因为我点击取消以后跟踪进UnHook,发觉pHookEnv是0.可是这里我不知道该怎么安装才能是正确的?

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
        // 安装ApiHook
        if (!pHookEnv) //判断是否安装了ApiHook
        {
                pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);
//                 if (pHookEnv)
//                 {
//                         ::MessageBoxA(NULL,"1111111","Very Good!!",MB_ICONINFORMATION);
//                 }
//                
               
        }
        return CallNextHookEx(g_hHook,nCode,wParam,lParam);
       
}

我还用了只HOOK一次的办法

BOOL g_bOne = FALSE;
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
        // 安装ApiHook
        if (!g_bOne)
        {
                pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);
//                 if (pHookEnv)
//                 {
//                         ::MessageBoxA(NULL,"1111111","Very Good!!",MB_ICONINFORMATION);
//                 }
//                
                g_bOne = TRUE;
        }
        return CallNextHookEx(g_hHook,nCode,wParam,lParam);
       
}
2008-4-22 15:01
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
38
上面改了以后我这里可以用,可以看到LoadLibraryA已经被hook了

关掉程序后,我的大部分程序因为LoadLibraryA被hook后dll释放了,而挂掉
2008-4-22 15:11
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
晕,我这里死活不能成功,你可以把你的修改过的工程或者exe和dll给我发一份嘛?
2008-4-22 15:20
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
40
我删掉了。。。。
你再加2个钩子

#define WH_CBT              5
#define WH_MOUSE            7

主程序代码照上面的改
2008-4-22 15:34
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
1.我把安装HookApi的代码放在DLL的初始化和卸载过程中,可以正常HookApi了,但是对于一些程序在没有完全启动以后,被Hook的函数是没有机会被改变的,因为这个时候SetWindowsHookEx的回调函数并没有被触发,所以我们的钩子DLL模块还没有被初始化,只有在程序完全运行起来以后,符合SetWindowsHookEx安装的钩子类型,此刻这个全局的dll才会被这个exe说载入,才会执行HookApi过程,这样就有一些遗憾,对于一些程序启动就调用的API是无法用这种方式记录调用参数的.

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        handle = hModule;
        switch(ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                _asm cpuid;
                if (!pHookEnv)
                {
                        pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);
               
                }
                break;
        case DLL_PROCESS_DETACH:
                if (pHookEnv)
                {
                        UnInstallHookApi((PHOOKENVIRONMENT)pHookEnv);
                }
                break;
        default:
            break;
        }
        return TRUE;
}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//         // 安装ApiHook
//         if (!g_bOne)
//         {
//                 pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);
// //                 if (pHookEnv)
// //                 {
// //                         ::MessageBoxA(NULL,"1111111","Very Good!!",MB_ICONINFORMATION);
// //                 }
//                  g_bOne = TRUE;
//                
//         }
        return CallNextHookEx(g_hHook,nCode,wParam,lParam);
       
}
__declspec(dllexport) BOOL WINAPI InstallHook()
{
        // 初始化挂钩函数
        g_hHook=SetWindowsHookEx(5,KeyboardProc,(HINSTANCE)handle,0);
        if (!g_hHook)
        {
                return FALSE;
        }
       
        return TRUE;
}

2.对于在钩子回调函数过程中,我始终无法成功HookApi,不知道哪里出错了.

3.结论,SetWindowsHookEx函数应该是向操作系统注册一个回调函数的处理过程,当有符合我们SetWindowsHookEx的钩子类型时刻,操作系统才把我们的钩子dll动态的映射入产生钩子事件的模块中(exe,dll),这个过程首先进行DLL的初始化,才接着运行我们向操作系统注册的SetWindowsHookEx的钩子回调函数.


不知道我讲的是否正确,请楼主指正!
2008-4-22 16:02
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
2.对于在钩子回调函数过程中,我始终无法成功HookApi,不知道哪里出错了.


刚才采用WH_MOUSE钩子安装,总算成功了,但是,结论还是上面的,只有被监视的exe触发我们安装的钩子类型,才会被操作系统映射我们的钩子dll到这个exe中,这个过程中,DLL首先被初始化,然后才是钩子函数的执行.

所以,用此类办法无法监视一个程序加载开始的API调用(因为此刻程序没有完全运行起来,所以没有消息循环,没有窗口过程,没有鼠标和键盘的消息产生,于是就无法向操作系统发出那些钩子类型的消息)????

或者说有没有一种钩子类型是可以在一个程序被操作系统创建执行的时候向系统发送这个钩子呢?

晕,发觉自己越来越绕口~~~汗

再整理一下思路.
全局注入,---->SetWindowsHookEx-->向操作系统注册我们的相对应的钩子类型的回调函数,由操作系统来判断钩子类型的发生并且主动通知我们的钩子回调函数----->我们的钩子dll被操作系统强行映射入产生钩子的模块空间,并且进行执行钩子dl的DllMain函数,------>然后才是执行我们定义的钩子回调函数.
2008-4-22 16:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
这个库怎么用在delphi里面???
2008-5-6 15:44
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
如果被注入的程序没有窗体,是不是永远无法触发HOOK?
而且,我试过:
if (!g_bOne)
  {
    pHookEnv = InstallHookApi("Kernel32.dll", "LoadLibraryA", My_LoadLibraryA);
//     if (pHookEnv)
//     {
//       ::MessageBoxA(NULL,"1111111","Very Good!!",MB_ICONINFORMATION);
//     }
//     
    g_bOne = TRUE;

其中虽然有全局g_bOne变量的限制,InstallHookApi函数还是会被执行N次,实在是无法理解,g_bOne变量要怎么定义?我试过放在共享模块中都不行。
还有当把钩子放在DLL中是不是整个DLL的代码都放在目标进程空间了,我们能不能用远线程的方式执行InstallHookApi?
2008-5-7 08:31
0
雪    币: 3519
活跃值: (1842)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
45
太好了!严重支持!
2008-5-8 20:12
0
雪    币: 93
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
46
lde32也会有错.
        //mov byte ptr ds:[eax],0
        { 0xC6, 0x00, 0x00, },
        //mov byte ptr ss:[ebp+ebx+FFFF797C],12
        { 0xC6, 0x84, 0x1D, 0x7C, 0x79, 0xFF, 0xFF, 0x12 },
        //mov byte ptr ss:[ebx+ebp+FFFF797C],12
        { 0x36, 0xC6, 0x84, 0x2B, 0x7C, 0x79, 0xFF, 0xFF, 0x12, },
上面三条全都错了,我看lde的说明是只修改了win32asm版本的bug,没修改c语言版本的.
郁闷,普通汇编我懂些,win32汇编我看着特乱,不懂.
2008-6-28 17:13
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
0.5版本我运行就直接出错
2008-6-28 17:53
0
雪    币: 259
活跃值: (26)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
48
测试了一下,VC6+SP6 Debug下无效,Release可以,不方便调试,呵呵,能不能做个DEBUG版的
2008-6-30 09:42
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
49
debug可以用hookapi.lib,这个lib是release的

[QUOTE=godmir;473057]lde32也会有错.
        //mov byte ptr ds:[eax],0
        { 0xC6, 0x00, 0x00, },
        //mov byte ptr ss:[ebp+ebx+FFFF797C],12
        { 0xC6, 0x84, 0x1D, 0x7C, 0x79, 0xFF, 0xF...[/QUOTE]

LDE32可以自己换掉

不过对于这里的hookapi来说已经够了,函数开头的几条语句一般不会是上面几条

如果有更进一步的目的,还是用反汇编引擎比较保险
2008-6-30 09:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
这个代码支持hook writefile吗?哈哈
2008-7-11 20:01
0
游客
登录 | 注册 方可回帖
返回
//