ndisasm
之类的工具,如何找到main()
吗? >#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)下运行您的程序,然后逐步进行。由于它们包含ctor
和dtor
表,它们包含指向在main
函数之前和之后执行的函数的指针,因此更为复杂。在处理静态链接的二进制文件时,还会出现一些未记录的怪异现象。当然,其他程序也可以不用main
函数就可以调用它们所需的任何函数。
评论
我相信我已经在以下问题的答案中给出了该问题的答案:反转ELF 64位LSB可执行文件x86-64,gdb。如果您错过了某些内容,可以随时修改您的问题以询问更多详细信息。@perror这是一个很棒的答案。当人们甚至不注意您为他们提供的帮助时,这是一种耻辱。
您要处理什么平台/操作系统/编译器?给我们一些具体的例子。
@perror很好的答案。在Windows中会有很大区别吗?另外,如果没有这些信息,就不可能告诉入口点吗?
是的,那将是非常不同的。实际上,我在此答案中描述的是绑定到gcc编译器。因此,如果您考虑使用其他编译器,则布局可能会完全不同。但是,如果要在MS-Windows上下文中查找主要功能,则需要编辑问题以指定它。这将有助于获得更准确的答案。