使用 objdump 在 DLL 中查找导出的符号?

逆向工程 拆卸 dll 转储
2021-07-07 04:27:34

我是一个充满矛盾的人,我使用的是 Unix,然而,我想分析一个 Microsoft Windows DLL。

通常情况下,寻找在ELF世界动态或静态库符号时,一个既可以使用nm或者readelf甚至objdump这是一个示例objdump

$ objdump -tT /usr/lib/libcdt.so

/usr/lib/libcdt.so:     file format elf64-x86-64

SYMBOL TABLE:
no symbols

DYNAMIC SYMBOL TABLE:
0000000000000cc8 l    d  .init  0000000000000000              .init
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 free
0000000000000000  w   D  *UND*  0000000000000000              _ITM_deregisterTMCloneTable
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 memcmp
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strcmp
0000000000000000  w   D  *UND*  0000000000000000              __gmon_start__
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 malloc
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 realloc
0000000000000000  w   D  *UND*  0000000000000000              _Jv_RegisterClasses
0000000000000000  w   D  *UND*  0000000000000000              _ITM_registerTMCloneTable
0000000000000000  w   DF *UND*  0000000000000000  GLIBC_2.2.5 __cxa_finalize
0000000000000ec0 g    DF .text  0000000000000097  Base        dtclose
0000000000204af8 g    DO .data  0000000000000008  Base        Dtorder
0000000000204af0 g    DO .data  0000000000000008  Base        Dttree
... cut ...

所以,我们已经从读取这个动态库中导出了所有函数名。但是,让我们用 DLL 试试:

$ objdump -tT SE_U20i.dll 

SE_U20i.dll:     file format pei-i386

objdump: SE_U20i.dll: not a dynamic object
SYMBOL TABLE:
no symbols

DYNAMIC SYMBOL TABLE:
no symbols

如您所见,objdump无法从 DLL 中提取导出的符号(也是如此nm)。但是,如果我能看到更多的东西,如果我这样做:

$ objdump -p SE_U20i.dll

SE_U20i.dll:     file format pei-i386

Characteristics 0xa18e
    executable
    line numbers stripped
    symbols stripped
    little endian
    32 bit words
    DLL
    big endian

... clip ...

There is an export table in .edata at 0x658000

The Export Tables (interpreted .edata section contents)

Export Flags                    0
Time/Date stamp                 0
Major/Minor                     0/0
Name                            0025803c SE_U20i.dll
Ordinal Base                    1
Number in:
    Export Address Table            00000002
    [Name Pointer/Ordinal] Table    00000002
Table Addresses
    Export Address Table            00258028
    Name Pointer Table              00258030
    Ordinal Table                   00258038

Export Address Table -- Ordinal Base 1
    [   0] +base[   1] 23467c Export RVA
    [   1] +base[   2] 233254 Export RVA

[Ordinal/Name Pointer] Table
    [   0] DoResurrection
    [   1] Initialize

... clip ...

因此,导出表似乎是我们正在寻找的(不确定)。但它淹没在许多其他信息中(选项-p显示真的很多行)。

那么,首先,导出表是我正在寻找的,以了解 DLL 导出的函数和变量是什么?

其次,为什么objdump在 ELF 和 PE 的情况下显示不同的导出符号?(我想 ELF 和 PE 中导出的符号之间存在一些技术差异,混淆两者会产生极大的误导,但我想知道它们的不同之处)。

1个回答

对我来说令人惊讶的部分是objdump可以识别PE 文件中的任何内容根据维基百科

.. PE 是 Unix COFF 文件格式的修改版本。PE/COFF 是 Windows 开发中的一个替代术语。

所以显然标题中有足够的重叠以使其工作(至少部分)。一个的基本设计显然是建立在另一个的基础上的,但之后它们分别进化了。在这个时间点找到确切的差异很可能是一个纯粹的学术练习。

是的:在 DLL 中,导出目录就是您要查找的目录这是Dependency Walker检查的屏幕截图comctl32.dll(使用 VirtualBox,因为我在 Mac 上):

Dependency Walker 显示导出

“E^”字段列出了导出的函数名称和其他有趣的细节。

如果您使用 Python:pefile已被提及为可以访问 PE 部分的库,但是 PE 已经存在了很长时间,对其所有标头和结构的所有血腥低级细节的良好描述永无止境。上次我觉得检查一些 Windows 程序时,我使用这些描述从头开始编写了一整套 PE 导入/导出 C 例程(..再次,我应该添加 - 这样我可以返回我想要的确切数据完全符合要求的格式)。

IDA Pro 似乎是大多数反汇编作业的首选实用程序,上次我使用它时,它在加载导入和导出目录方面做得很好,尽管它没有提供所有功能的简明列表。