3.1.3 免疫AutoRun病毒工具的编写
1.AutoRun免疫的原理
前面介绍了基于AutoRun.inf进行传播的模拟病毒,现在来介绍如何对该种病毒进行免疫,同样也是通过前面学习的文件相关的知识来进行。免疫AutoRun病毒的原理是建立一个无法被删除的AutoRun.inf文件夹(并不是真正的无法删除),以防止病毒生成用来运行病毒的AutoRun.inf文件。这就是它的免疫原理。网上提供的免疫程序就是使用这个原理,至少作者见到的免疫程序都是用这种原理。
2.手工演示建立无法删除的文件夹
在“开始”菜单的“运行”中输入“cmd”打开命令行工具,开始手工演示。命令行下的命令步骤如下。
①在命令行下输入cd \,注意在cd和\之间是有一个空格的,这步将命令提示符切换到C盘的根目录下。
②在命令行下输入mkdir autorun.inf,mkdir使用建立目录的命令,这步是在C盘根目录下建立了一个名为autorun.inf的文件夹。
③在命令行下输入cd autorun.inf,将命令提示符切换到C盘下的autorun.inf文件夹下。
④在命令行下输入mkdir anti…\,这步是在autorun.inf文件夹下建立一个名为anti…\的文件夹。
经过以上步骤就建立了一个无法删除的autorun.inf文件夹,并且也无法建立与之同名的文件了,下面逐步进行测试。
①打开C盘,进入autorun.inf文件夹,然后选中它进行删除,会出现如图3-1所示的错误提示对话框,表示删除操作失败。
图3-1 无法读取源文件或磁盘
②进入autorun.inf文件夹,找到anti..文件夹进行删除,会出现与图3-1相同的提示。双击anti..文件夹,会出现如图3-2所示的提示对话框,表示无法定位该文件夹,说明该文件夹无法删除,也无法进入。
图3-2 无法打开anti..文件夹
③回到C盘的根目录,建立一个.inf文件,名为autorun.inf,提示如图3-3所示的对话框,表明无法建立与autorun.inf文件夹同名的文件。
图3-3 重命名文件或文件夹时出错
注:用心的读者会发现,在建立文件夹时建立的是anti…\这样的文件夹,而在资源管理器中发现文件夹的名称变成了anti..。这是由于..和\在文件系统中有特殊的作用。具体原因与本书内容无关,在此不做过多的介绍。
它的删除方法也比较简单,使用“rd anti…\”命令即可删除该文件夹。
3.AutoRun病毒免疫程序的实现
前面的内容已经掌握了手动进行免疫AutoRun.inf的方法,对于程序的实现只是将手动免疫变成程序化的自动免疫。有了编程的基础,有了开发所需的原理,那么把手工免疫变成程序免疫就是水到渠成的事了。先来看一下界面,界面非常简陋,如图3-4所示。
图3-4 AutoRun免疫工具界面
整个界面中有3个控件。IDC_COMBO_DRIVE控件需要进行初始化工作,用于显示驱动器的分区列表。初始化IDC_COMBO_DRIVE的代码如下:
void CImmunityUDlg::InitComboDrive() { char szDriveStr[MAXBYTE] = { 0 }; char *pTmp = NULL; SetDlgItemText(IDC_COMBO_DRIVE, "请选择欲免疫的磁盘盘符"); GetLogicalDriveStrings(MAXBYTE, szDriveStr); pTmp = szDriveStr; while ( *pTmp ) { m_CbDrive.AddString(pTmp); pTmp += 4; } }
以上函数需要在OnInitDialog()函数中进行调用。InitComboDrive()函数中用到了SetDlgItemText()函数,该函数是MFC中用于设置编辑框的函数,具体使用方法请参考MSDN。
对于“免疫”和“取消免疫”这两个按钮,需要分别为它们添加单击事件。“免疫”按钮事件对应的代码如下:
void CImmunityUDlg::OnBtnImmunity() { // TODO: Add your control notification handler code here char szPath[MAX_PATH] = { 0 }; GetDlgItemText(IDC_COMBO_DRIVE, szPath, MAX_PATH); // 创建autorun.inf文件夹 strcat(szPath, AUTORUN); BOOL bRet = CreateDirectory(szPath, NULL); if ( !bRet ) { AfxMessageBox("无法免疫该盘符! \ 可能已经免疫,或者该磁盘为不可写状态!"); return ; } // 创建无法删除的文件夹 strcat(szPath, ANTI); bRet = CreateDirectory(szPath, NULL); if ( !bRet ) { AfxMessageBox("无法免疫该盘符! \ 可能已经免疫,或者该磁盘为不可写状态!"); } }
代码中使用了两个宏,分别是AUTORUN和ANTI,其定义如下:
// 创建autorun.inf文件夹 #define AUTORUN "autorun.inf" // 创建无法删除的文件夹 #define ANTI \\anti...\\
“取消免疫”按钮事件对应的代码如下:
void CImmunityUDlg::OnBtnCancel() { // TODO: Add your control notification handler code here char szPath[MAX_PATH] = { 0 }; // 删除ANTI...\目录 GetDlgItemText(IDC_COMBO_DRIVE, szPath, MAX_PATH); strcat(szPath, AUTORUN); strcat(szPath, ANTI); RemoveDirectory(szPath); ZeroMemory(szPath, MAX_PATH); // 删除autorun.inf目录 GetDlgItemText(IDC_COMBO_DRIVE, szPath, MAX_PATH); strcat(szPath, AUTORUN); RemoveDirectory(szPath);}
以上部分介绍了AutoRun进行免疫的代码实例,读者可以自行运行并进行测试。关于文件操作的API函数部分就介绍到此,通过两个简单的实例加深了读者对文件操作API函数的使用。通过这两个实例也证实了本书的目的,通过简单的学习,完成实用的工具。