windows - 从 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
1000
RVA 在哪里Import Address Table Directory
?我只有部分姓名地址,没有姓名。那么,如何获取导入函数的所有名称的列表?有没有最简单的方法或者我应该再写一个循环?循环应该是什么样子?
解决方案
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:
推荐阅读
- c++ - 反向传播权重调整功能不起作用
- jquery - 对复选框使用“全选”时进行 Ajax 调用
- c++ - 为无尽的跑步游戏生成和销毁对象的最有效方法?
- javascript - 将日期转换为 Unix 时间戳时,moment.js 未考虑年份
- rust - “如果不可变或引用则克隆”的 Rust 习语
- python - AttributeError:“元组”对象没有属性“ndim”
- machine-learning - 训练 Yolo 用已经裁剪的图像检测我的自定义对象
- c# - WPF MultiBinding with and 条件 & 嵌套 or 条件
- python - 绘制 GPS 坐标
- c# - 调用 #if 中的函数