有没有解析、分解、解释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 操作的反汇编程序。