【发布时间】:2020-04-16 18:27:19
【问题描述】:
当您在 https://explainshell.com/ 中键入 shell 命令时,您会得到对该命令的每个部分以及该命令的作用的解释。
有没有一个地方可以让我输入一堆 x86 字节码,然后逐字节解析(可能对某些字节逐位解析)并进行类似解释?
【问题讨论】:
标签: assembly x86 x86-64 disassembly machine-code
当您在 https://explainshell.com/ 中键入 shell 命令时,您会得到对该命令的每个部分以及该命令的作用的解释。
有没有一个地方可以让我输入一堆 x86 字节码,然后逐字节解析(可能对某些字节逐位解析)并进行类似解释?
【问题讨论】:
标签: assembly x86 x86-64 disassembly machine-code
反汇编程序会将整个指令解码回 asm。有些人会将字节分组为前缀、操作码和后面的东西。例如寻址模式中的 4 字节立即数或位移可以不带空格进行分组,但与操作码之间用空格隔开。
Agner Fog 的 objconv 反汇编器可以做到这一点。 https://www.agner.org/optimize/#objconv
例如在一个随机的.o 文件上,我从最近的一个关于 x87 标志的 SO 问题中躺着。请注意,它是.o,因此每个部分的地址都基于0。
更重要的是,fld dword [value1] 的机器代码不是如何显示为D9(操作码)、05(编码寻址模式的 ModRM 字节,在这种情况下表示存在 4 字节位移),以及带有 (d) 注释的 00000000,显示 4 字节 disp32。
;; Produced with
;; objconv -fnasm fcomtest.o /dev/stdout
global _start
SECTION .text align=1 execute ; section number 1, code
_start: ; Function begin
fld dword [value1] ; 0000 _ D9. 05, 00000000(d)
fcom dword [value2] ; 0006 _ D8. 15, 00000004(d)
fwait ; 000C _ 9B
fnstsw ax ; 000D _ DF. E0
pushfd ; 000F _ 9C
sahf ; 0010 _ 9E
pushfd ; 0011 _ 9C
ja greater ; 0012 _ 77, 0E
jc lessthan ; 0014 _ 72, 18
mov eax, 1 ; 0016 _ B8, 00000001
mov ebx, 0 ; 001B _ BB, 00000000
int -128 ; 0020 _ CD, 80
greater:mov eax, 1 ; 0022 _ B8, 00000001
mov ebx, 2 ; 0027 _ BB, 00000002
int -128 ; 002C _ CD, 80
lessthan:
mov eax, 1 ; 002E _ B8, 00000001
mov ebx, 1 ; 0033 _ BB, 00000001
; Note: Function does not end with ret or jmp
int -128 ; 0038 _ CD, 80
; _start End of function
SECTION .data align=1 noexecute ; section number 2, data
value1: ; dword
dd 412EC49CH ; 0000 _ 10.923
value2: dd 4091B3D0H ; 0004 _ 4.5531998
可能有一种方法可以在一块原始字节上运行objconv,而不是在.o 中,或者如果没有,你可以将它放在一个中。
x86机器码的整体结构相当固定:
[prefixes ...] opcode [modrm [sib] [disp0/8/32]] [imm8/16/32]
有些操作码没有 modrm(例如mov reg, imm32),许多没有立即数(例如add r32, r/m32),有些两者都有(例如add r/m32, imm8),有些都没有(例如lodsb,或cdq) .
查看http://ref.x86asm.net/coder64.html 获取操作码映射。当然还有英特尔的手册(由助记符索引,而不是操作码),例如HTML 提取https://www.felixcloutier.com/x86/
IDK,如果有人构建了一个在线工具,就像你正在想象的那样,或者其他做 objconv 所做的反汇编程序。
【讨论】: