给定一个二进制文件并且仅使用ndisasm之类的工具,如何找到main()吗? >

评论

我相信我已经在以下问题的答案中给出了该问题的答案:反转ELF 64位LSB可执行文件x86-64,gdb。如果您错过了某些内容,可以随时修改您的问题以询问更多详细信息。

@perror这是一个很棒的答案。当人们甚至不注意您为他们提供的帮助时,这是一种耻辱。

您要处理什么平台/操作系统/编译器?给我们一些具体的例子。

@perror很好的答案。在Windows中会有很大区别吗?另外,如果没有这些信息,就不可能告诉入口点吗?

是的,那将是非常不同的。实际上,我在此答案中描述的是绑定到gcc编译器。因此,如果您考虑使用其他编译器,则布局可能会完全不同。但是,如果要在MS-Windows上下文中查找主要功能,则需要编辑问题以指定它。这将有助于获得更准确的答案。

#1 楼

这是非常棘手的,需要大量的耐心。我在这里假定您正在尝试查找在C中定义的main函数,而不是它作为程序的入口点。用眼睛和大脑扫描代码很难找到所需的内容。但这是一种方法。您可以做的是先检查您要反汇编的二进制文件的标头。在下面的随机文件中,您将找到readelf -h的输出。如果文件没有损坏(有意或无意),您将能够找到入口点地址。

  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x400440
  Start of program headers:          64 (bytes into file)
  Start of section headers:          4680 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         8
  Size of section headers:           64 (bytes)
  Number of section headers:         35
  Section header string table index: 32


该地址通常指向将在运行时执行的第一块代码的位置(_start函数),并将处理main函数参数(或命令行参数),然后再调用main函数。另一种技术是在调试器(例如GDB)下运行您的程序,然后逐步进行。由于它们包含ctordtor表,它们包含指向在main函数之前和之后执行的函数的指针,因此更为复杂。在处理静态链接的二进制文件时,还会出现一些未记录的怪异现象。当然,其他程序也可以不用main函数就可以调用它们所需的任何函数。