使用WinDbg作为内存转储附加到DLL的样子(例如)
cdb -z %__appdir__%kernel32.dll
它工作正常,现在我可以读取 NT_IMAGE_HEADER 结构
!dh kernel32 -f
为了读取导出表,我使用了下一种技术
dd kernel32+262c; * example of an export table RVA;
第二行第二列中导出函数的数量,并偏移到第三行第一列中导出表的开头。检查
dd kernel32+353c; * example of offset;
...; * take the first address in output;
da kernel32+4ba5
7c804ba5 "ActivateActCtx"
宾果!现在,我们可以一次又一次地使用da
来查看其他导出的函数,但这很糟糕。所以最好使用下一个技巧
? (kernel32+353c); * get hexadecimal address of first exported function;
r? @$t0 = (int *)0x7c80353c; * set the pointer on that address into pseudo-register;
.for (r @$t1 = 0; @$t1 < 3ba; r @$t1 = @$t1 + 1) {da kernel32+(@@c++(@$t0[@$t1]));}
我怎么了?目前,我正在尝试读取导入的函数,但是当我键入
dps kernel32 + 1000
其中1000
是Import Address Table Directory
的RVA,我只有部分名称地址,而不是名称。那么,如何获得导入函数的所有名称的列表?有没有最简单的方法,还是我应该再写一个循环?周期应该如何?
答案 0 :(得分:0)
cdb -z用于加载转储文件
使用它们来加载二进制文件有几个副作用
并可能包括不加载属于导入表的页面
导入表填满需要加载程序进行交互以解析导入地址
当您将二进制文件作为转储文件加载时,没有其他模块随其一起加载
但是转储文件包含有关模块流中所需的其他dll的信息
因此,当您尝试从已卸载的内存区域读取一些数据时,
您会看到??? (问号)
实际上windbg具有三个可用于此目的的bang命令
他们是
!showexports { address / mod }
!showimports { address / mod }
!showresources { address / mod }
!showimports命令也不适用于以转储方式加载的二进制文件 (cdb可能在尝试ReadARange和iirc时挂起,我很早以前就寄给了windbg团队 (在6.0或xp时代),但在17763 windbg中出现了相同的挂起状态,该挂起时间为发布日期
如果您加载实际的转储而不是将二进制文件作为转储
,则按照您描述的方式进行的阅读工作会更好地工作确认您可以使用!vadump命令,您将看到cdb已映射 导入表大小后的页面
C:\>cdb -c "!dh kernel32;q" -z c:\Windows\System32\kernel32.dll | grep -i "Import.*Address"
1000 [ DFC] address [size] of Import Address Table Directory
C:\>cdb -c "dd kernel32+1df0;q" -z c:\Windows\System32\kernel32.dll
Microsoft (R) Windows Debugger Version 10.0.16299.15 X86
Loading Dump File [c:\Windows\System32\kernel32.dll]
0:000> cdb: Reading initial command 'dd kernel32+1df0;q'
77de1df0 ???????? ???????? ???????? 90909090 <<<<<<<<<<<<<
77de1e00 90909090 90909090 90909090 90909090
quit:
C:\>cdb -c "!vadump;q" -z c:\Windows\System32\kernel32.dll
Microsoft (R) Windows Debugger Version 10.0.16299.15 X86
Loading Dump File [c:\Windows\System32\kernel32.dll]
0:000> cdb: Reading initial command '!vadump;q'
BaseAddress: 77de0000
RegionSize: 00001000
BaseAddress: 77de1dfc <<<<<<<<<<<<<<<
RegionSize: 000c4204
BaseAddress: 77ea6000
RegionSize: 00001000
BaseAddress: 77ea7000
RegionSize: 00001000
BaseAddress: 77ea8000
RegionSize: 0000c000
quit: