如何使用 WriteProcessMemory 识别正在写入哪个进程?

逆向工程 视窗 恶意软件 调试器 注射
2021-06-29 09:34:29

基本上,当 WriteProcessMemory 被调用时,我找不到正在写入哪个进程。目前我正在 WriteProcessMemory 和 OpenProcess 上设置断点。但是,传递给WriteProcessMemory的进程句柄与从OpenProcess获取的进程句柄不同,所以看起来进程句柄是通过另一种方式获取的。有什么我错过了吗?我应该在其他函数上添加更多断点吗?

3个回答

使用 x64dbg 也很容易。当您打破WriteProcessMemory手柄时,将[esp+0x4]在内存中。

x64dbg 中堆栈视图的图像

记下句柄(在本例中为 0xDC)后,您可以转到Handlesx64dbg 主窗口中选项卡,然后Right click -> Refresh. 将列出与您的调试进程关联的所有句柄。现在您需要找到相应的句柄,仅此而已。

x64dbg 中的句柄选项卡的图像

如您所见,在我的情况下,WriteProcessMemory正在使用 PID 0x7A30 进行处理。

如果您不使用可以列出句柄(不太可能)的调试器,您可以使用像 Process Explorer 这样的外部工具,它也能够列出所有与进程相关的句柄。

你在使用哪个调试器?
大多数调试器会当场解密句柄,
即当您在 WriteProcessMemory() 调用本身上中断时,您可以找到句柄信息

这里是如何使用windbg 来完成
我正在调试ollydbg 和olllydbg ais 调试calc.exe
ollydbg 正在calc.exe中设置断点(使用WriteProcessMemory())

0:000> bl
     0 e Disable Clear  752444cf     0001 (0001)  0:**** KERNELBASE!WriteProcessMemory

0:000> .lastevent
Last event: c90.e10: Hit breakpoint 0

0:000> kb1
 # ChildEBP RetAddr  Args to Child              
00 0012bd44 00457929 0000014c 009c2000 02973020 KERNELBASE!WriteProcessMemory

0:000> !handle 14c f
Handle 14c
  Type          Process
  Attributes    0
  GrantedAccess 0x1fffff:
         Delete,ReadControl,xxxx,SetPort
  HandleCount   4
  PointerCount  10
  Name          <none>
  Object Specific Information
    Process Id  3336
    Parent Process  3216
    Base Priority 8

0:000> dx Debugger.Utility.Control.ExecuteCommand(".tlist").Where(a=>a.Contains("3336")==true)
Debugger.Utility.Control.ExecuteCommand(".tlist").Where(a=>a.Contains("3336")==true)                
    [0x30]           :  0n3336 calc.exe

0:000> dx Debugger.Utility.Control.ExecuteCommand(".tlist").Where(a=>a.Contains("3216")==true)
Debugger.Utility.Control.ExecuteCommand(".tlist").Where(a=>a.Contains("3216")==true)                
    [0x2f]           :  0n3216 ollydbg.exe

许多程序,尤其是恶意软件,会启动一个挂起的子进程(CreateProcess变种),用自己的(WriteProcessMemory有或没有VirtualAllocEx覆盖它的代码并恢复主线程(ResumeThread)。

还要寻找,您看到ReadProcessMemory的调用OpenProcess实际上可能是从其自己的页面读取的同一进程,并且WriteProcessMemory正在写入新创建的进程,但具有不同的句柄。

请注意,这些函数也有低级变体(ZwCreateThread等)