【问题标题】:Is there a website or tool for parsing, breaking down, and explaining x86 bytecode是否有网站或工具可以解析、分解和解释 x86 字节码
【发布时间】:2020-04-16 18:27:19
【问题描述】:

当您在 https://explainshell.com/ 中键入 shell 命令时,您会得到对该命令的每个部分以及该命令的作用的解释。

有没有一个地方可以让我输入一堆 x86 字节码,然后逐字节解析(可能对某些字节逐位解析)并进行类似解释?

【问题讨论】:

    标签: assembly x86 x86-64 disassembly machine-code


    【解决方案1】:

    反汇编程序会将整个指令解码回 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 所做的反汇编程序。

    【讨论】:

      猜你喜欢
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      相关资源
      最近更新 更多