Есть ли веб-сайт или инструмент для анализа, разбивки и объяснения байт-кода x86? - PullRequest
2 голосов
/ 16 апреля 2020

Когда вы вводите команду оболочки в https://explainshell.com/, вы получаете объяснение каждой части команды и ее действия.

Есть ли место, где я мог бы набрать в связке байт-кода x86, и разбирал ли он его побайтно (и, возможно, побитно для определенных байтов) и объяснял аналогично?

1 Ответ

2 голосов
/ 16 апреля 2020

дизассемблеры будут декодировать все инструкции обратно в asm. Некоторые сгруппируют байты в префиксы, код операции и более поздние данные . например, 4-байтовое немедленное или смещение в режиме адресации может быть сгруппировано без пробелов, но отделено от кода операции пробелом.

Это делает дизассемблер Agner Fog objconv. https://www.agner.org/optimize/#objconv

например, в случайном файле .o, который я обнаружил в недавнем вопросе SO о флагах x87. Обратите внимание, что это .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]

Некоторые коды операций не имеют модема (например, mov reg, imm32), многие не имеют немедленного (например, add r32, r/m32), некоторые имеют оба (например, add r/m32, imm8), некоторые не имеют ни одного (например, lodsb или cdq).

см. http://ref.x86asm.net/coder64.html для карты кода операции. И, конечно, руководства Intel (которые индексируются mnemoni c, а не кодом операции), например, HTML extract https://www.felixcloutier.com/x86/

IDK, если кто-то создал такой онлайн-инструмент, как вы изображения или другие дизассемблеры, которые делают то, что делает objconv.

...