我正试图按照这个教程在这里 https:/www.microsoftpressstore.comarticlesarticle.aspx?p=2201303 特别是提到x kernel32的部分!kernel32!
我找不到kernel32!WriteProcessMemory =这个方法,尽管文档中提到了,但是我可以找到kernel32!_imp__WriteProcessMemory和kernel32!WriteProcessMemoryStub。我是windbg的新手,正试图按照教程去做,所以我不确定这个方法是否已经被废弃,如果是的话,它的替代品是什么,我们如何实现类似的功能。
谢谢你
输出的 WriteProcessMemory
事实上,函数指向的是 kernel32!WriteProcessMemoryStub
存根,它本身也会跳到 kernel32!__imp_WriteProcessMemory
它重定向到 kernelbase
DLL是这个函数的 "真正 "位置。
让我们用链接转储检查一下。
C:>link /dump /exports c:\windows\system32\kernel32.dll | findstr /I WriteProcess
1579 62A 00036C50 WriteProcessMemory
0x36C50是函数 "WriteProcessMemory "在kernel32中的RVA位置(如导出表所示). 现在在windbg中,我们有一个完全匹配的函数,它在内核32中(由导出表给出)。
0:007> ln kernel32 + 0x36c50
Browse module
Set bu breakpoint
(00007ff9`4a6e6c50) KERNEL32!WriteProcessMemoryStub | (00007ff9`4a6e6c60) KERNEL32!ZombifyActCtxStub
我们有了一个完全匹配的函数,它实际上是 "WriteProcessMemory"。KERNEL32!WriteProcessMemoryStub
功能。如果我们看它。
0:007> u KERNEL32!WriteProcessMemoryStub
KERNEL32!WriteProcessMemoryStub:
00007ff9`4a6e6c50 48ff2599150400 jmp qword ptr [KERNEL32!_imp_WriteProcessMemory (00007ff9`4a7281f0)]
00007ff9`4a6e6c57 cc int 3
我们可以看到它只是一个跳转到... KERNEL32!_imp_WriteProcessMemory
(位于某地) .idata
kernel32的一部分)。)
现在如果我们看一下这个位置包含了什么,我们有一个指针。
0:007> dp KERNEL32!_imp_WriteProcessMemory L1
00007ff9`4a7281f0 00007ff9`496f0ca0
如果我们问windbg,这个指针是什么?
0:007> ln 00007ff9`496f0ca0
Browse module
Set bu breakpoint
(00007ff9`496f0ca0) KERNELBASE!WriteProcessMemory | (00007ff9`496f0dc4) KERNELBASE!OpenWow64CrossProcessWorkConnection
Exact matches:
KERNELBASE!WriteProcessMemory (void)
我们可以看到,事实上 "真正 "的位置是... ... WriteProcessMemory
其实 kernelbase.dll
.
注意:实际上,你可以在最后两个命令中使用 dps
:
0:007> dps KERNEL32!_imp_WriteProcessMemory L1
00007ff9`4a7281f0 00007ff9`496f0ca0 KERNELBASE!WriteProcessMemory
使用Windbg命令
ln (List Nearest Symbols)
:给定一个地址,找到最近的符号。u (unassemble)
用于拆解一个函数
dp (display memory)
:显示内存 (pOinter大小)。)
dps(Display Words and Symbols)
作为 dp
但带有符号信息。