安全类工具制作AutoRun.inf免疫程序
一、前言
我曾经在《反病毒攻防研究第006篇:利用WinRAR与AutoRun.inf实现自启动》那篇文章中讨论过AutoRun.inf的原理与应对方法,作为对这个问题的收尾,我打算在此讨论一下如何利用MFC开发一个简单的免疫程序。尽管如今我们应该已经不会再受到AutoRun.inf的肆虐,但是这其中包含的很多思想依旧值得探讨。需要强调的是,这篇文章的重点在于预防,也就是在还没有受到AutoRun.inf的威胁时该如何给自己的计算机打预防针。如果计算机中了AutoRun.inf的破坏,可参考反病毒系列第006篇的文章内容。
二、AutoRun.inf的免疫原理
我们在网上可以找到很多免疫工具,现在一些修改版的操作系统里面也会提供这样一个免疫工具。它免疫的原理是建立一个不被删除的AutoRun.inf文件夹,以防止病毒生成一个运行病毒的AutoRun.inf。其免疫要点是:
1、防止病毒在驱动器根目录下生成autorun.inf文件。
2、防止病毒破坏我们的免疫措施。
对于第一点,我们可以在驱动器根目录下做一个autorun.inf文件夹,原理是同一个目录中文件不能和文件夹重名。对于第二点,我们在刚才建立的autorun.inf文件夹中做一个不可删除的目录即可实现。
Windows下,不能够以下面这些字样来命名文件/文件夹,包括:aux、com1、com2、prn、con、nul等,因为这些名字都属于设备名称,等价于一个DOS设备。如果我们把文件命名为这些名字,Windows就会误以为发生重名。而以这些名字命名的文件夹虽可以访问,也可以建立文件夹,但却无法删除,因为Windows不允许以这种方式删除设备。在系统看来,这个文件夹就是设备。如果不以设备名称作为文件名,也可以采用某些方法给文件或者文件起一个包含非法字符的名称,这样一来,它们也是不能够被删除的,这也是接下来所要讨论的方法。而这类名称,虽然不能够用正常的手段进行创建与删除,但是我们是可以通过编程实现的,接下来就对编程方法进行讨论。
三、利用MFC制作免疫程序的界面
首先需要建立一个基于对话框的MFC程序,然后界面上的默认控件,添加一个Combo Box控件和两个Button控件
图1 程序界面
将界面中的三个控件的ID分别改为:IDC_COMBO_DRIVER、IDC_IMMUNITY和IDC_CANCEL。然后再给ComboBox控件添加一个类型为“Control”,名称为“m_ComboDriver”的变量。
这里有一点需要说明的是,很多初学者发现程序在运行后,单击Combo Box控件右边的下三角,无法打开下拉选项,而用键盘的“↓”却可以进行下拉项的选择。其实这是因为在界面设计时,需要将Combo Box控件向下拉一定的范围才可以。单击右边的倒三角,就能够进行调整:
图2 调整Combo Box控件显示范围
至此,界面设计完毕,还是非常简单的,接下来就要添加代码来实现功能了。
四、编写免疫程序的代码
程序中的Combo Box控件是用来选择想要进行免疫的盘符的,所以需要在控件中显示出所有的盘符供用户选择,这里定义一个函数以实现相应的功能。在CImmunityARDlg.cpp文件中,找到OnInitDialog()函数,在“// TODO: Add extra initialization here”与“return”之间的进行函数声明:
[cpp] view plain copy
-
InitComboDriver();
以表明程序对话框的初始设定,然后在OnInitDialog()函数的后面添加InitComboDriver()函数:
[cpp] view plain copy
-
void CImmunityARDlg::InitComboDriver()
-
{
-
char szDriverString[MAXBYTE] = { 0 };
-
char *pTmp = NULL;
-
//设置编辑框显示的内容
-
SetDlgItemText(IDC_COMBO_DRIVER,_T(“Select a drive letter…”));
-
//获取字符串类型的驱动器列表
-
GetLogicalDriveStrings(MAXBYTE, szDriverString);
-
pTmp = szDriverString;
-
while( *pTmp )
-
{
-
//向CComboBox中添加字符串
-
m_ComboDriver.AddString(pTmp);
-
//每个盘符占据4个字节,所以加上4可以切换到下一个盘符
-
pTmp += 4;
-
}
-
}
对于初学者来说,还有一点需要注意的是,由于这里我们自定义了InitComboDriver()函数,因此一定要把这个函数的声明添加到头文件,也就是CImmunityARDlg.h中,可以在public下添加:
[cpp] view plain copy
-
void InitComboDriver();
接下来添加“Immunity”按钮的代码,双击该按钮就可以来到代码编辑界面,首先在最上方添加两个宏定义:
[cpp] view plain copy
-
//创建的目录名称
-
#define AUTORUN “autorun.inf”
-
//创建无法删除的目录
-
#define IMMUNITY \\Immunity…\\
然后对按键定义如下代码:
[cpp] view plain copy
-
void CImmunityARDlg::OnBtnImmunity()
-
{
-
// TODO: Add your control notification handler code here
-
char szPath[MAX_PATH] = { 0 };
-
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
-
//创建autorun.inf文件夹
-
strcat(szPath, AUTORUN);
-
BOOL bRet = CreateDirectory(szPath,NULL);
-
//盘符无法免疫的情况,可能已经免疫或盘符不可写
-
if(!bRet)
-
{
-
//在MFC中推荐使用AfxMessageBox
-
AfxMessageBox(“Immunity error!”);
-
return;
-
}
-
//创建无法删除的用来进行免疫的文件夹
-
strcat(szPath,IMMUNITY);
-
bRet = CreateDirectory(szPath, NULL);
-
if(!bRet)
-
{
-
AfxMessageBox(“Immunity error!”);
-
}
-
}
接下来是给Cancel按钮添加代码:
[cpp] view plain copy
-
void CImmunityARDlg::OnBtnCancel()
-
{
-
// TODO: Add your control notification handler code here
-
char szPath[MAX_PATH] = { 0 };
-
//删除文件夹Immunity…,其路径为X:\autorun.inf\Immunity…
-
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
-
strcat(szPath, AUTORUN);
-
strcat(szPath, IMMUNITY);
-
RemoveDirectory(szPath);
-
//清空保存有路径信息的数组
-
ZeroMemory(szPath,MAX_PATH);
-
//删除文件夹autorun.inf,其路径为X:\autorun.inf
-
//注意这里的目录需要从里向外一层层删除
-
GetDlgItemText(IDC_COMBO_DRIVER, szPath, MAX_PATH);
-
strcat(szPath, AUTORUN);
-
RemoveDirectory(szPath);
-
}
至此所有代码编写完毕,经实际测试,可以达到相应的效果,这里不再赘述。
五、知识补充
上述程序中用到了ZeroMemory()函数,我以前的程序中为了达到相同的目的,也用过memset()函数,二者的区别在于:
1、ZeroMemory()是微软SDK提供的,memset()是属于C Run-timeLibrary提供的,因此ZeroMemory()只能用于Windows系统,而memset()还可以用于其他系统。
2、ZeroMemory()是一个宏,只是用于把一段内存的内容置零,内部其实是用memset()实现的,而memset()除了对内存清零操作,还可以将内存置成别的字符。
3、如果程序是Win32程序而不想连接CRun-time Library,就用ZeroMemory;如果需要跨平台,就用memset。ZeroMemory相当于memset(buffer,0,length)。
对于AfxMessageBox和MessageBox的区别如下:
1、AfxMessageBox是MFC库提供的全局函数,提供了多种重载形式,而MessageBox是标准的Windows API函数。
2、AfxMessageBox函数在任何类里边都可以使用,而MessageBox()函数只能在CWnd类的继承类中使用。另外,AfxMessageBox()函数的参数没有MessageBox()函数的参数丰富,所以后者较前者灵活。
3、AfxMessageBox不能控制消息框标题,常用于调试程序时的内部数据输出或警告;MessageBox比较正式,常用在要提交的应用程序版本中,可以控制标题内容而不必采用含义不明的可执行文件名为标题。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/17057.html