如何获取其它进程中窗口的窗口过程
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
更多精彩
赞助商链接