从DLL

时间:2018-12-26 07:51:27

标签: windows dll x86 reverse-engineering windbg

使用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

其中1000Import Address Table Directory的RVA,我只有部分名称地址,而不是名称。那么,如何获得导入函数的所有名称的列表?有没有最简单的方法,还是我应该再写一个循环?周期应该如何?

1 个答案:

答案 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: