首页 > 解决方案 > 从 DLL 获取导入表

问题描述

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

1000RVA 在哪里Import Address Table Directory?我只有部分姓名地址,没有姓名。那么,如何获取导入函数的所有名称的列表?有没有最简单的方法或者我应该再写一个循环?循环应该是什么样子?

标签: windowsdllx86reverse-engineeringwindbg

解决方案


cdb -z 用于加载转储文件
使用它们加载二进制文件有几个副作用
,可能包括不加载属于导入表的页面
导入表填充 需要加载器交互以解析导入地址

当您将二进制文件作为转储文件加载时,不会同时加载其他模块,
但转储文件包含有关模块流中所需的其他 dll 的信息

因此,当您尝试从未加载的内存区域读取一些数据时,您会看到
??? (问号)

实际上,windbg 有三个 bang 命令,您可以使用它们来达到目的

他们是
!showexports { address / mod } !showimports { address / mod } !showresources { address / mod }

!showimports 命令也不适用于作为转储加载的二进制文件(cdb 可能会挂起尝试 ReadARange 和 iirc 我很久以前(在 6.0 或 xp 时代)向 windbg 团队发送了一封邮件,但同样的挂起出现在 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:

推荐阅读