DLL_THREAD_ATTACH防止远程线程注入

来源:互联网 发布:淘宝卖家使用尺码 编辑:程序博客网 时间:2024/06/05 02:22
/*原理:当创建线程时,系统会向当前进程所有dll发送DLL_THREAD_ATTACH通知此时新的线程已经被创建但尚未执行,更精切的说已经创建了线程内核对象、线程堆栈等资源正处于初始化阶段。只有在每个dll正常处理了DLL_THREAD_ATTACH线程才开始执行对于远程线程本质上和本地线程完全一样,区别在于由其他进程创建如果在接受DLL_THREAD_ATTACH时通知结束线程,线程就无法执行,也防止了远程线程注入的效果下面直接上代码*/////////////////////////////////////////////////////////////////////////////////////////应用程序部分#include <windows.h>#include <stdio.h>DWORD ThreadProc(  LPVOID lpParameter);typedef FARPROC (*add) (bool);int main (void){HANDLE Thread;        HMODULE hDll=LoadLibrary("dll.dll");if (hDll){add address=(add)GetProcAddress(hDll,"SetStatus");if (address){address(TRUE);//正常创建线程设置true}Thread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadProc,NULL,0,NULL);Sleep(100);FreeLibrary(hDll);}else{printf("dll加载失败!");return 0;}        return 0;}DWORD ThreadProc(  LPVOID lpParameter){for (int i=0;i<10;i++){printf("%d\n",i);}return TRUE;}///////////////////////////////////////////////////////////////////////////////////////////////////////////dll部分#include <windows.h>#include <stdio.h>BOOL bStatus=FALSE;//设置线程创建标识void SetStatus(bool status){bStatus=status;return;}BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{OutputDebugString(TEXT("加载dll"));}break;case DLL_THREAD_ATTACH:{OutputDebugString(TEXT("新建线程"));                if (bStatus==FALSE){//如果线程创建标识为FALSE,就直接结束OutputDebugString(TEXT("线程被结束"));TerminateThread(GetCurrentThread(),0);//貌似执行这个主线程也挂了。FreeLibrary和关闭按钮也无反应了。}else{//每次创建线程合法后就自动关闭线程标识//每次设置合法线程标识只能使用一次OutputDebugString(TEXT("线程正常创建执行"));SetStatus(false);}}break;case DLL_THREAD_DETACH:{OutputDebugString(TEXT("线程退出"));}break;case DLL_PROCESS_DETACH:{OutputDebugString(TEXT("释放dll"));}break;}return TRUE;}

0 0
原创粉丝点击