⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packetcreator.java

📁 基于Jpcap开发的流量监控软件
💻 JAVA
字号:
package joel.ethernettools;
/**
 * THIS IS A PROTOTYPE CLASS,USED TO CREATE PACKETS.
 * SUPPORTED PACKET TYPES:
 * ARP/RARP
 * ICMP
 * TCP/UDP IS MORE COMPLICATE,SO NOT SUPPORTED YET.
 */
import java.net.InetAddress;

import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.Packet;

public final class PacketCreator {
	private final byte[] IP_BROADCAST = { (byte) 255, (byte) 255, (byte) 255,
			(byte) 255 };
	private final byte[] MAC_BROADCAST = { (byte) 255, (byte) 255, (byte) 255,
			(byte) 255, (byte) 255, (byte) 255 };
	public final static int PACKET_TYPE_ARP = 0;
	public final static int PACKET_TYPE_ICMP = 1;
	public final static int PACKET_TYPE_TCP = 2;
	public final static int PACKET_TYPE_UDP = 3;
	private Packet packet;
	private NIC nic;
	private MsgProvider msgProvider;

	protected PacketCreator() {
		msgProvider = new MsgProvider();
	}

	protected PacketCreator(MsgReceiver logger) {
		msgProvider = new MsgProvider();
		this.msgProvider.addMsgReceiver(logger);
	}

	/**
	 * @param nic
	 *            selected nic to operate.
	 */
	protected void setSelectedNIC(NIC nic) {
		this.nic = nic;
		msgProvider.addNewMsg("PACKET CREATOR INIT DONE.");
	}

	/**
	 * create Ethernet packet .
	 * 
	 * @param dstMACAddr
	 * @return
	 * 
	 */
	private EthernetPacket CreateEthernetPacket(String dstMACAddr) {
		EthernetPacket ether = new EthernetPacket();
		ether.frametype = EthernetPacket.ETHERTYPE_IP;
		ether.src_mac = nic.getMAC();
		ether.dst_mac = NIC.getByteArrayByString(dstMACAddr);
		return ether;
	}

	/**
	 * create Ethernet packet .
	 * 
	 * @param dstMACAddr
	 * @return
	 */
	private EthernetPacket CreateEthernetPacket(String srcMACAddr,
			String dstMACAddr) {
		EthernetPacket ether = this.CreateEthernetPacket(dstMACAddr);
		ether.src_mac = NIC.getByteArrayByString(srcMACAddr);
		return ether;
	}

	/**
	 * create a arp request packet. source mac & ip uses locale nic info.
	 * 
	 * @param dstIPAddr
	 *            dst ip addr needs to be resoluted.
	 * @return Packet(arp request)
	 */
	protected Packet CreateARPRequestPacket(String dstIPAddr) {
		packet = new ARPPacket();
		EthernetPacket ethernet = this.CreateEthernetPacket("ffffffffffff");
		ethernet.frametype = EthernetPacket.ETHERTYPE_ARP;
		// ethernet.src_mac=nicLacale.getMAC();
		// ethernet.dst_mac=this.MAC_BROADCAST;
		packet.datalink = ethernet;
		ethernet.frametype = EthernetPacket.ETHERTYPE_ARP;
		((ARPPacket) packet).hardtype = ARPPacket.HARDTYPE_ETHER;
		((ARPPacket) packet).prototype = ARPPacket.PROTOTYPE_IP;
		((ARPPacket) packet).hlen = 6;
		((ARPPacket) packet).plen = 4;
		((ARPPacket) packet).sender_hardaddr = nic.getMAC();
		((ARPPacket) packet).sender_protoaddr = nic.getIPAddress().getAddress();
		((ARPPacket) packet).operation = ARPPacket.ARP_REQUEST;
		((ARPPacket) packet).target_hardaddr = this.MAC_BROADCAST;
		((ARPPacket) packet).target_protoaddr = NIC
				.getByteArrayByString(dstIPAddr);
		return packet;
	}

	/**
	 * create a arp reply packet. source mac & ip uses locale nic info.
	 * 
	 * @param dstIPAddr
	 * @param dstMACAddr
	 * @return
	 */
	protected Packet CreteARPReplyPacket(String dstIPAddr, String dstMACAddr) {
		packet = this.CreateARPRequestPacket(dstIPAddr);
		packet.datalink = this.CreateEthernetPacket(dstMACAddr);
		((ARPPacket) packet).operation = ARPPacket.ARP_REPLY;
		((ARPPacket) packet).target_hardaddr = NIC
				.getByteArrayByString(dstMACAddr);
		((ARPPacket) packet).target_protoaddr = NIC
				.getByteArrayByString(dstIPAddr);
		return packet;
	}

	/**
	 * create a ICMP packet
	 * 
	 * @param dstIPAddr
	 * @param dstMACAddr
	 * @return
	 */
	protected Packet CreateICMPPacket(InetAddress dstIPAddr, String dstMACAddr) {
		packet = new ICMPPacket();
		packet.datalink = this.CreateEthernetPacket(dstMACAddr);
		((ICMPPacket) packet).type = ICMPPacket.ICMP_ECHO;
		((ICMPPacket) packet).setIPv4Parameter(0, false, false, false, 0,
				false, true, false, 0, 10, 128, ICMPPacket.IPPROTO_ICMP, nic
						.getIPAddress(), dstIPAddr);
		packet.data = new String("TEST").getBytes();
		return packet;
	}

	/**
	 * unfinished. create a tcp packet
	 * 
	 * @param dstIPAddr
	 * @param dstMACAddr
	 * @param srcPort
	 * @param dstPort
	 * @return the customized tcp packet.
	 */
	protected Packet CreateTCPPacket(InetAddress dstIPAddr, String dstMACAddr,
			int srcPort, int dstPort) {
		EthernetPacket ethernetHead = this.CreateEthernetPacket(dstMACAddr);

		return packet;
	}

	protected Packet CreateUDPPacket() {

		return packet;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// NIC nic=new NIC(1);
		// PacketCreator crt=new PacketCreator(nic);
		// try {
		// jpcap.JpcapSender sender=JpcapSender.openDevice(nic.getInterface());
		// System.out.println("sending packet using:
		// "+nic.getInterface().description);
		// sender.sendPacket(crt.CreateARPRequestPacket("192.168.100.100"));
		// sender.sendPacket(crt.CreteARPReplyPacket("117.85.133.35",
		// "00508d5c53ff"));
		// sender.sendPacket(crt.CreateICMPPacket(InetAddress.getByName("192.168.100.100"),"000c29926253"));
		// } catch (IOException e) {
		// e.printStackTrace();
		// }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -