WEB开发网
开发学院软件开发VC 如何获取其它进程中窗口的窗口过程 阅读

如何获取其它进程中窗口的窗口过程

 2007-03-17 22:00:01 来源:WEB开发网   
核心提示: WINUSERAPI LONG WINAPI GetWindowLongA( HWND hWnd, int nIndex)一共有两个参数,我们的 GetWindowLongA(hWnd,GWL_WNDPROC)函数调用的汇编代码大概就是这个样子(右边是响应的机器码)://参数入栈的顺序是从
WINUSERAPI LONG WINAPI GetWindowLongA( HWND hWnd, int nIndex)

一共有两个参数,我们的 GetWindowLongA(hWnd,GWL_WNDPROC)函数调用的汇编代码大概就是这个样子(右边是响应的机器码):

//参数入栈的顺序是从右向左,所以先pushnIndex,然后是pushhWnd
push0xFC        //6AFC       //GWL_WNDPROC的值是-4,写成16进制就是0xFC
pushhWndTarget     //5878563412   //假设hWndTarget=0x12345678
callGetWindowLongA   //E8(GetWindowLongA-下一条指令的地址)

GetWindowLongA函数的返回值在eax寄存器里,我们的PostThreadMessageA函数里用wParam参数发送该窗口句柄,用lParam参数发送该窗口的窗口过程 ,所以push lParam 就是 push eax

再来看看PostThreadMessageA的函数原型:

WINUSERAPI BOOL WINAPI PostThreadMessageA( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam)

PostThreadMessageA函数调用的汇编代码如下:

//Msg是我们自定义的消息,假设Msg=0x1234
pushlParam         //pusheax    //50 
pushwParam        //pushhWndTarget //5878563412      //假设hWndTarget=0x12345678
pushMsg                   //5834120000      //假设Msg=0x1234
pushdwThreadId               //5878560000      //假设dwThreadId=0x5678
callPostThreadMessageA           //E8(PostThreadMessageA-下一条指令的地址)

解释一下call PostThreadMessageA指令:

第一个机器码是E8,后边跟的不是PostThreadMessageA这个函数的地址,而是从当前指令的下一条指令的地址到那个函数的距离。例如,当前指令的地址是 0x2d0028,call指令长度为5个字节,那么下一条指令的地址就是0x2d0028 + 5 = 0x2d0033,假如 PostThreadMessageA函数的起始地址是0x77d3ebb0,那么我们call后边的数就是 0x77d3ebb0 - 0x2d0033 = 77A6EB7D,那么 call PostThreadMessageA的实际的机器码就是 E8 7D EB A6 77

Tags:如何 获取 其它

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接