在汇编中,如何在调试器的3字节空间中添加5字节指令

use*_*465 1 x86 assembly

我正试图改变这一行

0041DE91 | 8B 46 64                 | mov eax,dword ptr ds:[esi+64]  
0041DE94 | 83 C4 0C                 | add esp,C                                   
0041DE97 | 83 F8 01                 | cmp eax,1                                   
Run Code Online (Sandbox Code Playgroud)

0041DE91 |  mov eax, 10
Run Code Online (Sandbox Code Playgroud)

但是3个字节的指令占用5个字节并溢出到它下面的两个地址:

0041DE91 | B8 0A 00 00 00           | mov eax,10                                    
0041DE96 | 0C 83                    | or al,83                                    
0041DE98 | F8                       | clc                                    
Run Code Online (Sandbox Code Playgroud)

是否可以在调试器中对预编译的程序执行此操作?

Pet*_*des 5

在32位代码中(没有到clobber)你可以用3个字节将imm8常量移动到寄存器(效率低下):

push   10       ; 2B
pop    eax      ; 1B
Run Code Online (Sandbox Code Playgroud)

你也可以1进入3B的注册

xor    eax, eax  ; 2B
inc    eax       ; 1B
Run Code Online (Sandbox Code Playgroud)

或者,给定已知内容的任何其他注册:

lea    eax, [ecx+/-imm8]   ; 3B
Run Code Online (Sandbox Code Playgroud)

其他代码 - 高尔夫/代码大小优化技巧:

xor    eax,eax   ; 2B
cdq              ; 1B to zero edx as well
Run Code Online (Sandbox Code Playgroud)

xchg   eax, ecx  ; 1B.  Shorter than MOV if you want ecx=eax and can trash eax (or both parts are actually useful)
Run Code Online (Sandbox Code Playgroud)

其中许多也适用于16位和64位代码.例如,请参阅3286 x86-64机器代码中的adler32和x86-16版本.