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

通常,当在ELF World中的动态或静态库中寻找符号时,可以使用nmreadelf甚至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中的导出符号之间存在一些技术差异,并且混淆二者会极具误导性,但我想知道它们的不同之处。)

评论

跨站点重复,此处给出了winedump的答案:stackoverflow.com/a/32310685/103167

#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