【发布时间】:2016-12-23 15:58:25
【问题描述】:
这是我的第一篇文章,我是组装和调试的新手,请多多包涵。
我试图将一些代码(对 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 参数加载了错误的地址。我该如何解决这个问题?
【问题讨论】:
-
嗯,是的,当您应该使用相对地址时,您正在尝试使用绝对地址。每次启动进程时,可执行文件的基地址都是随机的,因此固定地址在多次调用中无效。 (另外:欢迎来到 Stack Overflow!感谢您提出的问得好、提出得很好的问题。)
-
谢谢。那我该如何使用相对地址呢?
-
我想说你尝试不注入代码而是修补exe。您当然不需要使用相对地址而是绝对地址 - 但所有绝对地址必须在
.relocs部分中描述。你的补丁工作的一种方法 - 在 exe 上禁用 relocs。为此,您需要在IMAGE_FILE_HEADER.Characteristics中设置标志IMAGE_FILE_RELOCS_STRIPPED- 在此 exe 始终将加载到常量地址和可能的硬编码绝对地址之后 -
我尝试了 RbMm 的建议,它奏效了!我只是在 CFF Explorer 中打开记事本并转到“文件头”部分。然后我通过选中“从文件中剥离的重定位信息”框来编辑“特征”条目。我假设这使可执行文件使用绝对寻址而不是使用基地址对吗?进行此修改会破坏 nor 可执行文件中的任何内容吗?它不会破坏记事本,但我的目标是将一些代码附加到 explorer.exe。我不知道这是否会破坏资源管理器。但是,它适用于记事本。谢谢。
-
还有其他建议吗?
标签: windows assembly x86 memory-address codecave