在Java
中,我正在使用pcap4J
来捕获计算机上运行的另一个应用程序的网络流量。我用于执行此操作的代码如下:
import org.pcap4j.core.*;
import org.pcap4j.packet.Packet;
import org.pcap4j.util.NifSelector;
import java.io.IOException;
import static org.pcap4j.core.BpfProgram.BpfCompileMode.OPTIMIZE;
import static org.pcap4j.core.PcapNetworkInterface.PromiscuousMode.PROMISCUOUS;
public class Pcap4jLoop
{
public static void main(String[] arguments) throws Exception
{
PcapNetworkInterface networkDevice = getNetworkDevice();
try (PcapHandle handle = networkDevice.openLive(65536, PROMISCUOUS, 50))
{
String serverIP = "..."; // Filter for packets with just one server
String bpfExpression = "dst host " + serverIP + " || src host " + serverIP;
handle.setFilter(bpfExpression, OPTIMIZE);
PacketListener listener = packet -> printPacket(packet, handle);
handle.loop(Integer.MAX_VALUE, listener);
//noinspection InfiniteLoopStatement,StatementWithEmptyBody
while (true)
{
}
}
}
private static PcapNetworkInterface getNetworkDevice() throws IOException
{
NifSelector nifSelector = new NifSelector();
PcapNetworkInterface nif = nifSelector.selectNetworkInterface();
if (nif == null)
{
System.exit(1);
}
return nif;
}
private static void printPacket(Packet packet, PcapHandle pcapHandle)
{
StringBuilder sb = new StringBuilder();
sb.append("A packet captured at ")
.append(pcapHandle.getTimestampPrecision())
.append(":");
System.out.println(sb);
System.out.println(packet);
}
}
不幸的是,流量是加密的,因此无法进行分析。但是,另一个名为Fiddler
的应用程序可以对流量进行解密,而无需服务器的任何特殊配置或私钥。 Fiddler可以显示我感兴趣的正在交换的JSON
结构。如何在Java
代码中执行相同的操作才能使用捕获的JSON
对象? (这个问题是关于解密部分的,而不是随后的解析)
答案 0 :(得分:1)
评论者对此问题的看法:
根据定义,您无法解密任何
TLS
流量(因此,其中包括HTTPS
),如果您不控制任何一方或可以控制任何一方 方给您协商的主密钥和客户端随机使用的密钥。只是试图解密 随机的TLS
流量将是不可能的。Fiddler
是通过 中间人,而不是通过解密直接在中间人之间发送的流量 另外两台计算机。尽管Fiddler
不需要特殊配置,客户端 需要特殊的配置,即需要信任证书Fiddler
用于动态创建证书的权限。