读书笔记_windows的APIHook技术_part 2

IAT钩子简单强大,但缺点是这种钩子比较容易被发现。另外一方面这种方式经常使用,驱动程序验证机制就是使用的IAT hook这种方式,还有操作系统在一个称为DLL转发(DLL forwarding)的进程中也用到了IAT hook。所以即使检测到了IAT hook,但区分良性钩子和恶意钩子仍然是困难的。

IAT hook的另外一个缺点就是只有当隐式调用DLL时,IAT hook才起作用,而通过LoadLibrary 和GetProcAddress来调用dll时,IAT hook将不会起作用。原因显示调用采用的是后期按需绑定技术,这种绑定方法在调用函数时才解析函数地址,当钩住这些函数时,IAT中可能不存在它们的地址。

IAT hook的实验方法,可以按IAT hook的第一部分的描述完成驱动的编写,但注意在回调函数中以下两个变量

char *pc_dlltar = "kernel32.dll";

char *pc_fnctar = "GetProcAddress";

最好设置称为自己编写的dll和函数名,我这里设置成为DriverDll.dll与test函数。

然后是安装这个驱动,可以使用SRVINSTW.EXE进行安装,假设设置的服务名为APIhook

然后是编写一个测试程序,分别采用显示和隐式两种方法调用DriverDll.dll的test函数,注意是分别使用。

然后在运行中输入cmd,再输入net start APIhook. 此时该服务已启动,IAT hook已经工作。

可以使用Dbgview进行观察IAT hook的执行过程,注意一定要在DbgView中的Caputure选项中勾选Capture Kernel。

然后分别运行测试程序,结果为:

当显示调用dll时发现不了test函数的地址,而隐式调用时则能够扑捉到test函数在IAT中的地址。结果如下图所示:

读书笔记_windows的APIHook技术_part 2

你可能感兴趣的:(windows)