当前位置: 首页 > 知识库问答 >
问题:

后端 - C#/Java如何捕捉指定Process的网络封包?

东郭宏朗
2023-07-04

我有用过 wireshark 它是监控指定网卡的所有网路流动
我想要监控的是指定Windows 的 app process
并能用C#/Java/C等做成背景程序监控并做相对应的逻辑处理(如发警报、保存数据到DB)


以下是询问AI结果,感觉也是监控网卡不是监控单一的程序、软体


在C#和Java中,你可以使用第三方的库来捕捉指定进程的网络封包。以下是两种常用的方法:

  1. 使用SharpPcap(C#)或jpcap(Java)这样的库,它们是对libpcap的封装,可以使用它们来捕获网络封包。
  • 对于C#,你可以使用SharpPcap库,它可以让你监听指定网卡上的网络流量。你可以使用GetAllDevices()方法获取可用的网卡列表,然后选择要监听的网卡。接下来,你可以使用LibPcapLiveDevice类创建一个设备实例,并注册一个回调函数来处理捕获到的封包。在回调函数中,你可以获取每个封包的数据,然后进行相应的处理逻辑。
var devices = LibPcapLiveDeviceList.Instance;
var device = devices[0]; // 选择要监听的网卡
device.OnPacketArrival += new PacketArrivalEventHandler(PacketArrived);
device.Open(DeviceMode.Promiscuous, 1000);
device.StartCapture();

...

private void PacketArrived(object sender, CaptureEventArgs e)
{
    // 处理捕获到的封包
}
  • 对于Java,你可以使用jpcap库。你可以使用JpcapCaptor.getDeviceList()方法获取可用的网卡列表,然后选择要监听的网卡。接下
    来,你可以使用JpcapCaptor.openDevice(selectedDevice, snapLen, promiscuous, timeout)方法打开选择的设备,并设置一些参数,例如抓包长度、是否开启混杂模式和超时时间。

然后,你可以使用loopPacket()方法开始捕获封包,并传入一个PacketReceiver对象作为处理捕获到的封包的回调函数。

以下是一个使用jpcap库捕获封包的简单示例:

JpcapCaptor captor;
NetworkInterface[] devices = JpcapCaptor.getDeviceList();

// 选择要监听的网卡
NetworkInterface selectedDevice = devices[0];

try {
    // 打开选择的网卡并设置参数
    captor = JpcapCaptor.openDevice(selectedDevice, 65535, false, 20);
    
    // 创建一个实现PacketReceiver接口的回调函数对象
    PacketReceiver packetReceiver = new PacketReceiver() {
        @Override
        public void receivePacket(Packet packet) {
            // 处理捕获到的封包
        }
    };
    
    // 开始捕获封包
    captor.loopPacket(-1, packetReceiver);
} catch (IOException e) {
    e.printStackTrace();
}

请注意,上述示例仅提供了基本的捕获封包的代码框架,你还需要根据自己的需求来处理捕获到的封包,例如进行协议解析、数据分析等。


共有1个答案

章振
2023-07-04

你可以用Windows Filtering Platform (WFP) API来实现对进程的网络流量的监控。但是呢WFP是Windows的原生API,只能通过C++调用,不能直接在C#或者Java里用

 类似资料:
  • 问题内容: 是否可以在Java命令行应用程序中捕获+ 信号?我想在终止程序之前清理一些资源。 问题答案: 您可以将关闭挂钩连接到VM,只要VM关闭,该挂钩便会运行: Java虚拟机将响应以下两种事件而关闭: 当最后一个非守护程序线程退出时,或者调用exit(等效于System.exit)方法时,程序将正常退出,或者 响应于用户中断(例如键入+ )或系统范围的事件(例如用户注销或系统关闭)来终止虚拟

  • 我有一个有4个参数的类。还有一个测试,将空对象放入。有可能捕捉到这个空值吗?我的意思是,有些测试将IlligalArgumentException放在了一起。所以,如果我尝试用try-catch块捕捉这个空对象,对于整个costructor块,这个可以工作,但其他测试会崩溃,反之亦然。

  • 问题内容: 我听说捕捞被认为是不好的作法。我当前正在加载一个不能保证在PATH上的.dll,并希望在不存在的情况下切换到用户配置的位置。 有更好的方法吗?还是在这里接受是可以接受的? 问题答案: 除了提供有关如何从技术上解决问题的建议以外,我想花点时间解释一下为什么它首先被认为是“不好的做法”。 让我们从澄清什么是类开始。 在Java中,将引发错误和异常(它们是主要类型)。通过使用关键字可以完成上

  • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

  • 问题内容: 我想我很近。我将htaccess重定向到网站(前端/网络)和路径()。该网站看起来不错,正在加载CSS文件等。 如果您访问以下网址:http:// localhost / yii2app / -它会加载主页,并且不会在地址栏中重定向,但该页面会在所有URL中显示frontend / web。 如果您访问以下网址:http:// localhost / yii2app / admin-

  • 问题内容: 我有一个很大的数学表达式,必须动态创建。例如,一旦我已经解析了“东西”,结果就会像一个字符串:。 因此,为了计算该表达式的结果,我使用的是函数…… 这里的问题是,有时我会收到错误消息,说被零除,并且我不知道如何捕获该异常。我已经尝试过类似的事情: 要么: 但这行不通。因此,如何避免被零除的应用程序崩溃? 编辑: 首先,我想澄清一下:表达式是动态构建的,因此如果分母为零,我不能仅仅求值。