逆向工程:更改AL寄存器而不覆盖指令

时间:2015-05-10 04:59:35

标签: 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...]

第一行中的函数调用将rax寄存器设置为值0.因此,第二行将值0移动到44AB9DA15处的指针。

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

我可以这样做:

call test_exe.44AA9EB20
mov byte ptr ds:[44AB9DA15], 1

然而,由于al只是一个8位寄存器,因此将代码组装到上面的代码似乎会在一些后续指令中运行。

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

有没有什么方法可以让这个指针(44AB9DA15)的值为1而不会在后续指令中运行?

1 个答案:

答案 0 :(得分:1)

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

或者,如果不必调用 test_exe ,则使用将AL设置为1的代码覆盖CALL指令, 例如 MOV AL,1 ,并使用 NOP 填充剩余的四个字节。