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.如果包含API的DLL是延迟加载的,那这样的话,它的IAT表在初始化之后,直到所需API调用前,是不会作相应改变,没有相应的API信息的。这样的话,如果我需要挂钩一个API,而我的远程线程或者DLL是在所需API调用前注入的,那我应该如何处理?
2.如果我要挂钩一API,而该API所在DLL没有被进程相应的EXE直接调用,而是通过另外的DLL所间接调用。这样的话,即使不是延迟加载,EXE的IAT中也没有改API的相应信息。而且,要挂钩的API可能经过了DLL的许多重封装。请问,这时我要在该特定进程挂钩这一API,而又不想影响同时调用该API的其他进程,请问,我应该如何处理?
3.如果我需要一个子进程在初始化完后马上挂起,等待父进程下一步动作。请问,父进程应如何处理(注:子进程不能做任何改动,且子进程没有与父进程同步的机制)?
你可以在自己写的API里检测是否是所关心的进程在调用,不是则你调用原API
如果是初始化完成,那么这个“初始化”的范畴是什么?包括CRT Library么?