基本上,当 WriteProcessMemory 被调用时,我找不到正在写入哪个进程。目前我正在 WriteProcessMemory 和 OpenProcess 上设置断点。但是,传递给WriteProcessMemory的进程句柄与从OpenProcess获取的进程句柄不同,所以看起来进程句柄是通过另一种方式获取的。有什么我错过了吗?我应该在其他函数上添加更多断点吗?
如何使用 WriteProcessMemory 识别正在写入哪个进程?
逆向工程
视窗
恶意软件
调试器
注射
2021-06-29 09:34:29
3个回答
使用 x64dbg 也很容易。当您打破WriteProcessMemory手柄时,将[esp+0x4]在内存中。

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

如您所见,在我的情况下,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等)
其它你可能感兴趣的问题