一、U盘病毒和autorun.inf文件
目前U盘病毒的最大特征是利用autorun.inf这个自动运行文件来侵入,autorun.inf相当于一个传染途径,经过这个途径入侵的病毒,理论上可以是“任何”病毒。因此大家可以在网上发现,当搜索到autorun.inf之后,附带的病毒往往有不同的名称。
autorun.inf文件本身是一个常规且合理的文件和技术。在Windows XP以及之前的Windows 98等系统中,需要让光盘、U盘插入到机器时自动运行的话,就要靠autorun.inf。它是保存在驱动器根目录下的一个隐藏的系统文件,里面包含一些简单的命令,例如,告诉系统这个新插入的光盘或硬件盘符图标改成某个路径下的icon,指定系统自动启动什么程序等。
因此,在autorun.inf文件中,既可以放置正常的启动程序,如经常使用的各种教学光盘,使其一插入电脑就自动安装或自动演示,也可以放置任何可能的恶意内容。病毒作者或传播者就是利用了这一点,让移动设备在用户系统完全不知情的情况下,“自动”执行某个命令或恶意程序。
借助于autorun.inf文件,病毒有了启动方法,病毒作者还需要将病毒主体放进U盘里才能让其运行。如何将病毒隐藏在一般情况下看不到的地方呢?一种是假回收站方式:通常在U盘中建立一个名为“Recycler”的文件夹,然后把病毒藏在里面很深的目录中,一般人以为这就是回收站了,而事实上回收站的名称是“Recycled”。另一种是假冒杀毒软件方式:病毒在U盘中改名为“RavMonE.exe”,让人以为是瑞星杀毒软件的程序。
二、U盘病毒程序的设计与实现
1.病毒程序功能
在VC6.0的环境下,编程实现一个简单的U盘病毒程序U_security2.exe。该病毒程序的主要功能是:第一次运行U_security2程序后,如果在系统路径下没有aaaaa.exe,则在系统路径下每5秒钟创建这个进程(aaaaa.exe其实是U_security2.exe的拷贝),不断地占用机器的内存。同时修改注册表,使其在系统启动时自运行。同时如果U盘里没有autorun.inf或bbbbb.exe,则在U盘里创建,其中bbbbb.exe也是U_security2.exe的拷贝,autorun.inf则用来激活bbbbb.exe。在Windows任务管理器的进程表里会发现并没有U_security2.exe这个进程,而是出现了名为aaaaa.exe的进程,这是因为程序中的CopyToSysAndSet(HWND hwnd)函数里使用SendMessage(hwnd,WM_CLOSE,0,0)把进程U_security2结束了。
然后,当这个被感染了病毒(bbbbb.exe)的U盘插入其他机器时,双击U盘会打不开,而且每双击一次U盘,就会每隔5秒钟创建一个进程aaaaa.exe不停地占用系统内存,使得系统运行速度越来越慢。只有单击“打开”选项才能打开该U盘,并且弹出U盘时系统会提示“无法停止通用卷设备”,原因在于,autorun.inf调用并启动潜伏在U盘中的bbbbb.exe进程,即相当于U盘中有进程在运行,故只有在进程表中找到相应进程并删除以后,才可以弹出U盘。
2.病毒程序建立步骤
运行VC++后,选择“文件”→“新建”菜单命令,打开应用程序向导,显示出“新建”对话框。单击“工程”标签,从列表中选中Win32 Application项。
在工程名称框中输入Win32应用程序项目名称U_security2并选择合适的文件夹。
单击“确定”按钮继续,选中An empty project项,单击“完成”→“确定”。
再次选择“文件”→“新建”菜单命令,单击“文件”标签,选择C++ Source File项,输入文件名U_main,单击“确定”按钮,在其中编写相应的代码。
3.病毒程序分析
该程序主要由头文件、预定义、函数及变量定义、函数实现代码组成,部分代码如下:
……
#pragma comment(lib,"shlwapi.lib") //连入库文件
#define TIMER 1//计时器
//以下是函数的定义及声明:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程
TCHAR FirstDriveFromMask (ULONG unitmask); //获取盘符
//病毒从U盘启动时用到的函数
BOOL FileExist(TCHAR *path);//测试一个文件是否存在
BOOL GetSelfPath(TCHAR *path);//得到病毒路径
BOOL GetSysPath(TCHAR *path);//得到系统路径
BOOL CopyToSysAndSet(HWND hwnd);//把程序路径复制到系统目录并设置文件属性
BOOL SetFileAttrib(TCHAR *path);//设置path所指文件的属性
BOOL RegAutoRun(TCHAR *path);//修改注册表,使系统启动时自动运行aaaaa.exe
//从C盘启动时用到的函数
BOOL CopyToUAndSet();//复制Autorun.inf和bbbbb.exe到U盘并设置文件属性
BOOL CreateAutoRunFile(TCHAR *path);//在U盘下生成autorun.inf文件
BOOL FindSelf();//测试aaaaa.exe是否已经在执行了
//全局变量和常量的定义及声明
TCHAR szExePath[MAX_PATH];
TCHAR szSysPath[MAX_PATH];
TCHAR U[2];
const TCHAR *szExeName="bbbbb.exe";
const TCHAR *szSysName="aaaaa.exe";
const TCHAR *szAutoRunFile="autorun.inf";
其中,全局变量szExePath[MAX_PATH]用于保存病毒路径;szSysPath[MAX_PATH]用于保存系统路径;U[2]用于保存U盘的盘符。常量szExeName代表在U盘创建的进程的名称;szSysName代表在系统下创建的进程的名称,可在进程表中看到;szAutoRunFile代表在U盘下创建的病毒的名称:autorun.inf。
在窗口过程WndProc中由SetTimer(hwnd,TIMER,5000,0)函数调用时钟映射WM_TIMER,在它里面定义了CopyToSysAndSet(HWND hwnd),创建一个aaaaa.exe进程。在SetTimer()函数里有一个参数值为5000,意为5000ms,即每隔5s调用一次WM_TIMER。故可以每隔5秒创建一个aaaaa.exe进程。各函数之间的关系图1所示。
图1 各函数之间的关系
这是一个Windows应用程序,首先得在WinMain里创建窗口,但是本程序不需要显示窗口,所以在程序中对窗口属性作了些设置,没有让窗口显示出来。属性设置如下:
hwnd = CreateWindow (szAppName, "U盘AutoRun病毒示例",
WS_DISABLED, //窗口样式
0,0, //窗口最初的x位置、y位置
0,0, //窗口最初的x大小、y大小
NULL, NULL, hInstance, NULL);
hwnd是窗口句柄,窗口样式设置为WS_DISABLED,不可见。
窗口过程WndProc包括四个消息映射:WM_CREATE(窗口创建产生的消息);WM_TIMER(时钟映射,在WM_CREATE里已经定义了SetTimer来启动它)主要对C盘进行操作,在C盘每隔5秒钟就会创建一个进程aaaaa.exe,直至点击“确定”退出;WM_DEVICECHANGE(检测U盘插入拔出的消息映射)主要对U盘进行操作,首先读U盘盘符,然后在U盘创建autorun.inf和bbbbb.exe进程;WM_DESTROY(窗口关闭产生的消息)。
aaaaa.exe进程、autorun.inf和bbbbb.exe进程的作用及关系。其实aaaaa.exe和bbbbb.exe都是U_security2.exe的拷贝,它们只是文件名不一样而已。autorun.inf和bbbbb.exe是写在U盘里的,autorun.inf是病毒的发起者,通过调用bbbbb.exe实现病毒入侵,aaaaa.exe进程是病毒入侵的表现,它会不停地占用主机器的内存。
程序通过CreateAutoRunFile(TCHAR *path)函数在U盘建立一个autorun.inf文件,内容为:
[AutoRun]
open=szExeName
shellexecute=szExeName
shell\\Auto\\command=szExeName
shell=Auto
其中szExeName的值为"bbbbb.exe"。
当已经被同时写入autorun.inf和bbbbb.exe这两个文件的U盘插入一台没有防御的电脑时,若双击U盘打开,那么就中毒了。这时autorun.inf调用了bbbbb.exe,把aaaaa.exe写入系统路径下,同时修改注册表,让系统在启动时能自动调用aaaaa.exe,达到了病毒传播的目的,整个过程如图2所示。
图2 双击U盘后病毒的传播
4.程序运行结果
为了清楚地知道程序都做了些什么事情,笔者在程序的某些关键地方加了消息对话框。编译运行后,程序出现如下界面:
(1)每隔5秒钟,在C盘创建进程aaaaa.exe,如图3所示。
图3 创建进程
(2)插入U盘后,获取U盘盘符。
(3)现在查看一下Windows任务管理器进程,将会发现多了aaaaa.exe进程(如图4所示),它的个数等同于在第(1)步里看到的图3的个数。
图4 查看进程
(4)打开U盘,发现在U盘里已创建了autorun.inf及bbbbb.exe隐藏文件,如图5所示。
图5 创建的文件
(5)接下来,将这个感染了病毒的U盘插入其他电脑,会发现双击U盘打不开,然后同样会每隔5秒钟创建一个进程,如图6所示。
图6 双击U盘之后的效果
三、U盘免疫程序
1.免疫程序功能
若在U盘中创建一个名为autorun.inf的空文件夹而不是autorun.inf文件,则U盘就可以对autorun.inf病毒进行免疫。可在VC 6.0下实现了这一功能。
2.免疫程序分析
程序部分代码如下:
#include <windows.h>
#include "Shlwapi.h"
#include <Dbt.h>
#pragma comment(lib,"shlwapi.lib") //连入库文件
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程
TCHAR FirstDriveFromMask (ULONG unitmask); //获取U盘盘符
BOOL CopyToUAndSet();//利用CreateDirectory函数建立名为autorun.inf的空文件夹
BOOL SetFileAttrib(TCHAR *path);//设置path所指文件的属性
TCHAR U[2]; //全局变量U[2]用于保存U盘的盘符
const TCHAR *szAutoRunFile="autorun.inf"; //szAutoRunFile代表用于病毒免疫的文件夹名。
各函数之间的关系如图7所示。
WndProc(这是窗口过程,程序主要从这里执行) |
FirstDriveFromMask (ULONG unitmask);//获取U盘盘符
CopyToUAndSet(); //在U盘建立名为autorun.inf的空文件夹 |
SetFileAttrib(TCHAR *path);//设置path所指文件的属性 |
OnDeviceChange();//检测U盘插入拔出的消息映射 |
图7 函数之间的关系图
首先在WinMain里创建窗口,本程序不需要显示窗口,所以在程序中同样对窗口属性作了些设置,没有让窗口显示出来。
窗口过程WndProc包括三个消息映射:WM_CREATE(窗口创建产生的消息);WM_DEVICECHANGE(检测U盘插入拔出的消息映射)主要对U盘进行操作,插入U盘后读取U盘盘符,然后在U盘创建autorun.inf空文件夹,实现对autorun.inf病毒的免疫;WM_DESTROY(窗口关闭产生的消息)。
3.程序运行结果
编译运行后,插入U盘,获取U盘盘符,如图8所示。
图8
程序执行完接着会显示“U盘免疫成功”或者“此盘已进行了免疫”(U盘里已存在名为autorun.inf的文件夹),如图9和图10所示。
图9 图10
打开U盘,可看到已存在名为autorun.inf的文件夹,如图11所示。
图11
四、U盘免疫功能的验证
下面对U盘免疫程序的功能进行验证。
1.当U盘没有免疫时
运行U_security2这个病毒程序,会发现U盘里出现了autorun.inf自动运行文件及名为bbbbb的进程、U盘的初始状态(如图12所示)和运行了程序U_security2之后屏幕显示(如图13所示)。
图12 图13
用“U盘病毒防护盒”软件可检测到病毒存在(如图14所示),该软件可以将其删除(如图15所示)。可以看出,bbbbb.exe为autorun.inf病毒自动运行的路径。
图14 图15
2.U盘进行了免疫
此时再运行病毒程序的话,情况就不一样了:autorun.inf根本写不进U盘。这时运行病毒程序后再用U盘病毒防护盒检测后发现,这时虽然有bbbbb.exe存在,但由于没有激活autorun.inf文件,因此不会对计算机造成威胁(如图16所示)。
图16
五、结语
通过本实例,分析了U盘病毒程序以及免疫程序的工作原理。平时在使用U盘的时候,除了进行U盘病毒的免疫外,如何更好地进行安全防护,我们可以从以下几点来考虑:
修改计算机系统中的注册表,将系统各个磁盘的自动运行功能禁止。也可使用Windows组策略功能,方法是在“开始”菜单的“运行”框中运行“gpedit.msc”命令,在“组策略”找到“计算机配置”和“用户配置”下的“管理模板”功能,打开其中的“系统”菜单中的“关闭自动播放”的设置,在其属性里面选择“已启用”,接着选择“所有驱动器”,最后确定保存即可。尽量不要使用双击打开U盘,而是选择右键打开。注意使用系统中防病毒软件的“实时监控”功能,避免病毒文件入侵感染。打开“文件夹”选项中“隐藏受保护的操作系统文件”选项,并选择“显示所有文件和文件夹”选项,以便U盘被感染后能及时发现病毒。
|