❶ 有谁知道怎样使用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的说明文档上有的,而且过滤的语句写得很清楚
最近正好在做这亩圆方面的研究,大家共勉。