近年來,黑客技術(shù)不斷成熟起來,對(duì)網(wǎng)絡(luò)安全造成了極大的威脅,黑客的主要攻擊手段之一,就是使用木馬技術(shù),滲透到對(duì)方的主機(jī)系統(tǒng)里,從而實(shí)現(xiàn)對(duì)遠(yuǎn)程操作目標(biāo)主機(jī)。 其破壞力之大,是絕不容忽視的,黑客到底是如何制造了這種種具有破壞力的木馬程序呢,下面我對(duì)木馬進(jìn)行源代碼級(jí)的詳細(xì)的分析,讓我們對(duì)木馬的開發(fā)技術(shù)做一次徹底的透視,從了解木馬技術(shù)開始,更加安全的管理好自己的計(jì)算機(jī)。
1、木馬程序的分類
木馬程序技術(shù)發(fā)展至今,已經(jīng)經(jīng)歷了4代,第一代,即是簡單的密碼竊取,發(fā)送等,沒有什么特別之處。第二代木馬,在技術(shù)上有了很大的進(jìn)步,冰河可以說為是國內(nèi)木馬的典型代表之一。第三代木馬在數(shù)據(jù)傳遞技術(shù)上,又做了不小的改進(jìn),出現(xiàn)了ICMP等類型的木馬,利用畸形報(bào)文傳遞數(shù)據(jù),增加了查殺的難度。第四代木馬在進(jìn)程隱藏方面,做了大的改動(dòng),采用了內(nèi)核插入式的嵌入方式,利用遠(yuǎn)程插入線程技術(shù),嵌入DLL線程。或者掛接PSAPI,實(shí)現(xiàn)木馬程序的隱藏,甚至在Windows NT/2000下,都達(dá)到了良好的隱藏效果。相信,第五代木馬很快也會(huì)被編制出來。關(guān)于更詳細(xì)的說明,可以參考ShotGun的文章《揭開木馬的神秘面紗》。
2.木馬程序的隱藏技術(shù)
木馬程序的服務(wù)器端,為了避免被發(fā)現(xiàn),多數(shù)都要進(jìn)行隱藏處理,下面讓我們來看看木馬是如何實(shí)現(xiàn)隱藏的。
說到隱藏,首先得先了解三個(gè)相關(guān)的概念:進(jìn)程,線程和服務(wù)。我簡單的解釋一下。
進(jìn)程:一個(gè)正常的Windows應(yīng)用程序,在運(yùn)行之后,都會(huì)在系統(tǒng)之中產(chǎn)生一個(gè)進(jìn)程,同時(shí),每個(gè)進(jìn)程,分別對(duì)應(yīng)了一個(gè)不同的PID( ID, 進(jìn)程標(biāo)識(shí)符)這個(gè)進(jìn)程會(huì)被系統(tǒng)分配一個(gè)虛擬的內(nèi)存空間地址段,一切相關(guān)的程序操作,都會(huì)在這個(gè)虛擬的空間中進(jìn)行。
線程:一個(gè)進(jìn)程,可以存在一個(gè)或多個(gè)線程,線程之間同步執(zhí)行多種操作,一般地,線程之間是相互獨(dú)立的,當(dāng)一個(gè)線程發(fā)生錯(cuò)誤的時(shí)候,并不一定會(huì)導(dǎo)致整個(gè)進(jìn)程的崩潰。
服務(wù):一個(gè)進(jìn)程當(dāng)以服務(wù)的方式工作的時(shí)候,它將會(huì)在后臺(tái)工作,不會(huì)出現(xiàn)在任務(wù)列表中,但是,在Windows NT/2000下,你仍然可以通過服務(wù)管理器檢查任何的服務(wù)程序是否被啟動(dòng)運(yùn)行。
想要隱藏木馬的服務(wù)器端,可以偽隱藏,也可以是真隱藏。偽隱藏,就是指程序的進(jìn)程仍然存在,只不過是讓他消失在進(jìn)程列表里。真隱藏則是讓程序徹底的消失,不以一個(gè)進(jìn)程或者服務(wù)的方式工作。
偽隱藏的方法,是比較容易實(shí)現(xiàn)的,只要把木馬服務(wù)器端的程序注冊(cè)為一個(gè)服務(wù)就可以了,這樣,程序就會(huì)從任務(wù)列表中消失了,因?yàn)橄到y(tǒng)不認(rèn)為他是一個(gè)進(jìn)程,當(dāng)按下Ctrl+Alt+Delete的時(shí)候,也就看不到這個(gè)程序。但是,這種方法只適用于的系統(tǒng),對(duì)于Windows NT,Windows 2000等,通過服務(wù)管理器,一樣會(huì)發(fā)現(xiàn)你在系統(tǒng)中注冊(cè)過的服務(wù)。難道偽隱藏的方法就真的不能用在Windows NT/2000下了嗎?當(dāng)然還有辦法,那就是API的攔截技術(shù),通過建立一個(gè)后臺(tái)的系統(tǒng)鉤子,攔截PSAPI的等相關(guān)的函數(shù)來實(shí)現(xiàn)對(duì)進(jìn)程和服務(wù)的遍歷調(diào)用的控制,當(dāng)檢測(cè)到進(jìn)程ID(PID)為木馬程序的服務(wù)器端進(jìn)程的時(shí)候直接跳過,這樣就實(shí)現(xiàn)了進(jìn)程的隱藏,金山詞霸等軟件,就是使用了類似的方法,攔截了,函數(shù),來截獲屏幕輸出,實(shí)現(xiàn)即時(shí)翻譯的。同樣,這種方法也可以用在進(jìn)程隱藏上。
當(dāng)進(jìn)程為真隱藏的時(shí)候,那么這個(gè)木馬的服務(wù)器部分程序運(yùn)行之后,就不應(yīng)該具備一般進(jìn)程,也不應(yīng)該具備服務(wù)的,也就是說,完全的溶進(jìn)了系統(tǒng)的內(nèi)核。也許你會(huì)覺得奇怪,剛剛不是說一個(gè)應(yīng)用程序運(yùn)行之后,一定會(huì)產(chǎn)生一個(gè)進(jìn)程嗎?的確,所以我們可以不把他做成一個(gè)應(yīng)用程序,而把他做為一個(gè)線程,一個(gè)其他應(yīng)用程序的線程,把自身注入其他應(yīng)用程序的地址空間。而這個(gè)應(yīng)用程序?qū)τ谙到y(tǒng)來說,是一個(gè)絕對(duì)安全的程序,這樣,就達(dá)到了徹底隱藏的效果,這樣的結(jié)果,導(dǎo)致了查殺黑客程序難度的增加。
出于安全考慮,我只給出一種通過注冊(cè)服務(wù)程序,實(shí)現(xiàn)進(jìn)程偽隱藏的方法,對(duì)于更復(fù)雜,高級(jí)的隱藏方法,比如遠(yuǎn)程線程插入其他進(jìn)程的方法,請(qǐng)參閱ShotGun的文章《NT系統(tǒng)下木馬進(jìn)程的隱藏與檢測(cè)》。
WINAPI WinMain(, , LPSTR, int)
try
DWORD = ();//取得Windows的版本號(hào)
if ( >= ) // Windows 9x隱藏任務(wù)列表
int ( *rsp)(DWORD,DWORD);
dll=(".DLL");//裝入.DLL
rsp=(int( *)(DWORD,DWORD))(dll,"ss");//找到ss的入口
rsp(NULL,1);//注冊(cè)服務(wù)
(dll);//釋放DLL模塊
catch ( &)//處理異常事件
//處理異常事件
return 0;
3、程序的自加載運(yùn)行技術(shù)
讓程序自運(yùn)行的方法比較多,除了最常見的方法:加載程序到啟動(dòng)組,寫程序啟動(dòng)路徑到注冊(cè)表的///Windows//Run的方法外,還有很多其他的辦法,據(jù)yagami講,還有幾十種方法之多,比如可以修改Boot.ini,或者通過注冊(cè)表里的輸入法鍵值直接掛接啟動(dòng),通過修改.exe啟動(dòng)參數(shù)等等的方法,真的可以說是防不勝防,下面展示一段通過修改///Windows//Run鍵值來實(shí)現(xiàn)自啟動(dòng)的程序:
自裝載部分:
HKEY hkey;
=(sys)+("+PName/">//")+PName
long k;
k=KEY;
(,
"http:////WINDOWS////RUN//",
0L,
NULL,
ILE,|,
NULL,
&hkey,&k);
(hkey,
"",
0,
REG_SZ,
.c_str(),
.Length());
(hkey);
if (int((Handle,
"open",
.c_str(),
NULL,
NULL,
SW_HIDE))>32)
=true;
Close();
else
HKEY hkey;
long k;
k=KEY;
long a=(,
"http:////WINDOWS////RUN",
0,
NULL,
ILE,
,NULL,
&hkey,&k);
(hkey,
"",
0,
REG_SZ,
.c_str(),
.Length());
int num=0;
char str[20];
DWORD lth=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD Suc;
do{
Suc=(,
(DWORD)num,str,
NULL,
&type,
strv,&vl);
if (strcmp(str,"BGroup")==0)
((strv));
(,"BGroup");
break;
}while(Suc== );
(hkey);
自裝載程序的卸載代碼:
int num;
char str2[20];
DWORD lth=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD Suc;
do{
Suc=(,
(DWORD)num,
str,
NULL,
&type,
strv,
&vl);
if (strcmp(str,"BGroup")==0)
((strv));
(,"BGroup");
break;
}while(Suc== )
HKEY hkey;
long k;
k=KEY;
(,
"http:////WINDOWS////RUN",
0,
NULL,
ILE,
,NULL,
&hkey,
&k);
do{
Suc=(hkey,(DWORD)num,str,if (strcmp(str,"")==0)
((strv));
(,"");
break;
}while(Suc== )
(hkey);
其中自裝載部分使用C++ Builder可以這樣寫,會(huì)比較簡化:
& regKey = *new ();
regKey.RootKey=;
regKey.OpenKey("http:////Windows////Run",true);
if(!regKey.(" Server"))
regKey.(" Server",
"D://Program Files//Borland////BIN//.exe");
regKey.();
delete ?Key;
4、木馬程序的建立連接的隱藏
木馬程序的數(shù)據(jù)傳遞方法有很多種,其中最常見的要屬TCP,UDP傳輸數(shù)據(jù)的方法了,通常是利用Winsock與目標(biāo)機(jī)的指定端口建立起連接,使用send和recv等API進(jìn)行數(shù)據(jù)的傳遞,但是由于這種方法的隱蔽性比較差,往往容易被一些工具軟件查看到,最簡單的,比如在命令行狀態(tài)下使用netstat命令,就可以查看到當(dāng)前的活動(dòng)TCP,UDP連接。
C:/ and /bigball>netstat -n
Active
Proto Local Address Foreign Address State
TCP 192.0.0.9:1032 64.4.13.48:1863
TCP 192.0.0.9:1112 61.141.212.95:80
TCP 192.0.0.9:1135 202.130.239.223:80
TCP 192.0.0.9:1142 202.130.239.223:80
TCP 192.0.0.9:1162 192.0.0.8:139
TCP 192.0.0.9:1169 202.130.239.159:80
TCP 192.0.0.9:1170 202.130.239.133:80
C:/ and /bigball>netstat -a
Active
Proto Local Address Foreign Address State
TCP Liumy:echo Liumy:0
TCP Liumy:discard Liumy:0
TCP Liumy:daytime Liumy:0
TCP Liumy:qotd Liumy:0
TCP Liumy:chargen Liumy:0
TCP Liumy:epmap Liumy:0
TCP Liumy:-ds Liumy:0
TCP Liumy:1025 Liumy:0
TCP Liumy:1026 Liumy:0
TCP Liumy:1031 Liumy:0
TCP Liumy:1032 Liumy:0
TCP Liumy:1112 Liumy:0
TCP Liumy:1135 Liumy:0
TCP Liumy:1142 Liumy:0
TCP Liumy:1801 Liumy:0
TCP Liumy:3372 Liumy:0
TCP Liumy:3389 Liumy:0
TCP Liumy:netbios-ssn Liumy:0
TCP Liumy:1028 Liumy:0
TCP Liumy:1032 :1863 ESTAB
TCP Liumy:1112 :http ESTABLI
TCP Liumy:1135 202.130.239.223:http
TCP Liumy:1142 202.130.239.223:http
TCP Liumy:1162 W3I:netbios-ssn
TCP Liumy:1170 202.130.239.133:http
TCP Liumy:2103 Liumy:0
TCP Liumy:2105 Liumy:0
TCP Liumy:2107 Liumy:0
UDP Liumy:echo *:*
UDP Liumy:discard *:*
UDP Liumy:daytime *:*
UDP Liumy:qotd *:*
UDP Liumy:chargen *:*
UDP Liumy:epmap *:*
UDP Liumy:snmp *:*
UDP Liumy:-ds *:*
UDP Liumy:1027 *:*
UDP Liumy:1029 *:*
UDP Liumy:3527 *:*
UDP Liumy:4000 *:*
UDP Liumy:4001 *:*
UDP Liumy:1033 *:*
UDP Liumy:1148 *:*
UDP Liumy:netbios-ns *:*
UDP Liumy:netbios-dgm *:*
UDP Liumy:isakmp *:*
但是,黑客還是用種種手段躲避了這種偵察,就我所知的方法大概有兩種,一種是合并端口法,也就是說,使用特殊的手段,在一個(gè)端口上同時(shí)綁定兩個(gè)TCP或者UDP連接,這聽起來不可思議,但事實(shí)上確實(shí)如此,而且已經(jīng)出現(xiàn)了使用類似方法的程序,通過把自己的木馬端口綁定于特定的服務(wù)端口之上,(比如80端口的HTTP,誰懷疑他會(huì)是木馬程序呢?)從而達(dá)到隱藏端口的目地。另外一種辦法,是使用ICMP( Control Message )協(xié)議進(jìn)行數(shù)據(jù)的發(fā)送,原理是修改ICMP頭的構(gòu)造,加入木馬的控制字段,這樣的木馬,具備很多新的特點(diǎn),不占用端口的特點(diǎn),使用戶難以發(fā)覺,同時(shí),使用ICMP可以穿透一些防火墻,從而增加了防范的難度。之所以具有這種特點(diǎn),是因?yàn)镮CMP不同于TCP,UDP,ICMP工作于網(wǎng)絡(luò)的應(yīng)用層不使用TCP協(xié)議。關(guān)于網(wǎng)絡(luò)層次的結(jié)構(gòu),下面給出圖示:
網(wǎng)絡(luò)層次結(jié)構(gòu)圖
5、發(fā)送數(shù)據(jù)的組織方法
關(guān)于數(shù)據(jù)的組織方法,可以說是數(shù)學(xué)上的問題。關(guān)鍵在于傳遞數(shù)據(jù)的可靠性,壓縮性,以及高效行。木馬程序,為了避免被發(fā)現(xiàn),必須很好的控制數(shù)據(jù)傳輸量,一個(gè)編制較好的木馬,往往有自己的一套傳輸協(xié)議,那么程序上,到底是如何組織實(shí)現(xiàn)的呢?下面,我舉例包裝一些協(xié)議:
typedef struct{ //定義消息結(jié)構(gòu)
//char ip[20];
char Type; //消息種類
char [20]; //密碼
int CNum; //消息操作號(hào)
//int Length; //消息長度
}Msg;
#define MsgLen sizeof(Msg)
//-------------------------------------------
//對(duì)話框數(shù)據(jù)包定義:.h
//-------------------------------------------
//定義如下消息類型:
#define 4//連接事件
#define 5//發(fā)送完成事件
//消息結(jié)構(gòu)
typedef struct{
char Name[20];//對(duì)話框標(biāo)題
char Msg[256];//對(duì)話框消息內(nèi)容
};
#define sizeof()//消息單元長度
//------------------------------------------
//聊天數(shù)據(jù)包定義:.h
//------------------------------------------
//定義如下消息類型:
#define 0//連接事件
#define 1//接入事件
#define 2//結(jié)束事件
#define 16//確認(rèn)對(duì)話內(nèi)容收到
//消息結(jié)構(gòu)
typedef struct{
char [20];//Client自定義的名稱
char Msg[256];//發(fā)送的消息
};
#define sizeof()//消息單元長度
//------------------------------------------
//重啟數(shù)據(jù)包定義:.h
//------------------------------------------
//定義如下消息類型:
#define 15//重啟事件
//------------------------------------------
//目錄結(jié)構(gòu)請(qǐng)求數(shù)據(jù)包定義:.h
//------------------------------------------
//定義如下消息類型:
#define 17
#define 18
typedef struct{
char Dir[4096];//你要的目錄名
};
#define sizeof()
// TCP的Msg
typedef struct{ //定義消息結(jié)構(gòu)
char SType; //消息種類
char [20]; //密碼
//int SNum; //消息操作號(hào)
char *AllMsg;
}SMsg;
#define SMsgLen sizeof(SMsg)
#define 19
#define 21
#define 22
#define 23
#define 24
#define 25//tcp接收消息,udp請(qǐng)求消息
#define 26
//-------------------------
//鼠標(biāo)指針隱藏和顯示控制
//-------------------------
#define 27//設(shè)置消息
#define 28//成功消息
typedef struct{
bool ;
};
#define en sizeof()
黑客知識(shí)系列之木馬程序隱身的技術(shù)
最基本的隱藏:不可見窗體+隱藏文件
木馬程序無論如何神秘,但歸根究底,仍是Win32平臺(tái)下的一種程序。Windows下常見的程序有兩種:
1.Win32應(yīng)用程序(Win32 ),比如QQ、Office等都屬于此行列。
2.Win32控制臺(tái)程序(Win32 Console),比如硬盤引導(dǎo)修復(fù)程序FixMBR。
其中,Win32應(yīng)用程序通常會(huì)有應(yīng)用程序界面,比如系統(tǒng)中自帶的“計(jì)算器”就有提供各種數(shù)字按鈕的應(yīng)用程序界面。木馬雖然屬于Win32應(yīng)用程序,但其一般不包含窗體或隱藏了窗體(但也有某些特殊情況,如木馬使用者與被害者聊天的窗口),并且將木馬文件屬性設(shè)置為“隱藏”,這就是最基本的隱藏手段,稍有經(jīng)驗(yàn)的用戶只需打開“任務(wù)管理器”,并且將“文件夾選項(xiàng)”中的“顯示所有文件”勾選即可輕松找出木馬,于是便出現(xiàn)了下面要介紹的“進(jìn)程隱藏”技術(shù)。
第一代進(jìn)程隱藏技術(shù):Windows 98的后門
在Windows 98中,微軟提供了一種能將進(jìn)程注冊(cè)為服務(wù)進(jìn)程的方法。盡管微軟沒有公開提供這種方法的技術(shù)實(shí)現(xiàn)細(xì)節(jié)(因?yàn)閃indows的后續(xù)版本中沒有提供這個(gè)機(jī)制),但仍有高手發(fā)現(xiàn)了這個(gè)秘密,這種技術(shù)稱為ss。只要利用此方法,任何程序的進(jìn)程都能將自己注冊(cè)為服務(wù)進(jìn)程,而服務(wù)進(jìn)程在Windows 98中的任務(wù)管理器中恰巧又是不顯示的,所以便被木馬程序鉆了空子。
要對(duì)付這種隱藏的木馬還算簡單,只需使用其他第三方進(jìn)程管理工具即可找到其所在,并且采用此技術(shù)進(jìn)行隱藏的木馬在Windows 2000/XP(因?yàn)椴恢С诌@種隱藏方法)中就得現(xiàn)形!中止該進(jìn)程后將木馬文件刪除即可。可是接下來的第二代進(jìn)程隱藏技術(shù),就沒有這么簡單對(duì)付了。
第二代進(jìn)程隱藏技術(shù):進(jìn)程插入
在Windows中,每個(gè)進(jìn)程都有自己的私有內(nèi)存地址空間,當(dāng)使用指針(一種訪問內(nèi)存的機(jī)制)訪問內(nèi)存時(shí),一個(gè)進(jìn)程無法訪問另一個(gè)進(jìn)程的內(nèi)存地址空間,就好比在未經(jīng)鄰居同意的情況下,你無法進(jìn)入鄰居家吃飯一樣。比如QQ在內(nèi)存中存放了一張圖片的數(shù)據(jù),而MSN則無法通過直接讀取內(nèi)存的方式來獲得該圖片的數(shù)據(jù)。這樣做同時(shí)也保證了程序的穩(wěn)定性,如果你的進(jìn)程存在一個(gè)錯(cuò)誤,改寫了一個(gè)隨機(jī)地址上的內(nèi)存,這個(gè)錯(cuò)誤不會(huì)影響另一個(gè)進(jìn)程使用的內(nèi)存。
你知道嗎——進(jìn)程(Process)是什么
對(duì)應(yīng)用程序來說,進(jìn)程就像一個(gè)大容器。在應(yīng)用程序被運(yùn)行后,就相當(dāng)于將應(yīng)用程序裝進(jìn)容器里了,你可以往容器里加其他東西(如:應(yīng)用程序在運(yùn)行時(shí)所需的變量數(shù)據(jù)、需要引用的DLL文件等),當(dāng)應(yīng)用程序被運(yùn)行兩次時(shí),容器里的東西并不會(huì)被倒掉,系統(tǒng)會(huì)找一個(gè)新的進(jìn)程容器來容納它。
一個(gè)進(jìn)程可以包含若干線程(Thread),線程可以幫助應(yīng)用程序同時(shí)做幾件事(比如一個(gè)線程向磁盤寫入文件,另一個(gè)則接收用戶的按鍵操作并及時(shí)做出反應(yīng),互相不干擾),在程序被運(yùn)行后中,系統(tǒng)首先要做的就是為該程序進(jìn)程建立一個(gè)默認(rèn)線程,然后程序可以根據(jù)需要自行添加或刪除相關(guān)的線程。
1.進(jìn)程插入是什么
獨(dú)立的地址空間對(duì)于編程人員和用戶來說都是非常有利的。對(duì)于編程人員來說,系統(tǒng)更容易捕獲隨意的內(nèi)存讀取和寫入操作。對(duì)于用戶來說,操作系統(tǒng)將變得更加健壯,因?yàn)橐粋€(gè)應(yīng)用程序無法破壞另一個(gè)進(jìn)程或操作系統(tǒng)的運(yùn)行。當(dāng)然,操作系統(tǒng)的這個(gè)健壯特性是要付出代價(jià)的,因?yàn)橐帉懩軌蚺c其他進(jìn)程進(jìn)行通信,或者能夠?qū)ζ渌M(jìn)程進(jìn)行操作的應(yīng)用程序?qū)⒁щy得多。但仍有很多種方法可以打破進(jìn)程的界限,訪問另一個(gè)進(jìn)程的地址空間,那就是“進(jìn)程插入”(Process )。一旦木馬的DLL插入了另一個(gè)進(jìn)程的地址空間后,就可以對(duì)另一個(gè)進(jìn)程為所欲為,比如下文要介紹的盜QQ密碼。
2.木馬是如何盜走QQ密碼的
普通情況下,一個(gè)應(yīng)用程序所接收的鍵盤、鼠標(biāo)操作,別的應(yīng)用程序是無權(quán)“過問”的。可盜號(hào)木馬是怎么偷偷記錄下我的密碼的呢?木馬首先將1個(gè)DLL文件插入到QQ的進(jìn)程中并成為QQ進(jìn)程中的一個(gè)線程,這樣該木馬DLL就赫然成為了QQ的一部分!然后在用戶輸入密碼時(shí),因?yàn)榇藭r(shí)木馬DLL已經(jīng)進(jìn)入QQ進(jìn)程內(nèi)部,所以也就能夠接收到用戶傳遞給QQ的密碼鍵入了,真是“家賊難防”啊!
3.如何插入進(jìn)程
(1)使用注冊(cè)表插入DLL
早期的進(jìn)程插入式木馬的伎倆,通過修改注冊(cè)表中的[///Windows NT//Windows/]來達(dá)到插入進(jìn)程的目的。缺點(diǎn)是不實(shí)時(shí),修改注冊(cè)表后需要重新啟動(dòng)才能完成進(jìn)程插入。
(2)使用掛鉤(Hook)插入DLL
比較高級(jí)和隱蔽的方式,通過系統(tǒng)的掛鉤機(jī)制(即“Hook”,類似于DOS時(shí)代的“中斷”)來插入進(jìn)程(一些盜QQ木馬、鍵盤記錄木馬以Hook方式插入到其他進(jìn)程中“偷雞摸狗”),需要調(diào)用函數(shù)(也是一個(gè)Win32 API函數(shù))。缺點(diǎn)是技術(shù)門檻較高,程序調(diào)試?yán)щy,這種木馬的制作者必須具有相當(dāng)?shù)腤in32編程水平。
你知道嗎——什么是API
Windows中提供各種功能實(shí)現(xiàn)的接口稱為Win32 API( ,即“應(yīng)用程序編程接口”),如一些程序需要對(duì)磁盤上的文件進(jìn)行讀寫,就要先通過對(duì)相應(yīng)的API(文件讀寫就要調(diào)用文件相關(guān)的API)發(fā)出調(diào)用請(qǐng)求,然后API根據(jù)程序在調(diào)用其函數(shù)時(shí)提供的參數(shù)(如讀寫文件就需要同時(shí)給出需要讀寫的文件的文件名及路徑)來完成請(qǐng)求實(shí)現(xiàn)的功能,最后將調(diào)用結(jié)果(如寫入文件成功,或讀取文件失敗等)返回給程序。
(3)使用遠(yuǎn)程線程函數(shù)()插入DLL
在Windows 2000及以上的系統(tǒng)中提供了這個(gè)“遠(yuǎn)程進(jìn)程”機(jī)制,可以通過一個(gè)系統(tǒng)API函數(shù)來向另一個(gè)進(jìn)程中創(chuàng)建線程(插入DLL)。缺點(diǎn)很明顯,僅支持Windows 2000及以上系統(tǒng),在國內(nèi)仍有相當(dāng)多用戶在使用Windows 98,所以采用這種進(jìn)程插入方式的木馬缺乏平臺(tái)通用性。
木馬將自身作為DLL插入別的進(jìn)程空間后,用查看進(jìn)程的方式就無法找出木馬的蹤跡了,你能看到的僅僅是一些正常程序的進(jìn)程,但木馬卻已經(jīng)偷偷潛入其中了。解決的方法是使用支持“進(jìn)程模塊查看”的進(jìn)程管理工具(如“Windows優(yōu)化大師”提供的進(jìn)程查看),木馬的DLL模塊就會(huì)現(xiàn)形了。
不要相信自己的眼睛:恐怖的進(jìn)程“蒸發(fā)”
嚴(yán)格地來講,這應(yīng)該算是第2.5代的進(jìn)程隱藏技術(shù)了,可是它卻比前幾種技術(shù)更為可怕得多。這種技術(shù)使得木馬不必將自己插入到其他進(jìn)程中,而可以直接消失!
它通過Hook技術(shù)對(duì)系統(tǒng)中所有程序的進(jìn)程檢測(cè)相關(guān)API的調(diào)用進(jìn)行了監(jiān)控,“任務(wù)管理器”之所以能夠顯示出系統(tǒng)中所有的進(jìn)程,也是因?yàn)槠湔{(diào)用了等進(jìn)程相關(guān)的API函數(shù),進(jìn)程信息都包含在該函數(shù)的返回結(jié)果中,由發(fā)出調(diào)用請(qǐng)求的程序接收返回結(jié)果并進(jìn)行處理(如“任務(wù)管理器”在接收到結(jié)果后就在進(jìn)程列表中顯示出來)。
而木馬由于事先對(duì)該API函數(shù)進(jìn)行了Hook,所以在“任務(wù)管理器”(或其他調(diào)用了列舉進(jìn)程函數(shù)的程序)調(diào)用函數(shù)時(shí)(此時(shí)的API函數(shù)充當(dāng)了“內(nèi)線”的角色),木馬便得到了通知,并且在函數(shù)將結(jié)果(列出所有進(jìn)程)返回給程序前,就已將自身的進(jìn)程信息從返回結(jié)果中抹去了。就好比你正在看電視節(jié)目,卻有人不知不覺中將電視接上了DVD,你在不知不覺中就被欺騙了。
所以無論是“任務(wù)管理器”還是殺毒軟件,想對(duì)這種木馬的進(jìn)程進(jìn)行檢測(cè)都是徒勞的。這種木馬目前沒有非常有效的查殺手段,只有在其運(yùn)行前由殺毒軟件檢測(cè)到木馬文件并阻止其病毒體的運(yùn)行。當(dāng)時(shí)還有一種技術(shù)是由木馬程序?qū)⑵渥陨淼倪M(jìn)程信息從Windows系統(tǒng)用以記錄進(jìn)程信息的“進(jìn)程鏈表”中刪除,這樣進(jìn)程管理工具就無法從“進(jìn)程鏈表”中獲得木馬的進(jìn)程信息了。但由于缺乏平臺(tái)通用性而且在程序運(yùn)行時(shí)有一些問題,所以沒有被廣泛采用。
你知道嗎——什么是Hook
Hook是Windows中提供的一種用以替換DOS下“中斷”的一種系統(tǒng)機(jī)制,中文譯名為“掛鉤”或“鉤子”。在對(duì)特定的系統(tǒng)事件(包括上文中的特定API函數(shù)的調(diào)用事件)進(jìn)行Hook后,一旦發(fā)生已Hook的事件,對(duì)該事件進(jìn)行Hook的程序(如:木馬)就會(huì)收到系統(tǒng)的通知,這時(shí)程序就能在第一時(shí)間對(duì)該事件做出響應(yīng)(木馬程序便搶在函數(shù)返回前對(duì)結(jié)果進(jìn)行了修改)。
毫無蹤跡:全方位立體隱藏
利用剛才介紹的Hook隱藏進(jìn)程的手段,木馬可以輕而易舉地實(shí)現(xiàn)文件的隱藏,只需將Hook技術(shù)應(yīng)用在文件相關(guān)的API函數(shù)上即可,這樣無論是“資源管理器”還是殺毒軟件都無法找出木馬所在了。更令人吃驚的是,現(xiàn)在已經(jīng)有木馬(如:灰鴿子)利用該技術(shù)實(shí)現(xiàn)了文件和進(jìn)程的隱藏。要防止這種木馬最好的手段仍是利用殺毒軟件在其運(yùn)行前進(jìn)行攔截。
跟殺毒軟件對(duì)著干:反殺毒軟件外殼
木馬再狡猾,可是一旦被殺毒軟件定義了特征碼,在運(yùn)行前就被攔截了。要躲過殺毒軟件的追殺,很多木馬就被加了殼,相當(dāng)于給木馬穿了件衣服,這樣殺毒軟件就認(rèn)不出來了,但有部分殺毒軟件會(huì)嘗試對(duì)常用殼進(jìn)行脫殼,然后再查殺(小樣,別以為穿上件馬夾我就不認(rèn)識(shí)你了)。除了被動(dòng)的隱藏外,最近還發(fā)現(xiàn)了能夠主動(dòng)和殺毒軟件對(duì)著干的殼,木馬在加了這種殼之后,一旦運(yùn)行,則外殼先得到程序控制權(quán),由其通過各種手段對(duì)系統(tǒng)中安裝的殺毒軟件進(jìn)行破壞,最后在確認(rèn)安全(殺毒軟件的保護(hù)已被瓦解)后由殼釋放包裹在自己“體內(nèi)”的木馬體并執(zhí)行之。對(duì)付這種木馬的方法是使用具有脫殼能力的殺毒軟件對(duì)系統(tǒng)進(jìn)行保護(hù)。
你知道嗎——什么是殼
顧名思義,你可以很輕易地猜到,這是一種包在外面的東西。沒錯(cuò),殼能夠?qū)⑽募?比如EXE)包住,然后在文件被運(yùn)行時(shí),首先由殼獲得控制權(quán),然后釋放并運(yùn)行包裹著的文件體。很多殼能對(duì)自己包住的文件體進(jìn)行加密,這樣就可以防止殺毒軟件的查殺。比如原先殺毒軟件定義的該木馬的特征是“12345”,如果發(fā)現(xiàn)某文件中含有這個(gè)特征,就認(rèn)為該文件是木馬,而帶有加密功能的殼則會(huì)對(duì)文件體進(jìn)行加密(如:原先的特征是“12345”,加密后變成了“54321”,這樣殺毒軟件當(dāng)然不能靠文件特征進(jìn)行檢查了)。脫殼指的就是將文件外邊的殼去除,恢復(fù)文件沒有加殼前的狀態(tài)。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。