C++ 黑客编程揭秘与防范(第3版)
上QQ阅读APP看书,第一时间看更新

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函数的使用。通过这两个实例也证实了本书的目的,通过简单的学习,完成实用的工具。