windows核心编程上说,对API挂钩,提了几种方法,一种是修改函数前5个字节,修改成jmp指令,但是这种方法在多线程下有问题,原因是一个线程在修改函数前5个字节的时候,另外一个线程在调用这个函数,会导致冲突;书本还介绍了修改模块的导入节的方法,说这个方法不存在第一种方法的问题。
问题:
既然是修改导入节,如果一个线程在修改导入节的函数地址,如MessageBox,另外一个线程正在调用MessageBox函数,需要读导入节的函数地址,这样不是也会有冲突吗???为什么书本上说这种方法多线程下没有问题??
问题:
既然是修改导入节,如果一个线程在修改导入节的函数地址,如MessageBox,另外一个线程正在调用MessageBox函数,需要读导入节的函数地址,这样不是也会有冲突吗???为什么书本上说这种方法多线程下没有问题??
谢谢
而不是一线程修改,另一线程在调用修改API地址头5个字节,
执行Hook函数后
只有将这5个字节还原后才能执行原有的API函数
而此时刚还原,另一线程执行该API,就会漏Hook,
然后根据需要再次修改头5个字节,
所以无论什么修改时机,多线程下都会漏Hook,而Hook IAT没此问题,都很能对付 加壳 的情况
调用过程时不用还原,没有多线程冲突,漏Hook,但很难对付 加壳 的情况
IAT的方法会漏HOOK?也对付不了加壳?
那jmp方法可以对付加壳吗?
1. 因为修改代码jmp xxxx是五个字节,在汇编语言里一条mov无法执行修改完,需要两条。
大多数情况下是可以用其他办法避过多线程冲突的,比如说2级跳(近跳+远跳)2. 修改导入表漏Hook是很厉害的,不过配合上Hook导出表,就会有很大的改善了。
2.加壳的函数加载后,修正IAT的情况下
对于问题,核心编程没有提及,除了上面2个情况是漏HOOK之外的话,还有其他情况是漏HOOK的吗?
非常麻烦,所以网上基本上流传的是JMP HOOK。你要在被HOOK的DLL里找到废弃区域,或者是添加节,然后写入以JMP表,之后把导出表中的偏移指向它。你要很熟悉PE文件结构,动态处理数据节等技术。