android抓包实现.doc_第1页
android抓包实现.doc_第2页
android抓包实现.doc_第3页
android抓包实现.doc_第4页
android抓包实现.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows下的基于java的网络抓包方法一、实验内容描述本实验是用java实现的网络抓包程序,在windows环境下安装winpcap4.0和jpcap6.0后,下载eclipse和jigloo插件(一种在eclipse底下作图形化开发的工具),将其安装好,然后就可以进行java的网络抓包图形化开发了。二、原理与关键技术2.1 网络抓包技术原理网络层上有各种各样的数据包,它们以不同的帧格式在网络层上进行传输,但是在传输时它们都遵循相同的格式,即有相同的长度,如果一种协议的帧格式达不到这种长度,就让其补齐,以达到我们的要求。2.2 网络抓包关键技术无论是在windows操作系统下还是在linux操作系统下,要想捕获网络上的数据包,必须要对网卡进行控制,因为本机的数据报从网络上来到本机是通过网卡然后再保存到本地缓冲区上的,所以要抓获网包就必须调用网卡驱动中的对外函数,在linux系统中有net.h文件,可以调用net.h文件中的函数来操作网卡,可以直接编程实现,但为了更方便的使用,可以安装一个叫libpcap的软件,这样调用函数更好用,而在windows系统中,因为源代码不对外公开,所以要安装一个叫winpcap的软件,这样用C或VC+就可以实现了,但因为我用的是java语言来实现的,所以无论是在哪个系统都要安装一个叫jpcap的软件,它本身就把底层的函数又封装了一下,这样就可以让java来使用了。三、设计与实现3.1 基于java的设计方案我的这个网络抓包程序是图形化操作界面,在菜单栏点击抓包按钮后选择网卡和过滤字还有最长字长,点击开始,然后就可以开始抓包了,在主界面中就会显示出一行又一行的数据,这些数据就是抓获到的数据包。3.2 具体实现1、安装winpcap4.0和jpcap6.02、下载eclipse3.3和jigloo,jigloo是eclipse底下的插件,是用来支持eclipse底下的java 图形化开发的。3、编写java抓包程序:建立三个文件,一个主程序,一个抓包程序,一个抓包选项程序对话框程序第一个程序:主程序如下package netcap;import 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;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(u6293u5305); 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=0;ipacket.header.length;i+) strtmp += Byte.toString(packet.headeri); r.addElement(strtmp); /首部内容 strtmp = ; for(int i=0;ipacket.data.length;i+) strtmp += Byte.toString(packet.datai); r.addElement(strtmp); /数据内容 rows.addElement(r); tabledisplay.addNotify(); catch( Exception e) 在这里定义了一个向量r,当有数据包产生时,便将数据包赋值给r,rows.AddElement(r)语句便将r添加到向量rows中,然后tabledisplay.addNotify();语句就会刷新界面将新的数据包显示出来。 第二个程序:抓包package netcap; import java.io.File;import java.util.Vector; import javax.swing.JFileChooser;import javax.swing.JOptionPane; import jpcap.JpcapCaptor;import jpcap.PacketReceiver;import jpcap.JpcapWriter;import jpcap.packet.Packet; public class Netcaptor JpcapCaptor jpcap = null; JFrameMain frame; public void setJFrame(JFrameMain frame) this.frame=frame; public void capturePacketsFromDevice() if(jpcap!=null) jpcap.close(); jpcap = Jcapturedialog.getJpcap(frame); if (jpcap != null) startCaptureThread(); private Thread captureThread; private void startCaptureThread() if(captureThread != null) return; captureThread = new Thread(new Runnable() public void run() while(captureThread != null) cessPacket(1, handler); ); captureThread.setPriority(Thread.MIN_PRIORITY); captureThread.start(); void stopcaptureThread() captureThread = null; public void stopCapture() System.out.println(2); stopcaptureThread(); private PacketReceiver handler=new PacketReceiver() public void receivePacket(Packet packet) /System.out.println(packet); frame.dealPacket(packet); ;定义一个抓包对象JpcapCaptor jpcap = null;但点击开始时调用private void startCaptureThread()方法开始抓包,cessPacket(1, handler);语句能够反复调用handler所指向的方法,这个方法中定义的packet就是网络上抓到的数据包,经过frame.dealPacket(packet);就可以显示在主界面上。程序三:抓包选项package netcap; import javax.swing.JFrame;import jpcap.*;import java.awt.*;import java.awt.event.*;import javax.swing.*; /* This code was edited or generated using CloudGardens 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 for details.* 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 Jcapturedialog extends javax.swing.JDialog implements ActionListener /* * Auto-generated main method to display this JDialog */ static JpcapCaptor jpcap=null; private JRadioButton wholeRadioButton; private JPanel buttonPanel; private JButton cancelButton; private JButton okButton; private JRadioButton userRadioButton; private JRadioButton headRadioButton; private JPanel netPanel; private JTextField caplenTextField; private JPanel caplenPanel; private JTextField TextField; private JPanel filterPanel; private JCheckBox CheckBox; private JComboBox netJComboBox; private JPanel jPanel_east; private JPanel jPanel_west; NetworkInterface devices; public static void main(String args) JFrame frame = new JFrame(); Jcapturedialog inst = new Jcapturedialog(frame); inst.setVisible(true); public Jcapturedialog(JFrame frame) super(frame,选择要检测的网卡并设置参数,true); try BoxLayout thisLayout = new BoxLayout( getContentPane(), javax.swing.BoxLayout.X_AXIS); getContentPane().setLayout(thisLayout); jPanel_west = new JPanel(); jPanel_west.setLayout(new BoxLayout(jPanel_west,BoxLayout.Y_AXIS); getContentPane().add(jPanel_west); netPanel = new JPanel(); FlowLayout netPanelLayout = new FlowLayout(); netPanelLayout.setAlignOnBaseline(true); netPanel.setBorder(BorderFactory.createTitledBorder(选择网卡); netPanel.setAlignmentX(Component.LEFT_ALIGNMENT); jPanel_west.add(netPanel); netPanel.setLayout(netPanelLayout);/ netPanel.setPreferredSize(new java.awt.Dimension(239, 56); devices = JpcapCaptor.getDeviceList(); if(devices = null) JOptionPane.showMessageDialog(frame, 没有找到网卡); dispose(); return; else String names = new Stringdevices.length; for(int i=0;i names.length;i+) namesi = (devicesi.description = null?:devicesi.description); netJComboBox = new JComboBox(names); netPanel.add(netJComboBox); CheckBox = new JCheckBox(); jPanel_west.add(CheckBox); FlowLayout CheckBoxLayout = new FlowLayout(); CheckBoxLayout.setAlignOnBaseline(true); CheckBox.setText(u662fu5426u8bbeu7f6eu4e3au6df7u6742u6a21u5f0f); CheckBox.setLayout(null); filterPanel = new JPanel(); filterPanel.setBorder(BorderFactory.createTitledBorder(捕获过滤器); filterPanel.setAlignmentX(Component.LEFT_ALIGNMENT); FlowLayout filterPanelLayout = new FlowLayout(); filterPanelLayout.setAlignment(FlowLayout.LEFT); filterPanelLayout.setAlignOnBaseline(true); jPanel_west.add(filterPanel); filterPanel.setLayout(filterPanelLayout); TextField = new JTextField(20); filterPanel.add(TextField); jPanel_east = new JPanel(); jPanel_east.setLayout(new BoxLayout(jPanel_east,BoxLayout.Y_AXIS); getContentPane().add(jPanel_east); caplenPanel = new JPanel(); caplenPanel.setBorder(BorderFactory.createTitledBorder(最长字长); caplenPanel.setAlignmentX(Component.LEFT_ALIGNMENT); jPanel_east.add(caplenPanel); caplenPanel.setLayout(new BoxLayout(caplenPanel,BoxLayout.Y_AXIS); caplenTextField = new JTextField(20); caplenPanel.add(caplenTextField); caplenTextField.setText(1514); caplenTextField.setEnabled(false); wholeRadioButton = new JRadioButton(); FlowLayo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论