我希望能阻止其他进程通过CreateRemoteThread注入我控制的进程。
我不能通过HOOK所有进程的CreateRemoteThread方法来实现,因为我无法分辨被注入进程是否被我所控制(控制过程不稳定)。
我希望通过被注入进程本身的判断来阻断CreateRemoteThread的注入。
问2个问题:
1、在A进程调用CreateRemoteThread向B进程注入时,B进程能收到什么信息吗?或通过HOOK B进程本身的某些API能拦截到吗?
2、有没有什么方法判断B进程中某个线程是由B自己创建的,还是被通过CreateRemoteThread注入的?

解决方案 »

  1.   

    要全局HOOK的话,也应该HOOK CreateProcess和OpenProcess ,因为他要注入 必须获得你的进程句柄第二个问题,我没研究过,不知道
      

  2.   

    0 use PsSetCreateThreadNotifyRoutine1 hook ZwCreateRemoteThread 、ZwWriteProcessMemory etc 
      

  3.   

    1.当A进程用CreateRemoteThread注入线程时,B进程所有已加载的dll都会得到通知(系统会以参数DLL_THREAD_ATTACH依次调用各DLL的dllmain). 因此你可以用一个静态链接的dll实现防止别人CreateRemoteThread。不过在dll接到DLL_THREAD_ATTACH后要找出非法线程就比较麻烦了,因为你不知道哪个线程的创建触发了这次调用(系统都是通过process的第一个thread来调用的), 一个可行的办法是调用NtQuerySystemInformation查找当前进程的信息,其中有一个thread列表,最后一个就是新创建的线程, 你可以首先判断一下它的入口地址是否就是LoadLibraryA, LoadLibraryW, 如果是那么可以肯定是别人CreateRemoteThread注入进来的,其次可以通过VirtualQuery找出该入口地址所分配内存的起始地址, 看看是不是就是某个dll的module(用GetModuleFileName,如果成功那么就知道这块代码属于某个dll)然后判断一下这个module是否合法。如果不能找到对应module, 那么也可以多半确定是别人WriteProcessMemory/CreateRemoteThread注入进来的,此时可以直接杀掉了事。2. 可以用一个变通的办法加以判断, 用线程入口地址(或者不知道怎么获知某个线程入口地址的话可以直接Suspend那个线程,GetThreadContext获取其当前EIP)作为参数调用VirtualQuery, 判断memory_basic_information.AllocationBase是否就是B.exe的HInstance, 如果是的话, 说明该线程代码位于B.exe内, 当然就是合法的(谁写的正常包含线程的程序线程代码不包含在exe内而是动态分配一块内存然后复制一些代码进去再跳过去执行呢?)。
      

  4.   

    mydo说的好象是SDK的,我还没有用,有机会去试试,谢谢。
    Idle_的回复比较有启发,但也没有完全解决我的问题。
    仔细想想,可能也没有完美的解决方案,就这么结了吧~~