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

Reverse Engineering: changing AL register without overwriting instructions

我正在尝试通过调试和修补 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 而无需 运行ning 后续指令?

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

或者,如果不必调用 test_exe,则用将 AL 设置为 1 的代码覆盖 CALL 指令, 例如MOV AL,1,用NOP.

填充剩余的四个字节