在函数末尾添加一个钩子

逆向工程 函数挂钩
2021-06-30 01:59:48

我有一个(所谓的)函数有多个入口点,但只有一个ret.

我试图了解如何向函数添加钩子。

我面临的主要问题是放在这个函数之后的代码——它可以随时执行,所以我需要确保它不会使程序崩溃。

我的想法是用ret指令替换nop指令,然后跳转到我的钩子。在这一点上,我将检查返回地址是否与对所述函数的调用匹配,或者与ret.

我对此并不满意,因为我无法确定后面的代码ret是函数的序言——它可能是任何代码,而且我不知道此时堆栈会如何——这意味着可能是被推入它匹配对我试图挂钩的函数的调用。

这里有人有更好的主意吗?

编辑:忘了提到我不能添加超过 2 次跳跃。

2个回答

钩住所有入口点并将返回地址转移到您控制的地方。如果您在 x64 上为编译器生成的代码执行此操作,则需要小心保留跨函数边界抛出的异常——但它看起来不像编译器生成的代码,如果您谈论的是“具有多个入口点的函数”。

如果只有一个 RET,那么所有入口点最终必须会聚在到达它的路径上。公共路径的前几条指令将是放置单钩的理想位置。如果您需要函数完成执行以产生适当的副作用或其他什么,那么您可以从代码中的本地缓冲区运行替换的指令,然后调用函数中的剩余指令,最后返回给调用者.

如果公共路径只是简单的RET指令本身(因为多个入口点分支或跳转到RET),那么您可以将它们全部重定向到您的单个JMP指令,从而无需使用多次跳转,只需多次修改即可实现钩子。