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

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

 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;
  }
}

进行一些善后工作,关闭打开的线程句柄、进程句柄,释放分配的远程内存;

具体细节请参考示例代码。

上一页  1 2 3 

Tags:如何 获取 其它

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