📄 packetcreator.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 + -