【问题标题】:Getting import table from DLL从 DLL 获取导入表
【发布时间】:2018-12-26 07:51:26
【问题描述】:

使用 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 我只有部分姓名地址,没有姓名。那么,如何获取导入函数的所有名称的列表?有没有最简单的方法或者我应该再写一个循环?循环应该是怎样的?

【问题讨论】:

    标签: windows dll x86 reverse-engineering windbg


    【解决方案1】:

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

    当您将二进制文件作为转储文件加载时,不会同时加载其他模块
    但转储文件包含有关模块流中所需的其他 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:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2013-08-17
      相关资源
      最近更新 更多