Debugging 反向工程:在不覆盖指令的情况下更改AL寄存器

Debugging 反向工程:在不覆盖指令的情况下更改AL寄存器,debugging,assembly,executable,reverse-engineering,x86-64,Debugging,Assembly,Executable,Reverse Engineering,X86 64,我试图通过调试和修补64位windows可执行文件来了解更多有关反向工程的知识。我使用的是x64dbg(很像ollydbg,但支持64位) 我有一个大致如下的组件: call test_exe.44AA9EB20 mov byte ptr ds:[44AB9DA15], al [More instructions...] [More instructions...] [More instructions...] call test_exe.44AA9EB20 mov byte ptr ds:[

我试图通过调试和修补64位windows可执行文件来了解更多有关反向工程的知识。我使用的是x64dbg(很像ollydbg,但支持64位)

我有一个大致如下的组件:

call test_exe.44AA9EB20
mov byte ptr ds:[44AB9DA15], al
[More instructions...]
[More instructions...]
[More instructions...]
call test_exe.44AA9EB20
mov byte ptr ds:[44AB9DA15], 1
第一行中的函数调用将rax寄存器的值设置为0。因此,第二行是将值0移动到44AB9DA15处的指针中

我想重新组合一些代码,以便将值1放入这个指针

我可以这样做:

call test_exe.44AA9EB20
mov byte ptr ds:[44AB9DA15], al
[More instructions...]
[More instructions...]
[More instructions...]
call test_exe.44AA9EB20
mov byte ptr ds:[44AB9DA15], 1
然而,由于al只是一个8位寄存器,因此将代码组装到上面的代码似乎会在后续的一些指令中运行

我知道我可以通过进入函数调用test_exe.44AA9EB20并在ret指令之前将rax设置为1来解决这个问题,但我想知道是否有更简单的方法


有没有什么方法可以给这个指针(44AB9DA15)一个值1,而不必运行后续指令?

您想替换编码为880425DAB94A(7字节)的MOV[0x000000044AB9DA15]AL 使用MOV字节PTR[0x000000044AB9DA15],1编码为C6042515DAB94A01(长一个字节)。 尝试使用RIP相对编码。首先计算目标指针和偏移量之间的差值 以下指令的大小($+指令大小)。如果小于2GB,例如0x11223344, MOV BYTE PTR REL[0x000000044AB9DA15-$-7]的编码将是C6054433221101(正好是7个字节)

或者,如果不需要调用test_exe,则使用将AL设置为1的代码覆盖调用指令,
e、 g.MOV AL,1,并用NOP

填充剩余的四个字节。您应该尝试在反向工程堆栈交换站点上发布此问题:有时您必须看得比单个指令更宽,并考虑用不同的指令集替换一小段指令。也就是说,你能展示一些你提到的“更多说明…”吗?