API钩子一般要不是通过改写IAT表,要不就是改写内存地址跳转来实现的。但如果是钩挂特定进程的话,改写内存地址跳转,其他的先不说,首先就很容易使其他进程在调用该API时发生相应的问题。于是,一般使用改写ImportAddressTable来实现。
但是,问题出现了:
1.如果包含API的DLL是延迟加载的,那这样的话,它的IAT表在初始化之后,直到所需API调用前,是不会作相应改变,没有相应的API信息的。这样的话,如果我需要挂钩一个API,而我的远程线程或者DLL是在所需API调用前注入的,那我应该如何处理?
2.如果我要挂钩一API,而该API所在DLL没有被进程相应的EXE直接调用,而是通过另外的DLL所间接调用。这样的话,即使不是延迟加载,EXE的IAT中也没有改API的相应信息。而且,要挂钩的API可能经过了DLL的许多重封装。请问,这时我要在该特定进程挂钩这一API,而又不想影响同时调用该API的其他进程,请问,我应该如何处理?
3.如果我需要一个子进程在初始化完后马上挂起,等待父进程下一步动作。请问,父进程应如何处理(注:子进程不能做任何改动,且子进程没有与父进程同步的机制)?

解决方案 »

  1.   

    3.看楼主这方面研究得已经很透彻了,你所说的“初始化完后”应该是子进程的主线程已经执行了一段代码的吧,如果不是可以用CREATE_SUSPENDED作为CreateProcess的参数,在父进程中专门开一个线程检测父进程动作,用该线程ResumeThread子进程的主线程,关公门前耍大刀,不要鄙视才好
      

  2.   

    班门弄斧哈:
        你可以在自己写的API里检测是否是所关心的进程在调用,不是则你调用原API
      

  3.   

    全局的hook应该没问题吧。hook中判断一下是否在所属的进程中。
      

  4.   

    CREATE_SUSPENDED到底是指初始化完成后挂起,还是压根就没初始化?
    如果是初始化完成,那么这个“初始化”的范畴是什么?包括CRT Library么?
      

  5.   

    在这个方面我也是个新手,只不过看了些资料,写了点程序而已。关于用CREATE_SUSPENDED作为CreateProcess参数,我遇到的问题是,在挂起之后,ResumeThread前,向子进程注射远程线程或者dll准备修改API时,据反馈的输出信息是没有发现子进程加载任何一个准备挂钩API的DLL,包括Kernel32.dll。我用 procexp.exe 察看,果然子进程什么DLL都没有加载。请问这样的话,有没有什么好的方法?现在的问题就是不能让全局HOOK,不然在Hook中判断一下所属进程也是个不错的方法。
      

  6.   

    我是了一下之后觉得应该是没有初始化,因为没有发现任何DLL的加载。
      

  7.   

    连Kernel32.dll都没有?太奇怪了……不然你hook  LoadLibrary和GetProcAddress好了……
      

  8.   

    如果只挂钩特定进程,不全局HOOK的话,不ResumeThread子进程,就没有Kernel.dll,这样的话,LoadLibrary和GetProcAddress挂不上去。而如果ResumeThread再挂的话,肯定会有不少遗漏
      

  9.   

    此问题在 幻影旅团(www.ph4nt0m.org) 的BBS上由zzzevazzz指点,采用xHook的方法解决。