James Sayer
/
smart2
test icmp
Fork of ethspam by
main.cpp@1:feaa107f56b3, 2015-04-24 (annotated)
- Committer:
- jamessayer
- Date:
- Fri Apr 24 03:11:02 2015 +0000
- Revision:
- 1:feaa107f56b3
- Parent:
- 0:852db76de235
first version;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rolf | 0:852db76de235 | 1 | #include "mbed.h" // Importing the mbed classes and tools. |
rolf | 0:852db76de235 | 2 | #include "Ethernet.h" |
jamessayer | 1:feaa107f56b3 | 3 | #include "util/types.h" |
jamessayer | 1:feaa107f56b3 | 4 | #include "net/net.h" |
jamessayer | 1:feaa107f56b3 | 5 | #include "sniffer.h" |
jamessayer | 1:feaa107f56b3 | 6 | |
rolf | 0:852db76de235 | 7 | |
rolf | 0:852db76de235 | 8 | using namespace mbed; |
rolf | 0:852db76de235 | 9 | |
rolf | 0:852db76de235 | 10 | __packed // A __packed struct to have no gaps between the members http://en.wikipedia.org/wiki/Data_structure_alignment |
rolf | 0:852db76de235 | 11 | struct ethpkt { // Ethernet layer: http://en.wikipedia.org/wiki/Ethernet#Physical_layer |
rolf | 0:852db76de235 | 12 | unsigned char dest[6]; // Destination MAC |
rolf | 0:852db76de235 | 13 | unsigned char src[6]; // Source MAC |
rolf | 0:852db76de235 | 14 | unsigned short type; // Payload type. ARP is 0x0806 |
rolf | 0:852db76de235 | 15 | // ARP layer: http://en.wikipedia.org/wiki/Address_Resolution_Protocol |
rolf | 0:852db76de235 | 16 | unsigned short hwtype; // Each data link layer protocol is assigned a number used in this field. Ethernet is 0x0001 |
rolf | 0:852db76de235 | 17 | unsigned short proto; // Each protocol is assigned a number used in this field. IP is 0x0800. |
rolf | 0:852db76de235 | 18 | unsigned char hwlen; // Length in bytes of a hardware address. Ethernet addresses are 6 bytes long. |
rolf | 0:852db76de235 | 19 | unsigned char protolen; // Length in bytes of a logical address. IPv4 address are 4 bytes long. |
rolf | 0:852db76de235 | 20 | unsigned short opcode; // Specifies the operation the sender is performing: |
rolf | 0:852db76de235 | 21 | // 1 for request, 2 for reply, 3 for RARP request, and 4 for RARP reply. |
rolf | 0:852db76de235 | 22 | unsigned char shwaddr[6]; // Hardware address of the sender. |
rolf | 0:852db76de235 | 23 | unsigned char sipaddr[4]; // Protocol address of the sender. |
rolf | 0:852db76de235 | 24 | unsigned char dhwaddr[6]; // Hardware address of the intended receiver. This field is ignored in requests. |
rolf | 0:852db76de235 | 25 | unsigned char dipaddr[4]; // Protocol address of the intended receiver. |
rolf | 0:852db76de235 | 26 | }; |
jamessayer | 1:feaa107f56b3 | 27 | Sniffer sniffer; |
jamessayer | 1:feaa107f56b3 | 28 | Ethernet_MAC your_mac; |
jamessayer | 1:feaa107f56b3 | 29 | //Ethernet eth; // The ethernet device |
rolf | 0:852db76de235 | 30 | DigitalOut led4(LED4); // A LED for showing activity |
rolf | 0:852db76de235 | 31 | |
rolf | 0:852db76de235 | 32 | unsigned short htons(unsigned short n) { // Host short to network shor |
rolf | 0:852db76de235 | 33 | return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); // Byte swapping |
rolf | 0:852db76de235 | 34 | } |
rolf | 0:852db76de235 | 35 | |
jamessayer | 1:feaa107f56b3 | 36 | #define PING_BUFEFERSIZE (sizeof(IP_PacketHeader) + sizeof(ICMP_Packet)) |
rolf | 0:852db76de235 | 37 | |
jamessayer | 1:feaa107f56b3 | 38 | void send(const char *ipaddr) { |
jamessayer | 1:feaa107f56b3 | 39 | IP_Address dest_ip; |
jamessayer | 1:feaa107f56b3 | 40 | IP_Address my_ip; |
jamessayer | 1:feaa107f56b3 | 41 | str2ipaddr(ipaddr,&dest_ip); |
jamessayer | 1:feaa107f56b3 | 42 | str2ipaddr("192.168.0.16",&my_ip); |
jamessayer | 1:feaa107f56b3 | 43 | |
jamessayer | 1:feaa107f56b3 | 44 | u8 buffer[PING_BUFEFERSIZE]; |
jamessayer | 1:feaa107f56b3 | 45 | IP_PacketHeader *ip_packet = (IP_PacketHeader*)buffer; |
jamessayer | 1:feaa107f56b3 | 46 | ICMP_Packet *ping_packet = (ICMP_Packet*)ip_packet->data; |
jamessayer | 1:feaa107f56b3 | 47 | |
jamessayer | 1:feaa107f56b3 | 48 | memset(buffer, '\0', PING_BUFEFERSIZE); |
jamessayer | 1:feaa107f56b3 | 49 | |
jamessayer | 1:feaa107f56b3 | 50 | *ip_packet = (IP_PacketHeader){0x04, 5, 0, sizeof(IP_PacketHeader)+sizeof(ICMP_Packet), 0, 0, 0, 0, 0, 32, IPPROTO_ICMP, 0x00, my_ip, dest_ip}; |
jamessayer | 1:feaa107f56b3 | 51 | *ping_packet = (ICMP_Packet){ICMP_ECHO_REQUEST, 0x00, 0x00, 0x00, 0x00}; |
jamessayer | 1:feaa107f56b3 | 52 | |
jamessayer | 1:feaa107f56b3 | 53 | fix_endian_icmp(ping_packet); |
jamessayer | 1:feaa107f56b3 | 54 | fix_endian_ip(ip_packet); |
jamessayer | 1:feaa107f56b3 | 55 | ip_packet->header_checksum = checksum(ip_packet, sizeof(IP_PacketHeader), &ip_packet->header_checksum, 2); |
jamessayer | 1:feaa107f56b3 | 56 | ping_packet->checksum = checksum(ping_packet, sizeof(ICMP_Packet), &ping_packet->checksum, 2); |
jamessayer | 1:feaa107f56b3 | 57 | |
jamessayer | 1:feaa107f56b3 | 58 | |
jamessayer | 1:feaa107f56b3 | 59 | printf("PING sent...\n"); |
jamessayer | 1:feaa107f56b3 | 60 | |
jamessayer | 1:feaa107f56b3 | 61 | sniffer.inject(your_mac, ETHERTYPE_IPV4, buffer, PING_BUFEFERSIZE); |
jamessayer | 1:feaa107f56b3 | 62 | |
jamessayer | 1:feaa107f56b3 | 63 | |
jamessayer | 1:feaa107f56b3 | 64 | |
jamessayer | 1:feaa107f56b3 | 65 | // printf("a\n"); |
jamessayer | 1:feaa107f56b3 | 66 | // IP_Address dest_ip; |
jamessayer | 1:feaa107f56b3 | 67 | // IP_Address my_ip; |
jamessayer | 1:feaa107f56b3 | 68 | // str2ipaddr(ipaddr,&dest_ip); |
jamessayer | 1:feaa107f56b3 | 69 | // str2ipaddr("192.168.0.5",&my_ip); |
jamessayer | 1:feaa107f56b3 | 70 | // printf("b\n"); |
jamessayer | 1:feaa107f56b3 | 71 | // u8 buffer[PING_BUFEFERSIZE]; |
jamessayer | 1:feaa107f56b3 | 72 | // IP_PacketHeader *ip_packet = (IP_PacketHeader*)buffer; |
jamessayer | 1:feaa107f56b3 | 73 | // ICMP_Packet *ping_packet = (ICMP_Packet*)ip_packet->data; |
jamessayer | 1:feaa107f56b3 | 74 | // printf("c\n"); |
jamessayer | 1:feaa107f56b3 | 75 | // memset(buffer, '\0', PING_BUFEFERSIZE); |
jamessayer | 1:feaa107f56b3 | 76 | // printf("d\n"); |
jamessayer | 1:feaa107f56b3 | 77 | // *ip_packet = (IP_PacketHeader){0x4, 5, 0, sizeof(IP_PacketHeader)+sizeof(ICMP_Packet), 0, 0, 0, 0, 0, 32, IPPROTO_ICMP, 0x00, my_ip, dest_ip}; |
jamessayer | 1:feaa107f56b3 | 78 | // *ping_packet = (ICMP_Packet){ICMP_ECHO_REQUEST, 0x00, 0x00, 0x00, 0x00}; |
jamessayer | 1:feaa107f56b3 | 79 | // printf("e\n"); |
jamessayer | 1:feaa107f56b3 | 80 | |
jamessayer | 1:feaa107f56b3 | 81 | |
jamessayer | 1:feaa107f56b3 | 82 | /// fix_endian_icmp(ping_packet); |
jamessayer | 1:feaa107f56b3 | 83 | // fix_endian_ip(ip_packet); |
jamessayer | 1:feaa107f56b3 | 84 | // printf("f\n"); |
jamessayer | 1:feaa107f56b3 | 85 | // ip_packet->header_checksum = checksum(ip_packet, sizeof(IP_PacketHeader), &ip_packet->header_checksum, 2); |
jamessayer | 1:feaa107f56b3 | 86 | // ping_packet->checksum = checksum(ping_packet, sizeof(ICMP_Packet), &ping_packet->checksum, 2); |
jamessayer | 1:feaa107f56b3 | 87 | // printf("h\n"); |
jamessayer | 1:feaa107f56b3 | 88 | // |
jamessayer | 1:feaa107f56b3 | 89 | // print_icmp(ping_packet); |
jamessayer | 1:feaa107f56b3 | 90 | // print_ip(ip_packet); |
jamessayer | 1:feaa107f56b3 | 91 | // |
jamessayer | 1:feaa107f56b3 | 92 | // printf("i\n"); |
jamessayer | 1:feaa107f56b3 | 93 | // eth.write((char*)buffer, PING_BUFEFERSIZE); // Write the package |
jamessayer | 1:feaa107f56b3 | 94 | // eth.send(); // Send the package |
jamessayer | 1:feaa107f56b3 | 95 | // printf("j\n"); |
rolf | 0:852db76de235 | 96 | |
jamessayer | 1:feaa107f56b3 | 97 | // static char data[0x600]; // Packet buffer |
jamessayer | 1:feaa107f56b3 | 98 | // const unsigned char arplen = 6; // Hardware address length |
jamessayer | 1:feaa107f56b3 | 99 | // const unsigned char ethlen = 4; // IP address length |
jamessayer | 1:feaa107f56b3 | 100 | // char hwaddr[arplen]; // Hardware address buffer |
jamessayer | 1:feaa107f56b3 | 101 | // struct ethpkt *pkg = (struct ethpkt *) &data[0]; // Force the buffer to an ethpkg |
jamessayer | 1:feaa107f56b3 | 102 | // unsigned char pos = arplen; // Hardware/IP address position |
jamessayer | 1:feaa107f56b3 | 103 | // |
jamessayer | 1:feaa107f56b3 | 104 | // eth.address(hwaddr); // Get own hardware address |
jamessayer | 1:feaa107f56b3 | 105 | // |
jamessayer | 1:feaa107f56b3 | 106 | // pkg->type = htons(0x0806); // Set type to ARP (0x0806) |
jamessayer | 1:feaa107f56b3 | 107 | // pkg->hwtype = htons(0x0001); // Hardware type is Ethernet (0x0001) |
jamessayer | 1:feaa107f56b3 | 108 | // pkg->proto = htons(0x0800); // Protocol is ARP Request (0x0800) |
jamessayer | 1:feaa107f56b3 | 109 | // pkg->hwlen = arplen; // Hardware addresses are 6 Bytes long |
jamessayer | 1:feaa107f56b3 | 110 | // pkg->protolen = ethlen; // And protocol addresses 4 Bytes |
jamessayer | 1:feaa107f56b3 | 111 | // pkg->opcode = htons(0x0001); // Send: whois XX:XX:XX:XX:XX:XX? |
jamessayer | 1:feaa107f56b3 | 112 | // |
jamessayer | 1:feaa107f56b3 | 113 | // while(pos-- > 0) { // Write IP/MAC-Addresses (combined loop for all addresses) |
jamessayer | 1:feaa107f56b3 | 114 | // pkg->src[pos] = hwaddr[pos]; // Set source MAC address to hwaddr on ethernet layer |
jamessayer | 1:feaa107f56b3 | 115 | // pkg->dest[pos] = 0xFF; // Set destination MAC address to everybody (FF:FF:FF:FF:FF:FF) on ethernet layer |
jamessayer | 1:feaa107f56b3 | 116 | // pkg->shwaddr[pos] = hwaddr[pos]; // Set source MAC address on ARP layer |
jamessayer | 1:feaa107f56b3 | 117 | // pkg->dhwaddr[pos] = 0xFF; // Set destination MAC address on ARP layer |
jamessayer | 1:feaa107f56b3 | 118 | // if(pos < ethlen) { // Check if we can copy IP addresses too. |
jamessayer | 1:feaa107f56b3 | 119 | // pkg->sipaddr[pos] = 0xFF; // Set source ip address to 255.255.255.255 |
jamessayer | 1:feaa107f56b3 | 120 | // pkg->dipaddr[pos] = ipaddr[pos]; // Set destination ip address to ipaddr |
jamessayer | 1:feaa107f56b3 | 121 | // } |
jamessayer | 1:feaa107f56b3 | 122 | // } |
jamessayer | 1:feaa107f56b3 | 123 | // |
jamessayer | 1:feaa107f56b3 | 124 | // eth.write(data, 60); // Write the package |
jamessayer | 1:feaa107f56b3 | 125 | // eth.send(); // Send the package |
rolf | 0:852db76de235 | 126 | } |
rolf | 0:852db76de235 | 127 | // In this example we would like to make ARP requests to ask for every ip address. |
rolf | 0:852db76de235 | 128 | int main() { // The programm starts here! |
rolf | 0:852db76de235 | 129 | unsigned int i = 1; // The integer we use as counter and target IP address. |
jamessayer | 1:feaa107f56b3 | 130 | //char *c = (char *)&i; // We cast the integer to an array of char c[4] to handle it as IP address. |
rolf | 0:852db76de235 | 131 | |
rolf | 0:852db76de235 | 132 | printf("Lowlevel Ethernet Spammer\n\n"); // Print out that the programm has been started. |
rolf | 0:852db76de235 | 133 | |
jamessayer | 1:feaa107f56b3 | 134 | while(1) { |
jamessayer | 1:feaa107f56b3 | 135 | char* ip = "192.168.10.10"; // Do forever: |
jamessayer | 1:feaa107f56b3 | 136 | send(ip); // Assamble and send our request. See eth_send function! |
rolf | 0:852db76de235 | 137 | i++; // Increment counter. What will increment the IP (c[4]) address as well. |
rolf | 0:852db76de235 | 138 | |
rolf | 0:852db76de235 | 139 | led4 = 1; // Show activity, by blinking with led 4: |
rolf | 0:852db76de235 | 140 | wait(0.02); // |
rolf | 0:852db76de235 | 141 | led4 = 0; // Put the led on and wait for 0.2 seconds |
rolf | 0:852db76de235 | 142 | wait(0.02); // Put the led off and wait for 0.2 seconds |
rolf | 0:852db76de235 | 143 | } |
rolf | 0:852db76de235 | 144 | } |