这是我的第一篇文章,我是组装和调试的新手,所以请多多包涵。
我试图将一些代码(对 MessageBoxA 的一点调用)注入到 Windows 7 记事本可执行文件中。但是,我遇到了地址的问题。首先,我在 OllyDbg 中打开 exe,然后转到包含“notepad.pdb”的 ASCII 文本的行。然后我在其下方放置一个 ASCII 字符串(例如,“INJECTED NOTEPAD”)。接下来,在此之下,我输入了这个 asm 代码:
PUSH 0
PUSH address_of_ASCII_string ; In this case, 00A6B668C
PUSH address_of_ASCII_string ; In this case, 00A6B668C
PUSH 0
CALL MessageBoxA
接下来,我转到程序中的第一行代码(只需右键单击并按 Go to Origin(或只需在数字键盘上按 *))然后我将第一行替换为 JMP 指令到第一个地址PUSH 0 在我注入的代码中。然后,我将替换的指令放在注入代码的末尾。之后,我在 JMP 指令之后的代码行中添加了一条 JMP 指令,该指令跳转到我的注入代码(是的,我只是描述了一个 codecave 或类似的东西)。当我运行它时一切正常。但是,当我将修改后的代码保存到新的可执行文件并再次使用 OllyDbg 运行它时,它不起作用。当我尝试引用我输入的 ASCII 字符串时,地址完全错误。示例如下图所示:
如您所见,我将字符串压入堆栈,但是当我再次将修改后的程序重新加载到调试器中时,字符串的地址发生了变化,但我的代码没有。因此,当我调用 MessageBoxA 函数时,它会出错,因为我为 Text 和 Caption 参数加载了错误的地址。我该如何解决?