给定一个二进制文件并且只使用像 一样的工具ndisasm
,我怎样才能找到main()
?我不想使用像 IDA Pro 这样的智能工具,因为我正在做这个练习来学习。
如何在二进制中找到 main()?
逆向工程
拆卸
2021-07-09 21:52:43
1个回答
这非常棘手,需要很大的耐心。我在这里假设您正在尝试查找main
在 C 中定义的函数,而不是作为程序的入口点。用你的眼睛和大脑扫描代码很难找到你要找的东西。但这里有一个方法。您可以做的是首先检查您尝试反汇编的二进制文件的标题。您将在下面找到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)下运行您的程序并逐步进行。
不过,我必须警告你,如果你正在处理 ELF 二进制文件,事情可能会变得更加复杂,因为它们包含ctor
和包含dtor
指向在函数之前和之后执行的函数的指针的表main
。在处理静态链接的二进制文件时,您还会遇到一些未记录的奇怪现象。当然,其他程序可以在没有main
函数的情况下凑合着调用它们想要的任何东西。
其它你可能感兴趣的问题