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

Agner Fog的反汇编者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,GNUbinutilsobjdump -Mintel -d非常实用,如果你有一个正常的Linux gcc设置,它已经安装好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值