如何在二进制中找到 main()?

逆向工程 拆卸
2021-07-09 21:52:43

给定一个二进制文件并且只使用像 一样的工具ndisasm,我怎样才能找到main()我不想使用像 IDA Pro 这样的智能工具,因为我正在做这个练习来学习。

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函数的情况下凑合着调用它们想要的任何东西。