windbg 帮助缺少 kernel32 函数
windbg help missing kernel32 function
我正在尝试按照这里的教程进行操作 https://www.microsoftpressstore.com/articles/article.aspx?p=2201303 特别是其中提到 x kernel32 的部分!writeprocessmemory
我找不到方法 kernel32!WriteProcessMemory = 尽管文档提到了它,但我可以找到
kernel32!_imp__WriteProcessMemory 和 kernel32!WriteProcessMemoryStub。我是 windbg 的新手,正在尝试按照教程进行操作,所以我不确定这种方法是否已被弃用,如果是,它的替代品是什么以及我们如何实现类似的功能。
谢谢
导出的 WriteProcessMemory
函数实际上指向 kernel32!WriteProcessMemoryStub
存根,它本身跳转到 kernel32!__imp_WriteProcessMemory
上,后者重定向到 kernelbase
DLL,即 "real" 这个函数的位置。
让我们检查一下 link 转储:
C:>link /dump /exports c:\windows\system32\kernel32.dll | findstr /I WriteProcess
1579 62A 00036C50 WriteProcessMemory
0x36C50 是函数 "WriteProcessMemory" 驻留在 kernel32 中的 RVA(由导出 table 给出)。现在在 windbg 中:
0:007> ln kernel32 + 0x36c50
Browse module
Set bu breakpoint
(00007ff9`4a6e6c50) KERNEL32!WriteProcessMemoryStub | (00007ff9`4a6e6c60) KERNEL32!ZombifyActCtxStub
我们有一个精确匹配,实际上是 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
(位于 kernel32 的 .idata
部分的某处)。
现在,如果我们查看此位置包含的内容,我们有一个指针:
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
的 "real" 位置实际上在 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 sized).
dps(Display Words and Symbols)
:与 dp
相同,但带有符号信息。
我正在尝试按照这里的教程进行操作 https://www.microsoftpressstore.com/articles/article.aspx?p=2201303 特别是其中提到 x kernel32 的部分!writeprocessmemory
我找不到方法 kernel32!WriteProcessMemory = 尽管文档提到了它,但我可以找到 kernel32!_imp__WriteProcessMemory 和 kernel32!WriteProcessMemoryStub。我是 windbg 的新手,正在尝试按照教程进行操作,所以我不确定这种方法是否已被弃用,如果是,它的替代品是什么以及我们如何实现类似的功能。
谢谢
导出的 WriteProcessMemory
函数实际上指向 kernel32!WriteProcessMemoryStub
存根,它本身跳转到 kernel32!__imp_WriteProcessMemory
上,后者重定向到 kernelbase
DLL,即 "real" 这个函数的位置。
让我们检查一下 link 转储:
C:>link /dump /exports c:\windows\system32\kernel32.dll | findstr /I WriteProcess
1579 62A 00036C50 WriteProcessMemory
0x36C50 是函数 "WriteProcessMemory" 驻留在 kernel32 中的 RVA(由导出 table 给出)。现在在 windbg 中:
0:007> ln kernel32 + 0x36c50
Browse module
Set bu breakpoint
(00007ff9`4a6e6c50) KERNEL32!WriteProcessMemoryStub | (00007ff9`4a6e6c60) KERNEL32!ZombifyActCtxStub
我们有一个精确匹配,实际上是 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
(位于 kernel32 的 .idata
部分的某处)。
现在,如果我们查看此位置包含的内容,我们有一个指针:
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
的 "real" 位置实际上在 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 sized).dps(Display Words and Symbols)
:与dp
相同,但带有符号信息。