没有反汇编程序库的x64 API挂钩

时间:2016-03-29 17:58:14

标签: c++ winapi hook

我需要挂钩一些Windows API函数,例如MS Detours ,而不使用任何外部反汇编程序库
由于大多数32位WinAPI函数都以以下字节序列开头:0x8B 0xFF 0x55 0x8B 0xEC,转换为

mov edi, edi
push ebp
mov ebp, esp

这项任务相当容易。然而,当谈到x64时,情况有所不同:功能开始时的指令变化很大,在没有反汇编引擎的情况下将这些指令重新定位到蹦床是不可能的。

所以,问题是:我真的需要一个反汇编引擎才能做到这一点,还是有另一种方式?

2 个答案:

答案 0 :(得分:1)

修改功能代码本身并不是唯一的挂钩方法。您也可以使用IAT (Import Address Table)挂钩。每个PE (portable executable)都包含一个从DLL文件导入的函数表。加载器获取此表,查找所请求的函数,然后在控制代码之前将其地址写入进程内存。代码中的API函数调用使用这些地址来了解API函数在内存中的加载位置。您可以通过在加载程序完成后将函数调用重定向到代码来修改内存中的IAT来挂钩函数。

以下是一些包含更多信息和示例的链接:

答案 1 :(得分:1)

我们曾经使用我们自己的库来挂钩很多windows函数,但是在某些时候我们发现了这个:https://github.com/TsudaKageyu/minhook/,我可以全心全意地推荐它。它适用于x86和x64。

我们仍然通过更改虚拟表中的虚函数指针来挂钩DirectX和Com对象,因为它很容易,但是对于所有其他挂钩目的,我们使用minhook。

它包含一个反汇编程序库,所以我不知道这是否有资格作为答案,但它非常紧凑。