有没有解析、分解、解释x86字节码的网站或者工具
Is there a website or tool for parsing, breaking down, and explaining x86 bytecode
当您在 https://explainshell.com/ 中键入 shell 命令时,您会得到对命令每个部分的解释以及命令的作用。
有没有一个地方可以让我输入一堆 x86 字节码,然后逐字节解析(对于某些字节可能逐位解析)并进行类似的解释?
反汇编程序会将整个指令解码回 asm。有些会将字节分组为前缀、操作码和后来的东西。例如寻址模式中的 4 字节立即数或位移可以在没有 spaces 的情况下分组,但通过 space.
与操作码分开
Agner Fog 的 objconv 反汇编程序可以做到这一点。 https://www.agner.org/optimize/#objconv
例如在我最近关于 x87 标志的 SO 问题中发现的随机 .o
文件上。请注意,它是一个 .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 for an opcode map. And of course Intel's manuals (which are indexed by mnemonic, not opcode), e.g. HTML extract https://www.felixcloutier.com/x86/
IDK 如果有人构建了您所描绘的在线工具,或者其他可以执行 objconv 操作的反汇编程序。
当您在 https://explainshell.com/ 中键入 shell 命令时,您会得到对命令每个部分的解释以及命令的作用。
有没有一个地方可以让我输入一堆 x86 字节码,然后逐字节解析(对于某些字节可能逐位解析)并进行类似的解释?
反汇编程序会将整个指令解码回 asm。有些会将字节分组为前缀、操作码和后来的东西。例如寻址模式中的 4 字节立即数或位移可以在没有 spaces 的情况下分组,但通过 space.
与操作码分开Agner Fog 的 objconv 反汇编程序可以做到这一点。 https://www.agner.org/optimize/#objconv
例如在我最近关于 x87 标志的 SO 问题中发现的随机 .o
文件上。请注意,它是一个 .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 for an opcode map. And of course Intel's manuals (which are indexed by mnemonic, not opcode), e.g. HTML extract https://www.felixcloutier.com/x86/
IDK 如果有人构建了您所描绘的在线工具,或者其他可以执行 objconv 操作的反汇编程序。