дизассемблер Агнера Фога , objconv
, это довольно мило. Он добавит комментарии к выводу разборки для проблем с производительностью (например, например, из-за страшного зависания LCP из инструкций с 16-битными непосредственными константами).
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, а не с помощью hex-редактора машинного кода. (Таким образом, вы не ограничены тем, чтобы держать вещи одинакового размера.) Без изменений результат должен быть почти одинаковым. Это может быть не так, потому что разборка таких вещей, как
(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 binutils objdump -Mintel -d
очень удобен в использовании и уже будет установлен, если у вас обычная настройка Linux gcc.