【问题标题】:Java Socket Packet InterceptionJava Socket 数据包拦截
【发布时间】:2020-10-16 17:19:14
【问题描述】:

我正在尝试用 Java 编写一个拦截数据/数据包的套接字程序。

我已经用python成功写了这个:

import socket

def createListener(port):
    srvSock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
    srvSock.bind(('localhost', port))
    srvSock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
    while True:
        raw_data, addr = srvSock.recvfrom(65536)
        print('data: ' , raw_data)

createListener(80)

这是我的基本 Java 套接字程序

public static void main(String[] args) {
        try{
            ServerSocket ss = new ServerSocket(80);
            Socket s = ss.accept();
            DataInputStream dis = new DataInputStream(s.getInputStream());
            String str = (String)dis.readUTF();
            System.out.println("data: "+str);
            ss.close();
        } catch(IOException i){
            System.out.println(i);
        }

    }

但是,在运行时,它不会像 python 程序那样拦截所有通过网络端口移动的数据。具体来说,Python 脚本中的这一行 srvSock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 使套接字能够侦听端口并捕获/拦截通过它的全部数据。

我根本找不到这种语法的 Java 替代方案或任何解决我的问题的方法。 对于如何使用套接字拦截网络端口上的数据包,我将不胜感激。

谢谢

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    我相当确定您尝试做的事情无法用 Java 完成。看起来您正在尝试使用“混杂模式”,但 Java 套接字无法以混杂模式启动。 Java 套接字是一种端到端的实现:它们不能在网络端口上侦听所有流量。当然,网络端口必须处于混杂模式,但我认为 Java 不是您的正确选择。

    我能想到的唯一可能能让你到达那里的方法是使用类似JNI 的本地调用,但我什至不知道从哪里开始。

    这是我发现的一个非常老的帖子,有点相关:java socket and web programing

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2019-03-23
      • 2012-02-22
      • 2013-11-21
      相关资源
      最近更新 更多