Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by klooon ( 16 years ago )
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<features.h>
#include<linux/if_packet.h>
#include<linux/if_ether.h>
#include<errno.h>
#include<sys/ioctl.h>
#include<net/if.h>
#include<linux/ip.h>
#include<arpa/inet.h>
#include<linux/tcp.h>
#include<netinet/in.h>

char* getService(int port) {
    switch (port) {
        case 20: return "FTP (C)";
        case 21: return "FTP (D)";
        case 22: return "SSH";
        case 23: return "Telnet";
        case 53: return "DNS";
        case 80: return "HTTP";
        case 110: return "POP3";
        case 143: return "IMAP";
        case 443: return "HTTPS";
        case 465: return "SMTPS";
    }
    return "N/A";
}

void showTCPInfo(struct ethhdr *ethernet_header, struct iphdr *ip_header, struct tcphdr *tcp_header) {
    //providing 'lower' structs for eventual usage
    int windowSize = tcp_header->window;
    char str[INET_ADDRSTRLEN];
    char* sender;
    int i = 1;
    sender = inet_ntop(AF_INET, &ip;_header->saddr, str, sizeof (str));
    if (tcp_header->syn == 1 && tcp_header->ack == 0) {
        char* os;
        switch (windowSize) {
            case 32: os = "Windows Vista/7";
                break;
            case 64: os = "Windows XP";
                break;
            case 65535: os = "Mac OS X";
                break;
            case 53270: os = "Linux";
                break;
            default: os = "N/A";
                break;
        }

        printf("TCP SYN t Sender %s t service: %s t OS: %s (WindowSize: %i)n", sender,


                getService(ntohs(tcp_header->dest)), os, ntohs(tcp_header->window));
    }
}

void parseHeader(unsigned char *packet, int len) {
    /* FIXME:
     * implement a check, whether the packet was really recieved and not
     * sent by host
     */
    // short type = 0; //1=Ethernet, 2=IP, 3=TCP
    struct ethhdr *ethernet_header;
    struct iphdr *ip_header;
    struct tcphdr *tcp_header;
    //printf("Recieved a packet of size %i t type: n",len);
    //Checking the size of packet to verify whether it COULD be a TCP packet
    if (len >= (sizeof (struct ethhdr))) {
        ethernet_header = (struct ethhdr *) packet;
        if (len >= (sizeof (struct ethhdr) + sizeof (struct iphdr)) && ntohs(ethernet_header->
                h_proto) == ETH_P_IP) {
            ip_header = (struct iphdr *) (packet + sizeof (struct ethhdr));
            if (len >= (sizeof (struct ethhdr) + sizeof (struct iphdr) + sizeof (struct tcphdr))
                    && (ip_header->protocol == IPPROTO_TCP)) {
                tcp_header = (struct tcphdr *) (packet + sizeof (struct ethhdr) + ip_header->
                        ihl * 4);
                showTCPInfo(ethernet_header, ip_header, tcp_header);


            }
        }
    }
}

int main(int argc, char * argv []) {
    struct sockaddr packetS; //the final packet struct
    unsigned char packet[2048]; //content of packet
    int len; //length of packet
    //unsigned int foo = sizeof (packetS);
    int sd;
    struct sockaddr_in sa;
    int i = 1;
    char * test1 ="Dies ist ein Test";

    //creating raw socket

    int rawsock;
    if ((rawsock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) == -1) {
        perror("Error creating raw socket: ");
        exit(-1);
    }
    while ((len = recvfrom(rawsock, packet, sizeof (packet) - 1, 0, (struct sockaddr*) & packetS, sizeof (packetS)))) {
        parseHeader(packet, len);
        
        break;
    }


    

    if (argc != 2) {
        printf(" Usage : %s ipv4 - address n ", argv [0]);
        exit(EXIT_FAILURE);
    }

    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        printf(" socket () failed : % s n ", strerror(errno));
        exit(EXIT_FAILURE);
    }

    /* Initialisierung der Socket - Adreßstruktur */
    memset(& sa, 0, sizeof ( sa)); /* erst alles auf 0 */

    sa . sin_family = AF_INET; /* IPv4 */
    sa . sin_port = htons(33333);
    /* IPv4 - Adresse in Netzwerkdarstellung einsetzen */
    if (inet_pton(AF_INET, argv [1], & sa . sin_addr) != 1) {
        printf(" inet_pton () failed . n ");
        close(sd);
        exit(EXIT_FAILURE);
    }

    /* Leeres Datagramm als Anforderung an Server schicken */

    if (sendto(sd, test1, 0, 0, (struct sockaddr *) & sa,
            sizeof ( sa)) < 0) {
        printf(" sendto () failed : % s  n ", strerror(errno));
        close(sd);
        exit(EXIT_FAILURE);
    }

    printf(" Anfrage an % s verschickt . n ", argv [1]);

    /* Ausgabe des Servers lesen 
    if (recvfrom(sd, & stime, sizeof ( stime), 0, NULL,
            NULL) < 0) {
        printf(" recvfrom () failed : % s  n ", strerror(errno));
        close(sd);
        exit(EXIT_FAILURE);
    }*/
    printf(" Antwort von % s erhalten . n ", argv [1]);


    return 0;
}

 

Revise this Paste

Your Name: Code Language: