linux 反汇编文件解析,如何在Linux中反汇编二进制可执行文件以获取汇编代码?...

此答案特定于x86。可拆卸AArch64,MIPS或任何包含objdump和的机器代码的便携式工具llvm-objdump。

昂纳雾的反汇编器,objconv是相当不错的。它将在反汇编输出中添加有关性能问题的注释(例如,具有16位立即数的指令中可怕的LCP停顿)。

objconv -fyasm a.out /dev/stdout | less

(它不被认为-是stdout的简写,默认情况下是将其输出到与输入文件名称相似的文件中,并附加上.asm。)

它还将分支目标添加到代码中。其他反汇编程序通常仅使用数字目标来反汇编跳转指令,并且不要在分支目标上放置任何标记来帮助您找到循环的顶部,等等。

它还比其他反汇编程序更清楚地指示NOP(使它们在填充时清晰可见,而不是仅作为另一条指令来分解。)

它是开源的,易于为Linux编译。它可以分解为NASM,YASM,MASM或GNU(AT&T)语法。

样本输出:

; Filling space: 0FH

; Filler type: Multi-byte NOP

; db 0FH, 1FH, 44H, 00H, 00H, 66H, 2EH, 0FH

; db 1FH, 84H, 00H, 00H, 00H, 00H, 00H

ALIGN 16

foo: ; Function begin

cmp rdi, 1 ; 00400620 _ 48: 83. FF, 01

jbe ?_026 ; 00400624 _ 0F 86, 00000084

mov r11d, 1 ; 0040062A _ 41: BB, 00000001

?_020: mov r8, r11 ; 00400630 _ 4D: 89. D8

imul r8, r11 ; 00400633 _ 4D: 0F AF. C3

add r8, rdi ; 00400637 _ 49: 01. F8

cmp r8, 3 ; 0040063A _ 49: 83. F8, 03

jbe ?_029 ; 0040063E _ 0F 86, 00000097

mov esi, 1 ; 00400644 _ BE, 00000001

; Filling space: 7H

; Filler type: Multi-byte NOP

; db 0FH, 1FH, 80H, 00H, 00H, 00H, 00H

ALIGN 8

?_021: add rsi, rsi ; 00400650 _ 48: 01. F6

mov rax, rsi ; 00400653 _ 48: 89. F0

imul rax, rsi ; 00400656 _ 48: 0F AF. C6

shl rax, 2 ; 0040065A _ 48: C1. E0, 02

cmp r8, rax ; 0040065E _ 49: 39. C0

jnc ?_021 ; 00400661 _ 73, ED

lea rcx, [rsi+rsi] ; 00400663 _ 48: 8D. 0C 36

...

请注意,此输出已准备好组装回目标文件,因此您可以在asm源代码级别调整代码,而不必在机器代码上使用十六进制编辑器。(因此,您不限于保持相同的大小。)不做任何更改,结果应该几乎相同。但是,由于诸如

(from /lib/x86_64-linux-gnu/libc.so.6)

SECTION .plt align=16 execute ; section number 11, code

?_00001:; Local function

push qword [rel ?_37996] ; 0001F420 _ FF. 35, 003A4BE2(rel)

jmp near [rel ?_37997] ; 0001F426 _ FF. 25, 003A4BE4(rel)

...

ALIGN 8

?_00002:jmp near [rel ?_37998] ; 0001F430 _ FF. 25, 003A4BE2(rel)

; Note: Immediate operand could be made smaller by sign extension

push 11 ; 0001F436 _ 68, 0000000B

; Note: Immediate operand could be made smaller by sign extension

jmp ?_00001 ; 0001F43B _ E9, FFFFFFE0

源代码中没有任何内容可确保将其组装为更长的编码,从而为重定位留有空间以32位偏移量对其进行重写。

如果您不想将其安装为objconv,则GNU binutilsobjdump -Mintel -d非常有用,如果您具有正常的Linux gcc设置,则已经安装了GNU binutils 。

你可能感兴趣的:(linux,反汇编文件解析)