using System; using System.Net; namespace Xarp { public static class BuildPacket { public static byte[] BuildArpReplyPacket(string srcip, string destip, string srcmac, string destmac) { byte[] srcipbyte = IpToByte(srcip); byte[] destipbyte = IpToByte(destip); byte[] srcmacbyte = MacToByte(srcmac); byte[] destmacbyte = MacToByte(destmac); byte[] packet = BuildArpReplyPacket(srcipbyte, destipbyte, srcmacbyte, destmacbyte); return packet; } public static byte[] BuildArpReplyPacket(byte[] srcip, byte[] destip, byte[] srcmac, byte[] destmac) { byte[] packet = new byte[] { 0xe0, 0xcb, 0x4e, 0x2f, 0x8a, 0xc7, //以太網(wǎng)目的地址(6個(gè)字節(jié)) 0x00, 0x23,0xcd, 0x34, 0x20, 0x0e, //以太網(wǎng)源地址(6個(gè)字節(jié)) 0x08, 0x06,//幀類型(ARP = 0806)(2個(gè)字節(jié)) //--------------------------------------------------------------------------->以太網(wǎng)首部 (14byte) 0x00,0x01,//硬件類型(Ethernet=01)(2個(gè)字節(jié)) 0x08, 0x00,//協(xié)議類型(IPv4=0800)(2個(gè)字節(jié)) 0x06, //硬件地址長度(1個(gè)字節(jié)) 0x04,//協(xié)議地址長度(1個(gè)字節(jié)) 0x00,0x02,//OP操作選項(xiàng)(ARP request=01,ARP reply=02,RARP request=03,RARP reply=04)(2個(gè)字節(jié)) 0x00,0x23,0xcd, 0x34,0x20, //發(fā)送端以太網(wǎng)地址(6個(gè)字節(jié)) 0x0e, 0xc0, 0xa8,0x01,//發(fā)送端IP地址(4個(gè)字節(jié)) 0x01,0xe0,0xcb,0x4e, 0x2f,0x8a,//目的以太網(wǎng)地址(6個(gè)字節(jié))(FFFFFFFFFFFF是廣播地址) 0xc7,0xc0, 0xa8, 0x01, //目的IP地址(4個(gè)字節(jié))(255.255.255.0是廣播地址) //--------------------------------------------------------------------------->ARP請求/應(yīng)答 (28byte) 0x00 //最少要有1個(gè)字節(jié) }; for (int i = 0; i < 4; i++) { packet[i + 28] = srcip[i]; packet[i + 38] = destip[i]; } for (int i = 0; i < 6; i++) { packet[i + 22] = srcmac[i]; packet[i] = destmac[i]; packet[i + 6] = srcmac[i]; packet[i + 32] = destmac[i]; } return packet; } public static byte[] BuildArpQuestPacket(string srcip, string destip, string srcmac, string destmac) { byte[] packet = BuildArpReplyPacket(srcip, destip, srcmac, destmac); packet[21] = 0x01; return packet; } private static byte[] IpToByte(string ipstr) { IPAddress ip; bool b = IPAddress.TryParse(ipstr, out ip); return ip.GetAddressBytes(); } private static byte[] MacToByte(string macStr) { string[] macList = macStr.Split('-'); byte[] macBytes = new byte[6]; for (int i = 0; i < 6; i++) { macBytes[i] = (byte)Convert.ToInt32(macList[i], 16); } return macBytes; } } } |
|