api hook的问题!!!!!!!!!!!!!!!!!!

erictb 2006-01-16 06:02:07
SetWindowsHookEx用的是WH_CALLWNDPROC,系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;

我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标

程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重

定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API

中来。这是最关键的部分。

DWORD dwCurrentPID = 0;
HHOOK hOldHook = NULL;
DWORD pSend = 0;
DWORD pRecv = 0;
GETMESSAGE pGetMessage = NULL;

BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 };
DWORD dwOldBytes[3][2];

HANDLE hDebug = INVALID_HANDLE_value;

LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD dwSize;
DWORD dwPIDWatched;
HMODULE hLib;

if( dwCurrentPID == 0 )
{
dwCurrentPID = GetCurrentProcessId();
HWND hwndMainHook;
hwndMainHook = ::FindWindow( 0, "MainHook" );
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );

if( dwCurrentPID == dwPIDWatched )
{
//替换函数
}
}

if( hOldHook != NULL )
{
return CallNextHookEx( hOldHook, nCode, wParam, lParam );
}

return 0;
}

dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
这两句怎么理解啊?

dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 可以理解为MainHook窗口

进程 处理消息WM_USER+100的时候,返回一个MainHook窗口的进程号.

但::SendMessage又会调用CallWndProc不就循环了么?

hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?
...全文
152 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
erictb 2006-02-13
  • 打赏
  • 举报
回复
那根据这最顶上代码,可以推断出来吧?
lzf8977 2006-02-13
  • 打赏
  • 举报
回复
, (WM_USER+101),

这个是用户自定义的消息,只能定义的人才知道了.
Tian_Dao_Akane 2006-02-10
  • 打赏
  • 举报
回复
mark
明天去抢劫 2006-02-10
  • 打赏
  • 举报
回复
是调用另一个窗口的才对
明天去抢劫 2006-02-10
  • 打赏
  • 举报
回复
相当于调用了一个函数,不过是调用别一个进程的,
取得一HHOOK的值
erictb 2006-01-27
  • 打赏
  • 举报
回复
有人回答这个问题么?
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?
erictb 2006-01-21
  • 打赏
  • 举报
回复
up
taianmonkey 2006-01-19
  • 打赏
  • 举报
回复
SendMessage的调用是阻塞方式的,就是知道SendMessage发送出去的消息被处理完毕,才会返回,否则回一直等待!
taianmonkey 2006-01-19
  • 打赏
  • 举报
回复
::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
是给你的窗口名称为MainHook的程序发送一个消息,WM_USER+100应该在MainHook的程序中有定义,也就是MainHook窗口的进程号。
::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );返回的东西要看你的程序中(WM_USER+101)是完成什么内容!看来是个句柄之类的东西!
erictb 2006-01-18
  • 打赏
  • 举报
回复
up
erictb 2006-01-18
  • 打赏
  • 举报
回复
谢谢:
microsoftwin(流星雨点), zzz3265(zzz) 的解答.

hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
是取得 SetWindowsHookEx 的Hook 就是原钩子函数的地址


还是没有太弄明白,能解释的更清楚么?thanks
Yofoo 2006-01-16
  • 打赏
  • 举报
回复
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
是取得你想要钩住的指定进程ID

hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
是取得 SetWindowsHookEx 的Hook 就是原钩子函数的地址

SendMessage又会调用CallWndProc不就循环了么?
这个可以在函数加判断防止死循环
明天去抢劫 2006-01-16
  • 打赏
  • 举报
回复
if( dwCurrentPID == 0 )
因为有这句,所以不会循环
单个进程只能进入这个If语句一次

/*
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );
这两句怎么理解啊?
*/
具体要看窗口处理过程函数

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧