【问题标题】:Creating Java Proxy MITM创建 Java 代理 MITM
【发布时间】:2013-09-11 15:23:33
【问题描述】:

我正在尝试创建一个 Java 程序作为代理来查看来自传入源的数据包以进行调试。为此,我创建了一个简单的 Java 服务器应用程序并在设备上编辑了我的主机文件。到目前为止一切正常,(甚至是我的 Relay 类文件),但我正试图将其变成一个成熟的代理。如何合并元素以将数据发送到服务器,并将响应发送回客户端?有点像中间人类型的东西。

import java.net.*;
import java.io.*;
import org.ini4j.Ini;

public class RelayMultiClient extends Thread {
    private Socket socket = null;
    Socket relay = null;

    public RelayMultiClient(Socket socket) {
    super("RelayMultiClient");
    this.socket = socket;
    }

    public void run() {

    try {
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                    socket.getInputStream()));
        if(Relay.max_clients == Relay.connected_clients) {
            //There are too many clients on the server.
            System.out.println("Connection refused from " + socket.getRemoteSocketAddress() + ": Too many clients connected!");
            out.close();
            in.close();
            socket.close();
        }
        else {
            Ini ini = new Ini(new File("settings.ini"));
            Relay.connected_clients++;
            System.out.println("Connection from client " + socket.getRemoteSocketAddress() + " established. Clients Connected: " + Relay.connected_clients);
            while (in.readLine() != null) {
                //Send data to the server
                //Receive data from server and send back to client
            }
            System.out.println("Connection from client " + socket.getRemoteSocketAddress() + " lost.");
            Relay.connected_clients--;
            out.close();
            in.close();
            socket.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}

谢谢, 克里斯

P.S:我不是在尝试获取 HTTP 数据,而是在尝试从我创建的游戏中获取数据。我不知道这种类型的数据是否需要任何额外的处理。

【问题讨论】:

    标签: java proxy man-in-the-middle


    【解决方案1】:

    如何合并元素以将数据发送到服务器,并将响应发送回客户端?

    尝试以下示例作为基本代理:

    public class Proxy {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(1230); // proxy port
            Socket socket = serverSocket.accept();
            Socket relay = new Socket("localhost", 1234); // server address
            new ProxyThread(relay.getInputStream(), socket.getOutputStream()).start();
            new ProxyThread(socket.getInputStream(), relay.getOutputStream()).start();
        }
    }
    
    class ProxyThread extends Thread {
        private InputStream inputStream;
        private OutputStream outputStream;
    
        ProxyThread(InputStream inputStream, OutputStream outputStream) {
            this.inputStream = inputStream;
            this.outputStream = outputStream;
        }
    
        public void run() {
            try {
                int i;
                while ((i = inputStream.read()) != -1) {
                    outputStream.write(i);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    缺乏适当的异常处理,仅展示基本思想。

    【讨论】:

    • 感谢您的帮助,但似乎没有用。我已经快速设置了另一个 java 服务器,并尝试像这样连接 java 代理,并且建立了连接,但是没有任何东西被发送到该服务器。我假设 serverWriter 变量不正确。我拥有它,就像你拥有它一样。 Writer serverWriter = new OutputStreamWriter(relay.getOutputStream()); BufferedReader serverIn = new BufferedReader(new InputStreamReader(relay.getInputStream()));
    • 你是对的,只是我这边的一个错字。更正后的版本对您有用吗?
    • 我已经用您的更正版本更新了我的代码。我的另一个 java 服务器(不是代理)说连接已经建立,尽管没有通过 serverWriter.write() 发送任何内容。谢谢:)!
    • 我什至尝试过直接连接到服务器(不是代理)并且它可以工作。所以这是代理的问题。
    • 那一定是服务器和客户端之间的协议,不是基于文本的,而是二进制的。请尝试更新版本,它应该能够处理二进制和文本协议。
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2014-02-24
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多