windows核心编程上说,对API挂钩,提了几种方法,一种是修改函数前5个字节,修改成jmp指令,但是这种方法在多线程下有问题,原因是一个线程在修改函数前5个字节的时候,另外一个线程在调用这个函数,会导致冲突;书本还介绍了修改模块的导入节的方法,说这个方法不存在第一种方法的问题。
问题:
既然是修改导入节,如果一个线程在修改导入节的函数地址,如MessageBox,另外一个线程正在调用MessageBox函数,需要读导入节的函数地址,这样不是也会有冲突吗???为什么书本上说这种方法多线程下没有问题??

解决方案 »

  1.   

     我的意思是说,一个线程在修改导入节的MessageBox地址,另外一个线程调用MessageBox函数,这个线程不是需要根据导入节去查找MessageBox的地址吗?但是另外一个线程正在修改导入节的MessageBox地址,这样会不会冲突呢?
    谢谢
      

  2.   

    因为修改代码jmp xxxx是五个字节,在汇编语言里一条mov无法执行修改完,需要两条。这样在两条语句直接被中断就有可能出问题。而修改导入表呢,只是修改一个四字节的地址,一条mov指令就可以完成了。也就不存在冲突问题了。
      

  3.   

    修改导入表的时机一般是主线程刚启动时,(这时没有其他的线程)
    而不是一线程修改,另一线程在调用修改API地址头5个字节,
    执行Hook函数后
    只有将这5个字节还原后才能执行原有的API函数
    而此时刚还原,另一线程执行该API,就会漏Hook,
    然后根据需要再次修改头5个字节,
    所以无论什么修改时机,多线程下都会漏Hook,而Hook IAT没此问题,都很能对付 加壳 的情况
      

  4.   

    导入表存放的是API的地址,只要修改一次这个地址数值为Hook函数地址,
    调用过程时不用还原,没有多线程冲突,漏Hook,但很难对付 加壳 的情况
      

  5.   

    也就是说,无论怎么修改IAT、多少个线程修改IAT,都不会冲突?
      

  6.   


    IAT的方法会漏HOOK?也对付不了加壳?
    那jmp方法可以对付加壳吗?
      

  7.   


    1. 因为修改代码jmp xxxx是五个字节,在汇编语言里一条mov无法执行修改完,需要两条。
       大多数情况下是可以用其他办法避过多线程冲突的,比如说2级跳(近跳+远跳)2. 修改导入表漏Hook是很厉害的,不过配合上Hook导出表,就会有很大的改善了。
      

  8.   

    导入表 的方法为什么会漏HOOK呢?windows核心编程上推荐的就导入表的方法HOOK API
      

  9.   

    漏Hook的情况:1.使用动态方式LoadLibrary加载就不会在导入表中出现
    2.加壳的函数加载后,修正IAT的情况下
      

  10.   

    如果LoadLibrary动态加载DLL然后使用API,楼上说的IAT修正是一个,还有的保护壳会Stolen Code
      

  11.   

    windows核心编程上说,对于情况1的处理是HOOK GetProcAddress函数,处理这个问题,
    对于问题,核心编程没有提及,除了上面2个情况是漏HOOK之外的话,还有其他情况是漏HOOK的吗?
      

  12.   

    HOOK GetProcAddress未必有用,有的是自己实现了GetProcAddress,就是解析PE文件头。所以我说要配合导出表修改。
      

  13.   

    谢谢wangk 的回答,请问有这方面的资料吗?就是怎样配合导出表来防止漏HOOK,谢谢
      

  14.   

    有人知道怎样配合导出表防止漏HOOK的吗?
      

  15.   


    非常麻烦,所以网上基本上流传的是JMP HOOK。你要在被HOOK的DLL里找到废弃区域,或者是添加节,然后写入以JMP表,之后把导出表中的偏移指向它。你要很熟悉PE文件结构,动态处理数据节等技术。
      

  16.   

    嗯,我大概明白了,谢谢wangk!