如何获取其它进程中窗口的窗口过程
2007-03-17 22:00:01 来源:WEB开发网核心提示: 0x002d0012pusheax//501byte0x002d0013pushhWndTarget//58785634125bytes0x002d0018pushMsg//58341200005bytes0x002d0023pushdwThreadId//58785600005bytes
0x002d0012pusheax //50 1byte
0x002d0013pushhWndTarget //5878563412 5bytes
0x002d0018pushMsg //5834120000 5bytes
0x002d0023pushdwThreadId //5878560000 5bytes
0x002d0028callPostThreadMessageA //E87DEBA677 5bytes
0x002d0033ret //C3 1bytes
0x002d0034xxxx
有了以上的准备工作,下边就可以正式进行工作了。假如给定了要获取 hWndTarget 窗口的窗口过程
调用 GetWindowThreadProcessId ,得到该窗口所属进程的Id,存放在 dwProcess中;
调用 OpenProcess,打开该进程(如果打开失败,可能是权限不够,需要调用AdjustTokenPrivileges提升一下当前进程的权限),得到一个该进程的句柄,存放在hProcess中 ;
调用 IsWindowUnicode,判断下一步应该调用 GetWindowLongA 还是 GetWindowLongW函数;
调用 VirtualAllocEx,在目标进程中分配一些内存,供我们写入线程函数使用。函数返回的就是分配的内存的起始地址,就是我们的线程函数的起始地址,假设叫fnStartAddr;根据我们上边分析的结果,需要33个字节,另外,线程函数最后要有一个 ret指令,占用一个字节,共需34个字节;
把以上分析的结果写入一个临时的缓冲区里;
调用 WriteProcessMemory,把刚才的结果写入远程进程 fnStartAddr的地址处 ;
调用 CreateRemoteThread,指定线程函数地址为 fnStartAddr;
进行一个小的消息循环,等待我们的返回结果;MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message == uMsgSendBack)
{
procRet = msg.lParam;
break;
}
}
进行一些善后工作,关闭打开的线程句柄、进程句柄,释放分配的远程内存;
具体细节请参考示例代码。
更多精彩
赞助商链接