文件的机器代码(可执行)?
Machine code of file (executable)?
如何访问可执行文件的机器代码(二进制文件)?
详情
- 我在 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 [=12=]x1
401015: 68 44 10 40 00 push [=12=]x401044
40101a: c7 06 30 02 42 00 movl [=12=]x420230,(%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 的 objconv,它具有对 Windows 二进制文件更有用的选项,并且与 objdump
相比通常提供更详细的反汇编。
源代码和机器码不一样。
如果你安装了"binutils",你可以使用objdump
:
$ objdump --disassemble my-fantastic-program > my-fantastic-program.asm
这将转储my-fantastic-program
的汇编代码,当然此时程序是用什么语言编写的并不重要。
带有 >
的部分使用 shell 输出重定向将结果保存在新文件中。
如何访问可执行文件的机器代码(二进制文件)?
详情
- 我在 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 [=12=]x1
401015: 68 44 10 40 00 push [=12=]x401044
40101a: c7 06 30 02 42 00 movl [=12=]x420230,(%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 的 objconv,它具有对 Windows 二进制文件更有用的选项,并且与 objdump
相比通常提供更详细的反汇编。
源代码和机器码不一样。
如果你安装了"binutils",你可以使用objdump
:
$ objdump --disassemble my-fantastic-program > my-fantastic-program.asm
这将转储my-fantastic-program
的汇编代码,当然此时程序是用什么语言编写的并不重要。
带有 >
的部分使用 shell 输出重定向将结果保存在新文件中。