Ⅰ 網路嗅探器的設計與實現 全代碼 最簡單的就行 最好用java 可以用的加分
主要原理是利用網卡的混雜模式,和乙太網自身的特點進行的。
java寫的話用 JPACAP
Jpcap是一個能夠抓取與發送網路數據包的Java組件。可以使用Jpcap從一個網路介面獲取數據包,然後在Java中對它們進行分析和顯示。同樣也可以通過一個網路介面發送任意數據包。Jpcap當前能夠 捕獲乙太網,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4數據包。
Jpcap實際上並非一個真正去實現對數據鏈路層的控制,而是一個中間件,Jpcap調用wincap/libcap,而給Java語言提供一個公共的介面,從而實現了平台無關性。在官方網站上聲明,Jpcap支持FreeBSD3.x,Linux RedHat6.1, Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系統。
Jpcap的整個結構大體上跟wincap/libpcap是很相像的,例如NetworkInterface類對應wincap的 typedef struct_ADAPTER ADAPTER,getDeviceList()對應pcap_findalldevs()等等。
Jpcap主要的類有如下幾個:
1.NetworkInterface
該類的每一個實例代表一個網路設備,一般就是網卡。這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法以外,沒有定義其它方法。
2.JpcapCaptor
該類提供了一系列靜態方法實現一些基本的功能。該類一個實例代表建立了一個與指定設備的鏈接,可以通過該類的實例來控制設備,例如設定網卡模式、設定過濾關鍵字等等。
3.JpcapSender
該類專門用於控制數據包的發送。
4.Packet
這個是所有其它數據包類的父類。Jpcap所支持的數據包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。
Ⅱ SplitCap的使用
來源:http://www.netresec.com/?page=SplitCap
SplitCap是免費的開源pcap文件分割器。SplitCap根據TCP和UDP會話將一個大型pcap文件拆分為多個文件,每個會話一個pcap文件。SplitCap還可以用於將pcap文件拆分為每個主機對的pcap文件,而不是會話。
SplitCap最好的特點之一就是它的速度非常快!
SplitCap中的TCP和UDP會話概念被定義為雙向流,即所有具有相同5-touple(源主機、目標主機、源埠、目標埠、傳輸協議)的幀/數據包,不管包方向是同一會話的一部分。
SplitCap是使用NET framework 2.0用c#編寫的。在運行SplitCap之前,請確保安裝了它。大多數版本差檔的MS Windows默認設置NET framework 2.0框架。
SplitCap是由Erik Hjelmvik提供的統計協議識別研究項目的一部分,該項目由瑞典互聯網基礎設施基金會(the Swedish Internet Infrastructure Foundation)提供。
SplitCap可以從版本1.5中使用,以便有效地過濾基於一個或多個IP地址或udp埠號的大型PCAP文件。虛指亂簡單地使用「-s nosplit」選項和一個或多個「-埠」或「-ip」開關來指定從大型pcap文件中保留哪些流量。SplitCap執行這種類型的過濾的速度要快得多,而且與tshark相比,它的內存使用更少。
警告:當使用「- yl7」SplitCap提取應用層數據(L7)時,不執行任何適當的TCP會話重新組裝。逗仔這意味著TCP重新傳輸和重疊部分將導致相同的數據寫入兩次。無序的TCP包也會導致應用程序層數據以無序的順序存儲。
可以進行適當的TCP會話重新組裝的應用程序是NetworkMiner和Wireshark。
在我們的博客文章「拆分或過濾您的PCAP文件與SplitCap」中,您可以閱讀更多關於如何使用SplitCap。
使用GUI應用程序分割大型pcap。
是否需要根據流/會話篩選大型pcap文件?那麼請看看我們的CapLoader工具吧。CapLoader可以有效地提取來自大型pcap文件的單個或多個流的完整內容數據。請訪問我們的CapLoader頁面獲取更多信息:
https://www.netresec.com/?page=CapLoader
SplitCap中流保存的信息:
在一個流提取文件中包含了雙向通信中的所有流數據信息,以上是訪問某網站時的雙向流信息.
以下是用wireshark展看的截獲的流數據信息:
Ⅲ java怎麼解析Wireshark抓包文件
Wireshark數據包解析:在Wireshark中關於數據包的叫法有三個術語,分別是幀、包、段。
注意:
如果鏈接另一個Web站點時,客戶端將再次對下一個站點進行DNS查詢(156、157幀),TCP三次握手(158、159、160幀)。
31幀是客戶端請求網路,通過DNS伺服器解析IP地址的過程。標識為「A」記錄。
32幀是DNS伺服器回應客戶端請求的過程。標識為response。
Ⅳ java如何編程實現,獲取固定IP發來所有的數據包
額。。。初看到你的問題的時候嚇了一跳。還以為是用java實現網路嗅探呢。
你問的是socket編程?
那麼socket 均分為兩個,
一部分是服務端,
一部分是客戶端,
服務端一直開啟著監聽,
現在你的情況和平時不太一樣的是,平時,是服務端的ip不變化,而客戶端的變化。而是客戶端給服務端進行發送。
你的情況是相反。客戶端經常變動ip或者埠,而要求服務端發送。
其實轉換一下思路就好了。
有點類似於現在網頁在線聊天工具里的「長連接」思想。
你的那個固定ip伺服器,可以完全不管,你是什麼埠。因為,如果你的電腦准備好接受數據了。那麼你就向服務端發起請求。而服務端將結果發送給你。就是說,不是說伺服器一直給你發送,而是,你這個客戶端只要准備好接受數據,就向伺服器發送請求。這樣,不是沒有問題了么。。
如果還按你那個思路就是,你的電腦,需要實現網路嗅探的部分功能。但是
Java是網路層以上的。
你通過Java的Socket得到的數據包嗅探不出什麼敏感的東東了。
所以Java不適合做網路嗅探。
不過還好,現在有了叫jpcap的工具。你可以搜一下,
下面是一個簡單的實現,裡面獲得了來源的ip和埠 你可以加一個判斷,如果來源ip是固定的ip的話,那麼,你可以獲取對應的數據包
本程序用eclipse編輯在J2SDK6.0+WinPcap 3.1+Jpcap 0.5下編譯運行
/*******************
* JpcapTip.java
*/
package m;
import jpcap.PacketReceiver;
import jpcap.JpcapCaptor;
import jpcap.packet.*;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
//import java.net.InetAddress;
//import java.net.UnknownHostException;
public class JpcapTip implements PacketReceiver {
public void receivePacket(Packet packet) {
System.out.println("********************************************");
/*IP數據報報文頭*/
byte[] l=packet.header;
/*
for (int t=0;t<21;t++){
System.out.print(l[t]+" *** ");
}
*/
String str="";
System.out.print("報文頭 : ");
for (int i=0;i<l.length;i++) {
//str=str+l;
int m=0;
m=l[i];
m=m<<24;
m=m>>>24;
str=str+Integer.toHexString(m);
//System.out.print(" *** "+l[i]);
}
System.out.println(str);
int d=l.length;
System.out.println("首部長度 :"+(d*8)+"bit");
/*分析源IP地址和目的IP地址*/
/*分析協議類型*/
/**
if(packet.getClass().equals(IPPacket.class)) {
IPPacket ipPacket=(IPPacket)packet;
byte[] iph=ipPacket.option;
String iphstr=new String(iph);
System.out.println(iphstr);
}
*/
if(packet.getClass().equals(ARPPacket.class))
{
System.out.println("協議類型 :ARP協議");
try {
ARPPacket arpPacket = (ARPPacket)packet;
System.out.println("源網卡MAC地址為 :"+arpPacket.getSenderHardwareAddress());
System.out.println("源IP地址為 :"+arpPacket.getSenderProtocolAddress());
System.out.println("目的網卡MAC地址為 :"+arpPacket.getTargetHardwareAddress());
System.out.println("目的IP地址為 :"+arpPacket.getTargetProtocolAddress());
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(UDPPacket.class))
{
System.out.println("協議類型 :UDP協議");
try {
UDPPacket udpPacket = (UDPPacket)packet;
System.out.println("源IP地址為 :"+udpPacket.src_ip);
int tport = udpPacket.src_port;
System.out.println("源埠為:"+tport);
System.out.println("目的IP地址為 :"+udpPacket.dst_ip);
int lport = udpPacket.dst_port;
System.out.println("目的埠為:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(TCPPacket.class)) {
System.out.println("協議類型 :TCP協議");
try {
TCPPacket tcpPacket = (TCPPacket)packet;
int tport = tcpPacket.src_port;
System.out.println("源IP地址為 :"+tcpPacket.src_ip);
System.out.println("源埠為:"+tport);
System.out.println("目的IP地址為 :"+tcpPacket.dst_ip);
int lport = tcpPacket.dst_port;
System.out.println("目的埠為:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(ICMPPacket.class))
System.out.println("協議類型 :ICMP協議");
else
System.out.println("協議類型 :GGP、EGP、JGP協議或OSPF協議或ISO的第4類運輸協議TP4");
/*IP數據報文數據*/
byte[] k=packet.data;
String str1="";
System.out.print("數據 : ");
for(int i=0;i<k.length;i++) {
//int m=0;
//m=k[i];
//m=m<<24;
//m=m>>>24;
//str1=str+Integer.toHexString(m);
str1 = new String(k);
//str1=str1+k[i];
//System.out.print(" *** "+k[i]);
}
System.out.println(str1);
System.out.println("數據報類型 : "+packet.getClass());
System.out.println("********************************************");
}
public static void main(String[] args) throws Exception{
// TODO 自動生成方法存根
NetworkInterface[] devices = JpcapCaptor.getDeviceList(); //.getDeviceList();.
//for (int i =0; i<devices.length;i++) {
int a=0;
//try {
/*本地網路信息*/
byte[] b=devices[1].mac_address; //網卡物理地址
//}
//catch() {}
System.out.print("網卡MAC : 00");
for (int j=0;j<b.length;j++){
//a=a<<8;
a=b[j];
a=a<<24;
a=a>>>24;
System.out.print(Integer.toHexString(a));
}
System.out.println();
NetworkInterfaceAddress[] k=devices[1].addresses;
//System.out.println("網卡MAC : "+Integer.toHexString(a));
for(int n=0;n<k.length;n++) {
System.out.println("本機IP地址 : "+k[n].address); //本機IP地址
System.out.println("子網掩碼 : "+k[n].subnet); //子網掩碼
}
System.out.println("網路連接類型 : "+devices[1].datalink_description);
//}
NetworkInterface deviceName = devices[1];
/*將網卡設為混雜模式下用網路設備deviceName*/
JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1); //openDevice(deviceName,1028,false,1);
jpcap.loopPacket(-1,new JpcapTip());
}
}
加油~~