Java編寫代理服務器(Burp攔截Demo)一

大家都知道大名鼎鼎的BurpSuite代理神器,對于抓取HTTP請求非常好用,偶然,一朋友問我Java應該如何去編寫代理服務器(因為他想做某些東西),有沒有相關的API 去實現,我想說,差不多你能想到的,JAVA都可以做到,沒有任何一門成熟的語言是垃圾的。

在編寫代理服務器之前,首先應該明白一點,Java的代理機制,如圖1-1所示。

那么Java就處于中間這層代理服務器,代理服務器所作的事情如下:

1、接收客戶端請求,進行處理,然后發送給服務端

2、接收服務端響應,進行處理,然后發送給客戶端

這樣,就更清晰了,Java給我們提供了代理的API為,java.net.Proxy類。此類表示代理設置,通常為類型(http、socks)和套接字地址。Proxy 是不可變對象。

也就是說Java可以制作高級協議的代理,如 HTTP 或 FTP。也可以制作SOCKS(V4 或 V5)代理。

在基本的概念說完之后,來實際操作一把,分為兩個步驟,第一部分,讓JAVA程序使用代理服務器,第二步部分,讓我們的Java程序像BurpSuite一樣,來做一個HTTP的代理服務器吧。

首先,使用到了URL類,HttpURLConnection類及其我們的代理類Proxy類。他們都位于java.net包中。

第一步:生成代理,指定端口為8888:

Proxy?proxy?=?null?;
proxy?=?new?Proxy(Proxy.Type.HTTP,new?InetSocketAddress("127.0.0.1",8888));??//?實例化本地代理對象,端口為8888

第二步:使用URLConnection類進行連接www.moonsos.com

URL?url?=?new?URL("http://www.moonsos.com");??//實例化米安網URL類
HttpURLConnection?action?=?(HttpURLConnection)url.openConnection(proxy);??//使用代理打開網頁

第三步:打開URL,并且讀取HTML源碼

HttpURLConnection?action?=?(HttpURLConnection)url.openConnection(proxy);??//使用代理打開網頁
InputStream?in?=action.getInputStream();
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(in,"UTF-8"));
StringBuilder?sb?=?new?StringBuilder();
String?lin?=?System.getProperty("line.separator")?;
for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){
sb.append(temp+lin);
}
br.close();
in.close();
System.out.println(sb);

效果執行圖,如圖1-2所示。

完整代碼示例如下:

import?java.net.*?;
import?java.io.*?;
public?class?ProxyTest{
public?static?void?main(String?args[])throws?Exception{
Proxy?proxy?=?null?;
proxy?=?new?Proxy(Proxy.Type.HTTP,new?InetSocketAddress("127.0.0.1",8888));??//?實例化本地代理對象,端口為8888
URL?url?=?new?URL("http://www.moonsos.com");
HttpURLConnection?action?=?(HttpURLConnection)url.openConnection(proxy);??//使用代理打開網頁
InputStream?in?=action.getInputStream();
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(in,"UTF-8"));
StringBuilder?sb?=?new?StringBuilder();
String?lin?=?System.getProperty("line.separator")?;
for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){
sb.append(temp+lin);
}
br.close();
in.close();
System.out.println(sb);
}
}

第一部分我們學會了Java如何使用代理程序,那么第二部分就看Java制作代理服務器。

第一步,生成Socket類,作為代理服務器

ServerSocket?server??=?new?ServerSocket(8888);??//建立本地代理服務器,端口為8888

第二步,等待連接,也就是等待使用代理程序的用戶進入,如果沒有用戶進入那么,將會一直在此等待。

Socket socket =server. accept(); ? //等待客戶端連接

第三步,當用戶進來后,查看用戶數據發送的請求,這里新做了一個ActionScoket類,多線程,專門用來處理Scoket輸入流,代碼如下所所示。

ServerSocket?server??=?new?ServerSocket(8888);
while(true){
Socket?socket?=?server.accept();
ActionSocket?ap?=?new?ActionSocket(socket);
ap.start();
}
ActionSocket代碼如下:
class?ActionSocket?extends?Thread{
private?Socket?socket?=?null?;
public?ActionSocket(Socket?s){
this.socket?=?s?;
}
public?void?run(){
try{
this.action()?;
}catch(Exception?e){
e.printStackTrace();
}
}
public?void?action()?throws?Exception?{
if?(this.socket?==?null){
return?;
}
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(this.socket.getInputStream()));
for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){
System.out.println(temp);
}
br.close();
}
}

完成代碼如下:

import?java.net.*?;
import?java.io.*?;
class?ActionSocket?extends?Thread{
private?Socket?socket?=?null?;
public?ActionSocket(Socket?s){
this.socket?=?s?;
}
public?void?run(){
try{
this.action()?;
}catch(Exception?e){
e.printStackTrace();
}
}
public?void?action()?throws?Exception?{
if?(this.socket?==?null){
return?;
}
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(this.socket.getInputStream()));
for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){
System.out.println(temp);
}
br.close();
}
}
public?class?ServerPrxoy{
public?static?void?main(String?args[])throws?Exception{
ServerSocket?server??=?new?ServerSocket(8888);
while(true){
Socket?socket?=?server.accept();
ActionSocket?ap?=?new?ActionSocket(socket);
ap.start();
}
}
}

給火狐,搜狗等瀏覽器配置代理,如圖1-3所示:

OK,配置完畢,進行訪問http://www.moonsos.com,可以發現我們寫的小程序已經能夠進行抓取到HTTP協議信息,如圖1-4所示。

當獲取HTTP請求之后,我想后面的東西就不用說了吧。無非就是對HTTP請求進行分析,封裝。然后在時候Socket發送。獲取到信息之后,在使用當前的Socket以打印流的方式輸出到瀏覽器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql實戰33 | 我查這么多數據,會不會把數據庫內存打爆?

我經常會被問到這樣一個問題:我的主機內存只有 100G,現在要對一個 200G 的大表做全表掃描,會不會把數據庫主機的內存用光了?這個問題確實值得擔心,被系統 OOM(out of memory)可不是鬧著玩的。但…

[BZOJ2125]最短路

Description 給一個N個點M條邊的連通無向圖,滿足每條邊最多屬于一個環,有Q組詢問,每次詢問兩點之間的最短路徑。 Input 輸入的第一行包含三個整數,分別表示N和M和Q 下接M行,每行三個整數v,u,w表…

Rabbit MQ windows下安裝

Rabbit MQ 是建立在強大的Erlang OTP平臺上,因此安裝Rabbit MQ的前提是安裝Erlang。通過下面兩個連接可以下載安裝最新的版本: 下載并安裝 Eralng OTP For Windows otp_win64_18.3.exe(erlang的環境)運行安裝 Rabbit MQ Serve…

spark集群配置以及java操作spark小demo

spark 安裝配置使用java來操作sparkspark 安裝 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoop2.7.tgz mv spark-2.4.0-bin-hadoop2.7 sparksudo vim /etc/profileexport SPARK_HOME/usr/local/stormexport PATH$PATH:$SPARK_HOME/binsource /etc/profile…

C++筆記(3)——string.h相關的一些小知識

strlen() 用于得到字符數組中第一個\0前的字符的個數&#xff0c;格式如下&#xff1a; strlen(數組); 例子&#xff1a; #include <stdio.h> #include <string.h>int main(){char str[10];gets(str);int len strlen(str);printf("%d\n", len);return 0…

最近發現系統rabbitmq丟消息比較嚴重,于是想了些方案來查找原因,給將消息發送方式添加確認機制。 我們在本地模擬了wms發送打標消息的場景. 1. 有事務 2. 先發點對點隊列, 再發訂

最近發現系統rabbitmq丟消息比較嚴重&#xff0c;于是想了些方案來查找原因&#xff0c;給將消息發送方式添加確認機制。 我們在本地模擬了wms發送打標消息的場景. 1. 有事務 2. 先發點對點隊列, 再發訂閱隊列 3. 批量發送 4. 在生產環境與測試環境的RabbitMQ都進行了測試 …

uoj#388. 【UNR #3】配對樹(線段樹合并)

傳送門 先考慮一個貪心&#xff0c;對于一條邊來說&#xff0c;如果當前這個序列中在它的子樹中的元素個數為奇數個&#xff0c;那么這條邊就會被一組匹配經過&#xff0c;否則就不會 考慮反證法&#xff0c;如果在這條邊兩邊的元素個數都是偶數&#xff0c;那么至少有兩組匹配…

一道Js判斷對象是否相等面試題引發的故事

話說&#xff0c;說什么呢&#xff0c;先看下題吧還是、 function checkName(data) { if (data { name: LIMING }) { console.log("one"); 復制代碼 } else if (data { name: LIMING }) { console.log(two"); 復制代碼 } else { console.log("three&quo…

序列化

什么是序列化&#xff1f;為什么要實現序列化&#xff1f;有什么作用&#xff1f; 序列化就是把具體的對象轉化成二進制的字節碼文件進行存儲或網絡傳輸。反過來就是反序列化。 將要存儲或網絡傳輸的對象必須實現序列化才可以。 如果一個類已經實現了序列…

搭建Hive平臺

http://www.cnblogs.com/gpcuster/archive/2010/02/24/1672635.html Hive是一個基于Hadoop的數據倉庫平臺。通過hive&#xff0c;我們可以方便地進行ETL的工作。hive定義了一個類似于SQL的查詢語言&#xff1a;HQL&#xff0c;能夠將用戶編寫的QL轉化為相應的Mapreduce程序基于…

Java語言與sikuli配合

很早之前寫過一篇介紹sikuli的文章。本文簡單介紹如何在java中使用sikuli進自動化測試。 圖形腳本語言sikuli sikuli IDE可以完成常見的單擊、右擊、移動到、拖動等鼠標操作&#xff0c;java引用sikuli-script.jar同樣可以執行這些常見的鼠標操作&#xff0c;因此即可方便的編寫…

列表生成式,生成器表達式,模塊的使用

三元表達式 無論條件成立與否都要返回一個值, 用于簡化僅有一個判斷的函數(或代碼塊)遞歸 遞歸有循環調用的次數限制,調用函數時,函數相關數據要入棧,而棧區是有限的 二分查找法匿名函數 僅能在定義時使用一次,定義完了就沒了 參數沒有括號,不能有return,會自…

C#怎么用代碼模擬手機去訪問手機網站抓取數據

WebClient client new WebClient ();client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");更改user-agent為手機瀏覽器的。模擬谷歌Android&#xff1a;user-agent"Mozilla/5.0 (Linux; …

angular6 iframe應用

問題一、 iframe如何自適應屏幕高度 解決思路&#xff1a;通過設置iframe外層父元素高度等于window高度&#xff0c;再相對于父元素定位iframe元素&#xff1b;案例如下&#xff1a; 第一步: 模板文件中使用iframe // demo.component.html <div style"position: relati…

jquery下載地址:https://code.jquery.com/jquery/ 影響范圍: 版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷,可能導致LOCA

jquery下載地址&#xff1a;https://code.jquery.com/jquery/ 影響范圍&#xff1a; 版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷&#xff0c;可能導致LOCATION.HASH跨站漏洞 已測試成功版本&#xff1a; jquery-1.6.min.js&#xff0c;jquery-1.6.1.min…

Myeclipse常用快捷鍵

2019獨角獸企業重金招聘Python工程師標準>>> Ctrl1 快速修復 CtrlD: 刪除當前行 CtrlQ 定位到最后編輯的地方 CtrlL 定位在某行 CtrlO 快速顯示 OutLine CtrlT 快速顯示當前類的繼承結構 CtrlW 關閉當前Editer CtrlK 快速定位到下一個 CtrlE 快速顯示當前Edi…

數字三角形

問題描述 &#xff08;圖&#xff13;.&#xff11;&#xff0d;&#xff11;&#xff09;示出了一個數字三角形。 請編一個程序計算從頂至底的某處的一條路徑&#xff0c;使該路徑所經過的數字的總和最大。●每一步可沿左斜線向下或右斜線向下走&#xff1b;●1&#xff1c;三…

版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷

jquery下載地址&#xff1a;https://code.jquery.com/jquery/ 影響范圍&#xff1a; 版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷&#xff0c;可能導致LOCATION.HASH跨站漏洞 已測試成功版本&#xff1a; jquery-1.6.min.js&#xff0c;jquery-1.6.1.min.…

RabbitMQ學習總結(6)——消息的路由分發機制詳解

2019獨角獸企業重金招聘Python工程師標準>>> 一、Routing(路由) (using the Java client)在前面的學習中&#xff0c;構建了一個簡單的日志記錄系統&#xff0c;能夠廣播所有的日志給多個接收者&#xff0c;在該部分學習中&#xff0c;將添加一個新的特點&#xff0…

Kaggle爆文:一個框架解決幾乎所有機器學習問題

上周一個叫 Abhishek Thakur 的數據科學家&#xff0c;在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem&#xff0c;介紹他建立的一個自動的機器學習框架&#xff0c;幾乎可以解決任何機器學習問題&#xff0c;項目很快也會發布出來。 這篇…