对于Win2k + SP4的问题,我的解决方法是,在自己Hook的dll里初始化时,
HMODULE hMod = LoadLibrary("Aclayers.DLL");
if (hMod != NULL) 
{
    FreeLibrary(hMod);
}
经测试在XP和2k SP4下都可以Hook到CreateProcessA和CreateProcessW。我做了个测试,Hook了CreateProcessW和CreateProcessA,我的函数里是先弹出一个密码验证框,验证无误后再调用原系统的API CreateProcessA或CreateProcessW。在Explorer里对可执行文件的操作或其他程序里对API的调用都被Hook了,即会先要求验证。但是,当我直接双击mp3文件时,Winamp直接运行了(郁闷),于是我将mp3的默认播放程序设为Windows Media Player,这下对了,又被Hook了(又要求密码验证了),再设回Winamp,还是直接运行了。
是因为Winamp有反Hook CreateProcess的技术还是Winamp根本就没有通过CreateProcess调用?我用的API Hook方法是通过修改进程所有Module里的输入节信息,应该不存在多线程不安全的问题。按Windows核心编程一书作者的说法,这种方法应该是Windows下最好的API Hook方法。
望高手解答。谢谢!

解决方案 »

  1.   

    我觉得不是Winamp.exe里的问题,因为整个流程是Explorer进程里启动Winamp进程,所以也许是Winamp的系统设置使Explorer避免了CreateProcess的调用而直接调用了Native API?BTW,整个测试期间我的Hook程序未退出。
      

  2.   

    Use system-call hooking.Create a kernel-mode driver which will replaces the entries that serves CreateProcess system call in the system service dispatch table.So whenever an application executes a win32 CreateProcess, a corresponding NtCreateProcess is invoked, which results in the execution of your hooked routine.
      

  3.   

    refer to
    http://www.xfocus.net/articles/200405/696.html