CreateRemoteThreadex开启远程线程失败集合

修改进程PE头
报错

修改进程_EPROCESS
+0x12c SectionBaseAddress : 0x00bf0000
都会报错 不是有效的win32程序 错误号193

修改进程PEB +0x018 ProcessHeap : 0x000c0000 为0
报错 线程创建成功 执行失败。第二次打开提示 打开进程更多失败

修改进程_EPROCESS
+270 为0
打开进程失败,参数错误 错误号87


LoadLibray 载入模块时。会调用目标进程的 LdrInit函数

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内而是动态分配一块内存然后复制一些代码进去再跳过去执行呢?)。

原文地址:https://www.cnblogs.com/kuangke/p/6400252.html