如何阻止被其他进程通过CreateRemoteThread注入线程?

chinatangcy 2008-01-03 04:31:38
我希望能阻止其他进程通过CreateRemoteThread注入我控制的进程。
我不能通过HOOK所有进程的CreateRemoteThread方法来实现,因为我无法分辨被注入进程是否被我所控制(控制过程不稳定)。
我希望通过被注入进程本身的判断来阻断CreateRemoteThread的注入。
问2个问题:
1、在A进程调用CreateRemoteThread向B进程注入时,B进程能收到什么信息吗?或通过HOOK B进程本身的某些API能拦截到吗?
2、有没有什么方法判断B进程中某个线程是由B自己创建的,还是被通过CreateRemoteThread注入的?
...全文
840 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinatangcy 2008-01-17
  • 打赏
  • 举报
回复
mydo说的好象是SDK的,我还没有用,有机会去试试,谢谢。
Idle_的回复比较有启发,但也没有完全解决我的问题。
仔细想想,可能也没有完美的解决方案,就这么结了吧~~
阿呆_ 2008-01-04
  • 打赏
  • 举报
回复
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内而是动态分配一块内存然后复制一些代码进去再跳过去执行呢?)。
jameshooo 2008-01-03
  • 打赏
  • 举报
回复
这种情况只有后发才能治人,哈哈
大熊猫侯佩 2008-01-03
  • 打赏
  • 举报
回复
PS :还是一句老话,以上只是可能的几种技术方法。但别人也同样能做到"反监控"
道理是一样的。
大熊猫侯佩 2008-01-03
  • 打赏
  • 举报
回复
0 use PsSetCreateThreadNotifyRoutine

1 hook ZwCreateRemoteThread 、ZwWriteProcessMemory etc
DarknessTM 2008-01-03
  • 打赏
  • 举报
回复
要全局HOOK的话,也应该HOOK CreateProcess和OpenProcess ,因为他要注入 必须获得你的进程句柄

第二个问题,我没研究过,不知道
进程注入自己的dll 带有测试dll 路径和要注入的程序可以自己改 hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD| //允许远程创建线程 PROCESS_VM_OPERATION | //VM操作 PROCESS_VM_WRITE , //允许写 FALSE,dwProcessID); if(!hRemoteProcess) AfxMessageBox(L"无法打开目标进程"); // KillTimer(m_ntime); //计算DLL路径需要多大内存 int cb=(1+lstrlenW(pszLibFile))*sizeof(WCHAR); //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE); if(pszLibFileRemote==NULL) { AfxMessageBox(L"建立内存失败"); CloseHandle(hRemoteProcess); return; } //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 BOOL iReturnCode=WriteProcessMemory (hRemoteProcess,pszLibFileRemote,(PVOID)pszLibFile,cb,NULL); if(!iReturnCode) { AfxMessageBox(L"写入错误"); VirtualFreeEx(hRemoteProcess,NULL,0,MEM_RELEASE); CloseHandle(hRemoteThread); CloseHandle(hRemoteProcess); return; } //计算loadlibraryW入口地址 HMODULE hModule=LoadLibrary(L"C:\\WINDOWS\\system32\\kernel32"); PTHREAD_START_ROUTINE pfnStartAddr=( PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW"); hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL); if(hRemoteThread==NULL) { //等待线程结束 WaitForSingleObject(hRemoteThread,INFINITE); DWORD RetV; if(GetExitCodeThread(hRemoteThread,&RetV)) CloseHandle(hRemoteThread);

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧