跳转至

练习 NOP 填充

如果你还没打开本章示例代码中的 NOPExample.cpp,现在就打开并玩一会儿。你会找到一个可用的 writeNop() 函数实现,以及一个有趣的 getAddressForNOP() 函数,它扫描示例程序的内存,找到应该放置 NOP 命令的位置。

要看到 NOP 命令的实际效果,在 Visual Studio 调试器中运行编译好的 NOP 应用程序,在 writeNop() 函数的开头和结尾设置断点。第一个断点被命中时,按 alt-8 打开反汇编窗口,在输入框中输入地址,按回车。这会带你到 NOP 的目标地址,你会看到汇编代码完好无损。按 F5 继续执行,应用程序放置 NOP 后触发第二个断点。最后,跳回反汇编选项卡中的 address,看看代码已被 NOP 替换。

你可以重新设计这段代码做其他酷炫的事情。例如,你可以尝试在比较指令上而不是跳转上放置 NOP,甚至修改跳转的类型或目标。

这些和其他替代方法可能有效,但请注意,它们比用 NOP 命令覆盖单个 JMP 引入了更多出错空间。修改外部代码时,尽可能做最少的更改,以最小化出错的可能性。