[在https://explainshell.com/中键入shell命令时,将获得该命令各部分的说明以及该命令的作用。
有没有地方我可以输入一堆x86字节码,并逐字节解析(对于某些字节可能逐位解析,并以类似的方式解释?
反汇编程序会将整个指令解码回asm。有些人会将字节分组为前缀,操作码和后续内容。例如在寻址模式下,一个4字节立即数或移位数可能被分组为没有空格,但与操作码之间用空格隔开。
Agner Fog的objconv反汇编程序完成了该任务。 https://www.agner.org/optimize/#objconv
例如在一个随机的.o
文件中,我遇到了最近关于x87标志的SO问题。请注意,它是一个.o
,因此地址基于每个部分中的0
。
[更重要的是,不是fld dword [value1]
的机器代码显示为D9
(操作码),05
(对寻址模式进行编码的ModRM字节,在这种情况下表示存在4字节的位移) ,00000000
带有(d)音符,表示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以获取操作码映射。当然还有Intel的手册(按助记符而不是操作码索引),例如HTML提取https://www.felixcloutier.com/x86/
IDK,如果有人构建了您正在绘制的在线工具,或者其他可完成objconv的反汇编程序。