我是一个充满矛盾的人,我使用的是 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 中导出的符号之间存在一些技术差异,混淆两者会产生极大的误导,但我想知道它们的不同之处)。