是否有用于解析,分解和解释x86字节码的网站或工具

问题描述 投票:0回答:1

[在https://explainshell.com/中键入shell命令时,将获得该命令各部分的说明以及该命令的作用。

有没有地方我可以输入一堆x86字节码,并逐字节解析(对于某些字节可能逐位解析,并以类似的方式解释?

assembly x86 x86-64 disassembly machine-code
1个回答
0
投票

反汇编程序会将整个指令解码回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),有些没有(例如lodsbcdq)。

请参见http://ref.x86asm.net/coder64.html以获取操作码映射。当然还有Intel的手册(按助记符而不是操作码索引),例如HTML提取https://www.felixcloutier.com/x86/

IDK,如果有人构建了您正在绘制的在线工具,或者其他可完成objconv的反汇编程序。

© www.soinside.com 2019 - 2024. All rights reserved.