Binary Patching — изменение существующих инструкций и сохранение выравнивания машинного кода.

Я хотел бы отредактировать первую инструкцию и изменить ее на jmp 100h (плюс-минус несколько байтов), mov edi,edi занимает 2 байта, а jmp 100h занимает 5 байтов (поправьте меня, если я ошибаюсь)

Я редактирую машинный код на jmp 100h и добавляю nop, чтобы округлить его до 6 байтов.

.text:08048DD5                 mov     edi, edi
.text:08048DD7                 mov     edi, edi
.text:08048DD9                 mov     edi, edi
.text:08048DDB                 mov     edi, edi
.text:08048DDD                 mov     edi, edi
.text:08048DDF                 mov     edi, edi
.text:08048DE1                 mov     edi, edi
.text:08048DE3                 mov     edi, edi
.text:08048DE5                 add     [ebp+var_C], 1  ; Add
.text:08048DE9                 mov     eax, offset format ; "Message %d: %s"
.text:08048DEE                 lea     edx, [ebp+s]    ; Load Effective Address
.text:08048DF4                 mov     [esp+8], edx

результат выглядит так:

.text:08048DD5                 jmp     loc_8048D41
.text:08048DD5 ; ---------------------------------------------------------------------------
.text:08048DDA                 db 90h
.text:08048DDB                 db 89h, 0FFh
.text:08048DDD                 db 89h, 0FFh
.text:08048DDF                 db 89h, 0FFh
.text:08048DE1                 db 89h, 0FFh
.text:08048DE3                 db 89h, 0FFh
.text:08048DE5 ; ---------------------------------------------------------------------------
.text:08048DE5                 add     [ebp+var_C], 1
.text:08048DE9                 mov     eax, offset aMessageDS ; "Message %d: %s"
.text:08048DEE                 lea     edx, [ebp+s]
.text:08048DF4                 mov     [esp+8], edx
.text:08048DF8                 mov     edx, [ebp+var_C]

что именно здесь не так? Как сохранить остальную часть кода нетронутой?


person aviran    schedule 18.07.2013    source источник


Ответы (1)


Вроде работает, но дизассемблер не интерпретирует данные как инструкции. Вероятно, это из-за предыдущей инструкции jmp - дизассемблер видит, что код сразу после него никогда не будет достигнут, поэтому он предполагает, что это не код (и, таким образом, интерпретирует его как прямые данные).

person Drew McGowen    schedule 18.07.2013
comment
90h — это nop, а 89h, 0FFh — это mov edi, edi, так что да, все работает правильно. - person FrankH.; 18.07.2013