c - 文件的机器代码(可执行)?

标签 c ubuntu portable-executable disassembly machine-code

如何访问可执行文件的机器代码(二进制文件)?

详情

  • 我使用的是 Ubuntu (Linux)
  • 我想访问 .exe 文件(文件遵循 PE 格式)的机器代码(二进制文件)
  • 我正在使用 C 来实现

最佳答案

使用 objdump 和选项 -d 进行反汇编。另一个有用的选项是 -s 来获得一个文件的转储。如果由于某种原因 -d 不起作用,您也可以尝试 -D,这会强制 objdump 反汇编文件,即使它不起作用'它看起来不像包含机器代码。有关详细信息,请参阅 objdump 的联机帮助页。例如,要反汇编和转储 PE 可执行文件 foo.exe 类型:

objdump -sd foo.exe

输出包括两部分。第一部分如下所示:

Contents of section .text:
 401000 33c03905 28944200 0f9fc0c3 558bec51  3.9.(.B.....U..Q
 401010 568bf16a 01684410 4000c706 30024200  V..j.hD.@...0.B.
 401020 ff15b000 420085c0 75158d45 fc68c00e  ....B...u..E.h..
 401030 420050c7 45fc9070 4200e8cd bc01008b  B.P.E..pB.......
 401040 c65ec9c3 837c2404 0575056a 0158eb12  .^...|$..u.j.X..
 401050 ff052894 420033c0 833d2894 4200020f  ..(.B.3..=(.B...
 401060 9cc0c204 00568bf1 e8140000 00f64424  .....V........D$
 401070 08017407 56e88b6f 0000598b c65ec204  ..t.V..o..Y..^..
 401080 00558bec 516a0068 44104000 c7013002  .U..Qj.hD.@...0.
 401090 4200ff15 b0004200 85c07515 8d45fc68  B.....B...u..E.h
 4010a0 c00e4200 50c745fc 90704200 e85bbc01  ..B.P.E..pB..[..
 4010b0 00c9c3e8 48ffffff f6d81bc0 25044000  ....H.......%.@.
 4010c0 80c20c00 e837ffff fff6d81b c0250440  .....7.......%.@
 4010d0 0080c208 00558bec 568b7508 68c58240  .....U..V.u.h..@
 4010e0 00682072 4200ff75 0c8b4e40 68187242  .h rB..u..N@h.rB
 4010f0 00e8d771 00008bc8 e8e87100 008bc8e8  ...q......q.....

这是二进制文件各个部分的转储。第一列是该行的地址,接下来的四列以十六进制表示法显示转储数据,最后一列显示为 ASCII 字符的数据,. 替换了不可打印的字符。

第二部分是这样的:

00401000 <.text>:
  401000:   33 c0                   xor    %eax,%eax
  401002:   39 05 28 94 42 00       cmp    %eax,0x429428
  401008:   0f 9f c0                setg   %al
  40100b:   c3                      ret    
  40100c:   55                      push   %ebp
  40100d:   8b ec                   mov    %esp,%ebp
  40100f:   51                      push   %ecx
  401010:   56                      push   %esi
  401011:   8b f1                   mov    %ecx,%esi
  401013:   6a 01                   push   $0x1
  401015:   68 44 10 40 00          push   $0x401044
  40101a:   c7 06 30 02 42 00       movl   $0x420230,(%esi)
  401020:   ff 15 b0 00 42 00       call   *0x4200b0

这是二进制文件的反汇编。第一列是当前地址,然后是十六进制的指令,最后是对应的助记符。请注意,此部分仅适用于 header 中标记为“包含可执行代码”的部分(对于 PE 文件,这仅适用于文本部分)。如果您不喜欢这种汇编语法(AT&T 语法),请提供 -Mintel 以接收 Intel 语法的输出:

00401000 <.text>:
  401000:   33 c0                   xor    eax,eax
  401002:   39 05 28 94 42 00       cmp    DWORD PTR ds:0x429428,eax
  401008:   0f 9f c0                setg   al
  40100b:   c3                      ret    
  40100c:   55                      push   ebp
  40100d:   8b ec                   mov    ebp,esp
  40100f:   51                      push   ecx
  401010:   56                      push   esi
  401011:   8b f1                   mov    esi,ecx
  401013:   6a 01                   push   0x1
  401015:   68 44 10 40 00          push   0x401044
  40101a:   c7 06 30 02 42 00       mov    DWORD PTR [esi],0x420230
  401020:   ff 15 b0 00 42 00       call   DWORD PTR ds:0x4200b0

另一个有用的工具是 Agner Fog 的 objconvobjdump 相比,它具有对 Windows 二进制文件更有用的选项,并且通常提供更详细的反汇编。

关于c - 文件的机器代码(可执行)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33435556/

相关文章:

laravel - 将 Composer 导出到 Ubuntu 16.04 上的路径

mysql - qt5.1.1 mysql ubuntu QMYSQL驱动未加载

c - sh: 1:/my_path/ompi-1.1/compiler/ompi: 运行 C 程序时权限被拒绝

c - 如何在Makefile中使用ifeq检查头文件是否位于main.c中(vim)

c - 转储内核模块堆栈

c - 关于 char *buffer 和 char buffer[5] 的内存分配

c - 将指向 char 数组的指针传递给函数

c++ - 如何在 C 中读取导入目录表

Windows PE - 如果不在资源中,字符串存储在哪里以及如何存储?

performance - 在客户端计算机上执行第三方编译的程序