用Detour方法,大致做法是把CreateRemoteThread函数的入口处的代码复制到自己的代码段中,然后将其入口写入一条跳转指令,使其跳转到自己的程序里,然后根据需要再调用原本的CreateRemoteThread代码。
在网上搜一下HOOK API,可以找到详细说明和源代码。

解决方案 »

  1.   

    我有一个HookAPILib.dll用这个可以轻松搞定API Hook,提供三种Hook方法(均属于修改API头5个字节的方法)+2大种6小种注入方法,楼主需要可以和我联系,有源码,不过不太好看,写了很久了的东西
      

  2.   

    cnzdgs 和 zhaoyu_me 两位大虾不知道有没有hookCreateRemoteThread源码,请帮帮我啊!
    我的QQ 409206390
    邮箱    [email protected]
    谢谢啊
      

  3.   

    你在网上搜HOOK API,就可以找到源代码,稍稍改一下就可以。
    我从不用Detour的方法,这种方法对操作系统和硬件过于依赖,而且微软一直反对,说不定哪天微软更新一个补定这种方法就用不了了。
      

  4.   

    楼上说的有道理,不过我没想到怎么和硬件有扯上了关系呢?还有Detour好象是MS自己开发的库吧,所以我想MS应该不会轻易把这种方法禁止掉的,而且这种方法目前用的也是比较广泛的,IAT需要对PE格式有所了解,可惜我是菜鸟,有关PE的东西正在学习中
      

  5.   

    Detour需要反汇编,汇编语言与CPU有关,CPU就是上面提的硬件喽。
    Vista X64中PatchGuard已经禁止了对内核代码的Detour,所以哪天把系统API也禁止Detour不是不可能。
      

  6.   

    hehe
    如果MS愿意的话IAT式的Hook也是可以禁止的嘛,到了那时候我们岂不是要静态Path一个文件来实现Hook?万一被hook的程序还带个CRC之类的自校验那我这样的菜鸟就没得混了
      

  7.   

    cnzdgs 您好!我以前没接触过这方面知识,但这次毕业设计涉及hook create remote thread ,我这个寒假也一直是在网上找啊。也看到一些键盘钩子的源码,但看不懂, 找了那个《windows 核心编程》,也看不太懂,收获不大。现在这个时候,非常需要像您这样的热心前辈,给我带带路,让我能够迅速上手。
    我希望您能够指导的更详细具体一些,比如如何上手,给个具体的例子指导下。我不怕吃苦,花功夫,但我需要您的帮忙,避免劲用错了地方。感激不尽!!!!
      

  8.   

    请问楼主你是要Hook某个进程对CreateRemoteThread的调用还是Hook系统中所有进程对他的调用?
      

  9.   

    我是要hook 系统中所有进程啊!
    请zhaoyu_me 指导!
      

  10.   

    《windows 核心编程》里有代码,自己去看看吧,遍历所有的进程.
      

  11.   

    遍历所有进程是一种办法,但我觉得那种方法不太好,我还是倾向于用驱动, SSDT Hook,我分析了一下CreateRemoteThread的实现过程,估计在XP下用SSDT Hook挂钩NtCreateThread,在Vista下挂钩NtCreateThreadEx应该可以实现,但我没有时间去实践我在QQ上加过楼主,可是楼主没反应
      

  12.   

    核心编程里的IAT钩子容易被绕过,只要LoadLibrary/GerProcAddress就可以绕过了.
    如果是在RING3下做,我建议还是使用Detours,它内带一个小型反汇编引擎,很好地解决了指令碎片的问题(网上很多INLINE HOOK都有个问题),而且不用做同步,网上有个ULHook需要还原才能对原API的调用,会产生同步问题,支持多种windows,32/64位CPU(64位的版本要钱).没什么可挑剔的了..
    代码如下:HANDLE WINAPI MY_CreateRemoteThread(
      HANDLE hProcess,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      SIZE_T dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,
      LPVOID lpParameter,
      DWORD dwCreationFlags,
      LPDWORD lpThreadId
    );//挂接CreateRemoteThread
    DETOUR_TRAMPOLINE(HANDLE WINAPI DE_CreateRemoteThread(
      HANDLE hProcess,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      SIZE_T dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,
      LPVOID lpParameter,
      DWORD dwCreationFlags,
      LPDWORD lpThreadId
      ), CreateRemoteThread);在DLLMain里加上
    DetourFunctionWithTrampoline((PBYTE)DE_CreateRemoteThread, (PBYTE)MY_CreateRemoteThread);下面是代理函数
    HANDLE WINAPI MY_CreateRemoteThread(HANDLE hProcess,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    SIZE_T dwStackSize,
    LPTHREAD_START_ROUTINE lpStartAddress,
    LPVOID lpParameter,
    DWORD dwCreationFlags,
    LPDWORD lpThreadId)
    {
    #ifdef KOUT_DEBUG_STRING
    DWORD dwCaller;
    __asm push dword ptr [ebp+4]
    __asm pop  dword ptr [dwCaller]

    TCHAR path[1024];
    ZeroMemory(path,sizeof(TCHAR)*1024);
    HMODULE hDll = ModuleFromAddress((PVOID)dwCaller);
    GetModuleFileName(hDll,path,1024*sizeof(TCHAR)); KDbgPrint(_T("CreateRemoteThread %x Call By:%s\n"),hProcess,path);
    #endif //判断是否是创建远程线程
    if(hProcess==GetCurrentProcess()||hDll==g_hKernel32)
    {
    return DE_CreateRemoteThread(hProcess,lpThreadAttributes,dwStackSize,lpStartAddress,
    lpParameter,dwCreationFlags,lpThreadId);
    }
    else
    {
    *lpThreadId = 1017;
    return (HANDLE)719;
    }
    }注意:函数CreateThread最终还是调用CreateRemoteThread,所以要判断hProcess
    上面的DLL作为全局钩子注入到每个进程就行了,或者用CreateRemoteThread的方式注入..看看CreateThread的执行流程
    CreateThread (kernel32.dll)
    CreateRemoteThread (kernel32.dll)
    NtCreateThread (ntoskrnl.exe)
    PspCreateThread (ntos\ps\create.c:237)
    要可靠的话,挂接NtCreateThread好了..
      

  13.   

    keSummer 如采用您这种遍历所有进程,那是不是如果系统临时创建新的进程,那我又要将DLL注入这个新创建的进程?装一个核心层的全局HOOK是不是更好呢?
    请您指导,期待您的回答。谢谢!
      

  14.   

    zhaoyu_me 您说跟我在QQ上联系过,我不经常上网,所以没有收到您的消息,您是不是可以考虑给我发邮件!谢谢
      

  15.   

    keSummer 不存在遍历,是否注入到其它进程有赖于你的代码。如果需要知道是否新开线程,HOOK NtCreateSection更多信息查看《Undocument ...》