通常,当在ELF World中的动态或静态库中寻找符号时,可以使用
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
无法从DLL中提取导出的符号(nm
也是如此)。但是,如果我可以看到更多内容,请执行以下操作:$ 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
因此,导出表似乎是我们正在寻找的(不确定) 。但是它淹没在许多其他信息中(选项
-p
确实显示了很多行)。所以,首先,我要查找的导出表是什么,它的作用是其次,为什么在ELF和PE的情况下
objdump
呈现的导出符号不同? (我猜想ELF和PE中的导出符号之间存在一些技术差异,并且混淆二者会极具误导性,但我想知道它们的不同之处。)#1 楼
对我来说,令人惊讶的部分是objdump
可以识别PE文件中的任何内容。根据Wikipedia的说法,PE是Unix COFF文件格式的修改版本。 PE / COFF是Windows开发中的另一个术语。因此很显然,标头中有足够多的重叠以使其(至少部分地)起作用。一个的基本设计显然是基于另一个的,但此后它们是分别发展的。在此时找到确切的差异很可能只是一项纯学术研究。
是的:在DLL中,您正在寻找导出目录。这是Dependency Walker检查
comctl32.dll
(使用VirtualBox的原因,因为我在Mac上)的抓屏:字段“ E ^”列出了导出的函数名称和其他有趣的细节。
如果您使用Python:提到
pefile
是一个可以访问PE部件的库,但是PE又来了很久,没有很多好的说明。所有标题和结构的所有底层细节。上一次我感觉要检查一些Windows程序时,我使用这些描述从头开始编写了一整套PE导入/导出C例程(..再次,我应该添加-这样我就可以将其返回想要的确切数据了)正是所需的格式)。IDA Pro似乎是大多数拆卸工作的首选实用工具,上次我使用它可以很好地加载Import和Export目录,尽管它并没有不能提供所有功能的简明清单。
评论
实际上,我没有“常规” binutils软件包。我用所有目标重建它。这可以解释为什么objdump可以识别PE文件中的一些内容。但是,对PE的支持确实非常简单。无论如何,非常感谢您的回答。这给了我很多合作的起点!
–恐怖
13年11月29日在16:55
评论
跨站点重复,此处给出了winedump的答案:stackoverflow.com/a/32310685/103167