❶ 有誰知道怎樣使用java編寫ping程序
jpcap你要自己下好相應的包和配置,不知道的就在網上搜吧··
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.EthernetPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.IPPacket;
public class JPing {
private NetworkInterface[] devices = JpcapCaptor.getDeviceList();
private JpcapSender sender;
private JpcapCaptor jpcap;
private ICMPPacket icmpPacket;
private List<String> listResult = new ArrayList<String>();
/**
* 組織ICMP報文發送,並開啟線程接收報純塌文做森圓
* @param ip
*/
public void ping(String ip) {
try {
jpcap = JpcapCaptor.openDevice(devices[0], 200, false, 20);
sender = jpcap.getJpcapSenderInstance();
jpcap.setFilter("icmp", true);// 過濾器,只接受ICMP報文
icmpPacket = new ICMPPacket();
icmpPacket.type = ICMPPacket.ICMP_ECHO; // 發送回顯請求報文
icmpPacket.setIPv4Parameter(0, false, false, false, 0, false,
false, false, 0, 1010101, 100, IPPacket.IPPROTO_ICMP,
devices[0].addresses[1].address, InetAddress.getByName(ip));
// 隨意的32bytes數據
icmpPacket.data = "春悔".getBytes();
EthernetPacket ethernetPacket = new EthernetPacket();
ethernetPacket.frametype = EthernetPacket.ETHERTYPE_IP;
ethernetPacket.src_mac = devices[0].mac_address;
// 廣播地址
ethernetPacket.dst_mac = new byte[] { (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
icmpPacket.datalink = ethernetPacket;
listResult.add("Pinging " + icmpPacket.dst_ip + " with "
+ icmpPacket.data.length + " bytes of data: ");
startCapThread(jpcap);
for (int i = 0; i < 5; i++) {
icmpPacket.sec = 0;
//icmpPacket.usec = System.currentTimeMillis();
icmpPacket.usec = new GregorianCalendar().getTimeInMillis();// 記錄發送時間
icmpPacket.seq = (short) (1000 + i);
icmpPacket.id = (short) (999 + i);
sender.sendPacket(icmpPacket);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 接收ICMP報文
* @param jpcap
*/
public void getIcmpPacket(JpcapCaptor jpcapCaptor) {
try {
while (true) {
long tmp = 0;
String tmpStr = null;
ICMPPacket rp;
rp = (ICMPPacket) jpcapCaptor.getPacket();
if ((rp != null) && (rp.seq - rp.id == 1)
&& (rp.type == ICMPPacket.ICMP_ECHOREPLY)) {// 若是ICMP回應報文,則列出。。。
tmp = (rp.sec * 1000 + rp.usec / 1000 - icmpPacket.sec
* 1000 - icmpPacket.usec); // 計算發送與接受的時間差
if (tmp <= 0)
tmpStr = " < 1 ms ";
else
tmpStr = "= " + tmp + " ms ";
System.out.println("Reply from "
+ rp.src_ip.getHostAddress() + ": bytes = "
+ rp.data.length + " time " + tmpStr + "TTL = "
+ rp.hop_limit);
listResult.add("Reply from " + rp.src_ip.getHostAddress()
+ ": bytes = " + rp.data.length + " time " + tmpStr
+ "TTL = " + rp.hop_limit);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 接收ICMP報文
* @param jpcap
*/
public void startCapThread(final JpcapCaptor jpcap) {
Runnable runner = new Runnable() {
public void run() {
getIcmpPacket(jpcap);
}
};
new Thread(runner).start();
}
public static void main(String[] args) {
new JPing().ping("www..com");
}
}
❷ 有沒有辦法在Eclipse下用純java實現URL訪問限制。
純java代碼自己寫的話可以直接寫銀悉fileter實現,也可以藉助已有的框架spring中掘鬧的Security來實鋒散乎現
❸ JAVA中如何訪問ICMP,另外JAVA與Raw Socket的關系如何
一、JAVA訪問ICMP
下載需要的包http://netresearch.ics.uci.e/kfujii/jpcap/doc/index.html上可以下到最新的jpcap,你只需要把lib中的dll文件拷貝到jre的bin目錄,同時lib中的jar文件拷貝到jre中的lib/ext目錄下就安裝完整,做腔當然你可以使用exe安裝包進行安裝,這樣會更加的簡單。
編碼你可以使用任何你喜歡的ide工具,但是必須禪胡枯把jpcap.jar加到classpath中,否則無法編譯通過。icmp有很多類型,當前僅用echo類型為例,也就是我們通過用的ping工具所產生的網路行為。
二、以下為詳細代碼。
import java.net.InetAddress;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.EthernetPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.IPPacket;
class ICMP
{
public static void main(String[] args) throws java.io.IOException{
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
if(args.length<1){
System.out.println("Usage: java ICMP <device index (e.g., 0, 1..)>");
for(int i=0;i<devices.length;i++)
System.out.println(i+":"+devices[i].name+"("+devices[i].description+")");
System.exit(0);
}
int index=Integer.parseInt(args[0]);
//開啟網路設備
JpcapCaptor captor=JpcapCaptor.openDevice(devices[index],2000,false,3000);
//設置只過濾 icmp包賀洞
captor.setFilter("icmp",true);
JpcapSender sender=captor.getJpcapSenderInstance();
ICMPPacket p=new ICMPPacket();
p.type=ICMPPacket.ICMP_ECHO;
p.seq=(short)0x0005;
p.id=(short)0x0006;
p.setIPv4Parameter(0,false,false,false,0,false,false,false,0,1010101,100,IPPacket.IPPROTO_ICMP,
InetAddress.getByName("192.168.1.30"),InetAddress.getByName("192.168.1.1"));
p.data="".getBytes();
EthernetPacket ether=new EthernetPacket();
ether.frametype=EthernetPacket.ETHERTYPE_IP;
//填寫自己和對方的mac地址,必須要正確填寫,如果有錯誤將無法收到回包
ether.dst_mac=new byte[]{(byte)0x00,(byte)0x03,(byte)0x2d,(byte)0x02,(byte)0xd1,(byte)0x69};
ether.src_mac=new byte[]{(byte)0x08,(byte)0x00,(byte)0x46,(byte)0xad,(byte)0x3c,(byte)0x12};
p.datalink=ether;
sender.sendPacket(p);
System.out.println("send...");
ICMPPacket rp= null;
while(true){
rp=(ICMPPacket)captor.getPacket();
if(rp==null){
throw new IllegalArgumentException("no rcv icmp echo reply");
}else
{
System.out.println("rcv icmp echo reply");
return ;
}
}
}
}
三、JAVA與Raw Socket的關系
JAVA僅支持到應用層,是無法直接操作底層的,所以JAVA如果想操作RAW SOCKET需要藉助JNI調用C++/C才可以實現數捕獲
❹ jpcap 如何過濾經過本地網卡地址
得到的是IPPacket,如果是網路包,段磨就可以轉成相應的IPPacket或TCPPacket或UDPPacket,,,,,,,,,,裡面就握李斗有地址信息、原始數據了擾滑。。。。。。。。。
❺ 網路抓包,怎麼用Java程序登錄百度
一、實驗內容描述
本實驗是用java實現的網路抓包程序,在windows環境下安裝winpcap4.0和jpcap6.0後,下載eclipse和jigloo插件(一種在eclipse底下作圖形化開發的工具),將其安裝好,然後就可以進行java的網路抓包圖形化開發了。
二、原理與關鍵技術
網路抓包技術原理
網路層上有各種各樣的數據包,它們以不同的幀格式在網路層上進行傳輸,但是在傳輸時它們都遵循相同的格式,即有相同的長度,如果一種協議的幀格式達不到這種長度,就讓其補齊,以達到我們的要求。
網路抓包關鍵技術
無論是在windows操作系統下還是在linux操作系統下,要想捕獲網路上的數據包,必須要對網卡進行控制,因為本機的數據報從網路上來到本機是通過網卡然後再保存到本地緩沖區上的,所以要抓獲網包就必須調用網卡驅動中的對外函數,在linux系統中有net.h文件,可以調用net.h文件中的函數來操作網卡,可以直接編程實現,但為了更方便的使用,可以安裝一個叫libpcap的軟體,這樣調用函數更好用,而在windows系統中,因為源代碼不對外公開,所以要安裝一個叫winpcap的軟體,這樣用C或VC++就可以實現了,晌銀巧但因為我用的是java語言來實現的,所以無論是在哪個系統宴鍵都要安裝一個叫jpcap的軟體,它本身就把底層的函數又封裝了一下,這樣就可以讓java來使用了。
三、設計與實現
1.基於java的設計方案
我的這個網路抓包程序是圖形化操作界面,在菜單欄點擊抓包按鈕後選擇網卡和過濾字還有最長字長,點擊開始,然後就可以開始抓包了,在主界面中就會顯示出一行又一行的數據,這些數據就是抓獲到的數據包。
具體實現
安裝winpcap4.0和jpcap6.0
2.下載eclipse3.3和jigloo,jigloo是eclipse底下的插件,是用來支持eclipse底下的java 圖形化開發的。
3.編寫java抓包程序:
4.建立三個文件,一個主程序,一個抓包程序,一個抓包選項程序對話框程序
5.第一個程序:主程序如下
packagenetcap;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JSeparator;
importjavax.swing.JMenuItem;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.table.*;
importnetcap.*;
importjpcap.*;
importjpcap.packet.*;
importjava.util.*;
importjava.sql.Timestamp;
/**
*Thiscodewaseditedor搏團generatesingCloudGarden'sJigloo
*SWT/SwingGUIBuilder,whichisfreefornon-commercial
*use.(ie,byacorporation,
*)thenyou
*.
*Pleasevisit
*.
*
*THISMACHINE,
*.
*/
.swing.{
privateJMenuItemexitMenuItem;
privateJSeparatorjSeparator2;
;
privateJMenuItemsaveMenuItem;
privateJMenuItemstopMenuItem;
privateJMenuItemstartMenuItem;
privateJMenuMenu;
privateJMenuBarjMenuBar1;
JTabletabledisplay=null;
Vectorrows,columns;
DefaultTableModeltabModel;
JScrollPanescrollPane;
JLabelstatusLabel;
Netcaptorcaptor=newNetcaptor();
/**
*Auto-
*/
publicstaticvoidmain(String[]args){
JFrameMaininst=newJFrameMain();
inst.setVisible(true);
}
publicJFrameMain(){
super();
initGUI();
}
privatevoidinitGUI(){
try{
setSize(400,300);
{
jMenuBar1=newJMenuBar();
setJMenuBar(jMenuBar1);
{
Menu=newJMenu();
jMenuBar1.add(Menu);
Menu.setText("/u6293/u5305");
Menu.setPreferredSize(newjava.awt.Dimension(35,21));
{
startMenuItem=newJMenuItem();
Menu.add(startMenuItem);
startMenuItem.setText("開始");
startMenuItem.setActionCommand("start");
startMenuItem.addActionListener(this);
}
{
stopMenuItem=newJMenuItem();
Menu.add(stopMenuItem);
stopMenuItem.setText("停止");
stopMenuItem.setActionCommand("stop");
stopMenuItem.addActionListener(this);
}
{
saveMenuItem=newJMenuItem();
Menu.add(saveMenuItem);
saveMenuItem.setText("保存");
}
{
saveAsMenuItem=newJMenuItem();
Menu.add(saveAsMenuItem);
saveAsMenuItem.setText("保存為...");
}
{
jSeparator2=newJSeparator();
Menu.add(jSeparator2);
}
{
exitMenuItem=newJMenuItem();
Menu.add(exitMenuItem);
exitMenuItem.setText("Exit");
exitMenuItem.setActionCommand("exit");
exitMenuItem.addActionListener(this);
}
}
}
rows=newVector();
columns=newVector();
columns.addElement("數據報時間");
columns.addElement("源IP地址");
columns.addElement("目的IP地址");
columns.addElement("首部長度");
columns.addElement("數據長度");
columns.addElement("是否分段");
columns.addElement("分段偏移量");
columns.addElement("首部內容");
columns.addElement("數據內容");
tabModel=newDefaultTableModel();
tabModel.setDataVector(rows,columns);
tabledisplay=newJTable(tabModel);
scrollPane=newJScrollPane(tabledisplay);
this.getContentPane().add(newJScrollPane(tabledisplay),BorderLayout.CENTER);
statusLabel=newJLabel("06610班張琛雨066100583");
this.getContentPane().add(statusLabel,BorderLayout.SOUTH);
}catch(Exceptione){
e.printStackTrace();
}
}
publicvoidactionPerformed(ActionEventevent){
Stringcmd=event.getActionCommand();
if(cmd.equals("start")){
captor.capturePacketsFromDevice();
captor.setJFrame(this);
}
elseif(cmd.equals("stop")){
captor.stopCapture();
}
elseif(cmd.equals("exit")){
System.exit(0);
}
}
publicvoiddealPacket(Packetpacket)
{
try
{
Vectorr=newVector();
Stringstrtmp;
Timestamptimestamp=newTimestamp((packet.sec*1000)+(packet.usec/1000));
r.addElement(timestamp.toString());//數據報時間
r.addElement(((IPPacket)packet).src_ip.toString());//源IP地址
r.addElement(((IPPacket)packet).dst_ip.toString());//目的IP地址
r.addElement(packet.header.length);//首部長度
r.addElement(packet.data.length);//數據長度
r.addElement(((IPPacket)packet).dont_frag==true?"分段":"不分段");//是否不分段
r.addElement(((IPPacket)packet).offset);//數據長度
strtmp="";
for(inti=0;i<packet.header.length;i++){
strtmp+=Byte.toString(packet.header[i]);
}
r.addElement(strtmp);//首部內容
strtmp="";
for(inti=0;i<packet.data.length;i++){
strtmp+=Byte.toString(packet.data[i]);
}
r.addElement(strtmp);//數據內容
rows.addElement(r);
tabledisplay.addNotify();
}
catch(Exceptione)
{
}
}
}
❻ 使用Jpcap實現網路監控的Demo
public class TestJpcap {
public static void main(String[] args) throws IOException {
SendPacket();
} // 獲取網路介面列表
public static void Demo() {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
for (int i = 0; i < devices.length; i++) {
System.out.println(i + ": " + devices[i].name + "("
+ devices[i].description + ")");
System.out.println(" datalink: " + devices[i].datalink_name + "("
+ devices[i].datalink_description + ")");
System.out.print(" MAC address:");
for (byte b : devices[i].mac_address)
System.out.print(Integer.toHexString(b & 0xff) + ":");
System.out.println();
for (NetworkInterfaceAddress a : devices[i].addresses)
System.out.println(" address:" + a.address + " " + a.subnet
+ " " + a.broadcast);
}
} // 使用回調方法, 從網路介面捕獲數據包螞模
public static void CallBackReceiver() throws IOException {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
int index = 1;
JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535,
false, 20);
captor.processPacket(20, new PacketPrinter());
// captor.loopPacket(20, new PacketPrinter());
captor.close();
} // 使用逐個捕獲方慎滾法, 從網路介面捕獲數據包
public static void OneByOneReceiver() throws IOException {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
int index = 1;
JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535,
false, 20);
// 設置過悶孝緩濾器
captor.setFilter("ip and tcp", true);
for (int i = 0; i < 10; i++)
System.out.println(captor.getPacket());
} //
public static void PacketWriteFile() throws IOException {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
int index = 1;
JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535,
false, 20);
JpcapWriter writer = JpcapWriter.openDumpFile(captor, "yanrong");
for (int i = 0; i < 10; i++)
writer.writePacket(captor.getPacket());
writer.close();
} //
public static void PacketReadFile() throws IOException {
JpcapCaptor captor = JpcapCaptor.openFile("yanrong");
Packet packet;
while (true) {
packet = captor.getPacket();
if (packet == null) // || packet == Packet.EOF)
break;
System.out.println(packet.toString());
}
} // 通過網路介面發送數據包
public static void SendPacket() throws IOException {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
JpcapSender sender = JpcapSender.openDevice(devices[1]);
TCPPacket p = new TCPPacket(12, 23, 56, 78, false, false, false, false,
true, true, true, true, 10, 10);
p.setIPv4Parameter(0, false, false, false, 0, false, false, false, 0,
1010101, 100, IPPacket.IPPROTO_TCP, InetAddress
.getByName("www..com"), InetAddress
.getByName("localhost"));
p.data = ("data").getBytes();
EthernetPacket ether = new EthernetPacket();
ether.frametype = EthernetPacket.ETHERTYPE_IP;
ether.src_mac = new byte[] { (byte) 0, (byte) 1, (byte) 2, (byte) 3,
(byte) 4, (byte) 5 };
ether.dst_mac = new byte[] { (byte) 0, (byte) 6, (byte) 7, (byte) 8,
(byte) 9, (byte) 10 };
p.datalink = ether;
sender.sendPacket(p);
sender.close();
System.out.println(p);
}
}/** 使用回調方法從網路獲取數據包時用到 */
class PacketPrinter implements PacketReceiver { @Override
public void receivePacket(Packet packet) {
System.out.println(packet.toString());
}
} 你看看~~
❼ java編程:聽說有個叫網路嗅探器的東西,請問原理是 怎麼做出來的啊
Sniffer啊,自己去查,不想大片轉貼了。
主要原理是利用網卡的混雜模式,和乙太網自身的特點進行的。
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。
❽ 只有設置混雜模式才能抓包嗎
混雜模式的抓包是抓取本區域網內所有的包,不擾耐跡一定要混雜模式。
在抓包過程中可緩並以用pcap_compile和pcap_setfilter對抓包對象進行過濾
具體的winpcap的說明文檔上有的,而且過濾的語句寫得很清楚
最近正好在做這畝圓方面的研究,大家共勉。