linux
系统下,还是在
windows
系统下,使用
tcpflow
或者
wireshark
抓取数据包,基本思路都是一样的。即:根据你需要抓取的数据亏敏包,设定特定的过滤规则,以及在哪一个网络适配器上进行抓包。销卖枝最后将抓取的配碧数据包保存到一个文件中,供以后的分析使用。
一、实验内容描述宴键
本实验是用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.第一个程序:主程序如下
package netcapimport java.awt.event.ActionEvent
import java.awt.event.ActionListener
import javax.swing.JSeparator
import javax.swing.JMenuItem
import javax.swing.JMenu
import javax.swing.JMenuBar
import java.awt.*
import java.awt.event.*
import javax.swing.*
import javax.swing.table.*
import netcap.*
import jpcap.*
import jpcap.packet.*
import java.util.*
import java.sql.Timestamp
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class JFrameMain extends javax.swing.JFrame implements ActionListener{
private JMenuItem exitMenuItem
private JSeparator jSeparator2
private JMenuItem saveAsMenuItem
private JMenuItem saveMenuItem
private JMenuItem stopMenuItem
private JMenuItem startMenuItem
private JMenu Menu
private JMenuBar jMenuBar1
JTable tabledisplay = null
Vector rows,columns
DefaultTableModel tabModel
JScrollPane scrollPane
JLabel statusLabel
Netcaptor captor = new Netcaptor()
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
JFrameMain inst = new JFrameMain()
inst.setVisible(true)
}
public JFrameMain() {
super()
initGUI()
}
private void initGUI() {
try {
setSize(400, 300)
{
jMenuBar1 = new JMenuBar()
setJMenuBar(jMenuBar1)
{
Menu = new JMenu()
jMenuBar1.add(Menu)
Menu.setText("/u6293/u5305")
Menu.setPreferredSize(new java.awt.Dimension(35, 21))
{
startMenuItem = new JMenuItem()
Menu.add(startMenuItem)
startMenuItem.setText("开始")
startMenuItem.setActionCommand("start")
startMenuItem.addActionListener(this)
}
{
stopMenuItem = new JMenuItem()
Menu.add(stopMenuItem)
stopMenuItem.setText("停止")
stopMenuItem.setActionCommand("stop")
stopMenuItem.addActionListener(this)
}
{
saveMenuItem = new JMenuItem()
Menu.add(saveMenuItem)
saveMenuItem.setText("保存")
}
{
saveAsMenuItem = new JMenuItem()
Menu.add(saveAsMenuItem)
saveAsMenuItem.setText("保存为 ...")
}
{
jSeparator2 = new JSeparator()
Menu.add(jSeparator2)
}
{
exitMenuItem = new JMenuItem()
Menu.add(exitMenuItem)
exitMenuItem.setText("Exit")
exitMenuItem.setActionCommand("exit")
exitMenuItem.addActionListener(this)
}
}
}
rows=new Vector()
columns= new Vector()
columns.addElement("数据报时间")
columns.addElement("源IP地址")
columns.addElement("目的IP地址")
columns.addElement("首部长度")
columns.addElement("数据长度")
columns.addElement("是否分段")
columns.addElement("分段偏移量")
columns.addElement("首部内容")
columns.addElement("数据内容")
tabModel=new DefaultTableModel()
tabModel.setDataVector(rows,columns)
tabledisplay = new JTable( tabModel )
scrollPane= new JScrollPane(tabledisplay)
this.getContentPane().add( new JScrollPane(tabledisplay),BorderLayout.CENTER)
statusLabel=new JLabel("06610班 张琛雨 066100583")
this.getContentPane().add(statusLabel,BorderLayout.SOUTH)
} catch (Exception e) {
e.printStackTrace()
}
}
public void actionPerformed(ActionEvent event){
String cmd=event.getActionCommand()
if(cmd.equals("start")){
captor.capturePacketsFromDevice()
captor.setJFrame(this)
}
else if(cmd.equals("stop")){
captor.stopCapture()
}
else if(cmd.equals("exit")){
System.exit(0)
}
}
public void dealPacket( Packet packet )
{
try
{
Vector r=new Vector()
String strtmp
Timestamp timestamp = new Timestamp((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(int i=0i<packet.header.lengthi++){
strtmp += Byte.toString(packet.header[i])
}
r.addElement(strtmp) //首部内容
strtmp = ""
for(int i=0i<packet.data.lengthi++){
strtmp += Byte.toString(packet.data[i])
}
r.addElement(strtmp) //数据内容
rows.addElement(r)
tabledisplay.addNotify()
}
catch( Exception e)
{
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)