什么时候可以使用诱捕?

逆向工程 拆卸 视窗 二元分析 dll
2021-07-10 21:39:00

这是 Windows XP 的 NTDLL 内部函数之一的开头:

MOV EDI,EDI
PUSH EBP
MOV EBP,ESP
...

我正在阅读的关于逆向工程的书(Eldad Eilam - Reversing: Secrets of Reverse Engineering)对第一行说:

它本质上是由编译器作为占位符放置的死代码,以防有人想要捕获此函数。Trapping 是指某个外部组件添加了一条 JMP 指令,每当调用被捕获的函数时,该指令用作通知。

你能告诉我如何在实践中使用诱捕吗?我假设陷阱只是在另一个函数内部调用一个带有陷阱指令的函数,但我没有意识到外部函数如何获得关于调用的“通知”......作者是否可能指的是“一些外部组件”调试器?这是有道理的,因为如果我为一些奇怪的汇编指令设置断点,例如MOV EDI, EDI,我将到达被困函数所在的位置......

1个回答

mov edi, edi 是一个叫做热补丁点的指令

互联网上有几篇关于它的文章,其中值得注意的是:

  1. Raymond Chen 旧的新东西 1
  2. Raymond Chen 旧的新东西 2
  3. 约翰纳斯传球的热补丁演练

此指令的主要实用程序是使第三方应用程序或 Windows 更新能够在模糊的竞争条件成为现实时将现有功能修补为更新的功能,并且副作用最小(大多数情况下,通过绕道硬修补任何功能都可以工作)或者正如 raymond 所说的那样,99% 的时间都可以工作

引自链接的文章

MOV EDI, EDI 指令是一个两字节的 NOP,它的空间刚好足以修补跳转指令,以便可以动态更新函数。目的是将 MOV EDI, EDI 指令替换为一个两字节的 JMP $-5 指令,以将控制重定向到紧接在函数开始之前的五个字节的补丁空间。五个字节对于一个完整的跳转指令来说就足够了,它可以将控制权发送到安装在地址空间其他地方的替换函数。

mov edi, edi结合使用与之前由编译器发射的5名空间持有mov edi, edi0xcc0x90

所以修补软件可以修补一个原子可替换的短跳和一个控制区域的长跳