C TCP/IP code macht ärger

Diskutiere C TCP/IP code macht ärger im Developer Network Forum im Bereich Hardware & Software Forum; Hi, habe im Internet folgenden Code gefunden: #include <winsock2.h> // definiert z.B. Protokolle (IPPROTO_RAW) oder Ports/Sockets (IPPORT_FTP)...
  • C TCP/IP code macht ärger Beitrag #1
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hi, habe im Internet folgenden Code gefunden:
Code:
#include <winsock2.h>     // definiert z.B. Protokolle (IPPROTO_RAW) oder Ports/Sockets (IPPORT_FTP)
 #include <stdio.h>        // Standard I/O Funktionen wie printf()
 #include <string.h>       // String und Memory Funktionen wie strcmp() und memset()
 #include <ws2tcpip.h>     // beinhaltet spezifische Information für Winsock2 wzB. IP_HDRINCL

 #pragma comment(lib, "Ws2_32.lib")
 #pragma comment(lib, "wininet.lib")

 #define NUM_ELEMENTS(x)  (sizeof((x)) / sizeof((x)[0]))

 struct IPHDR
 {
    unsigned char  verlen;      //  IP version & length
                                /*  verlen hat 8 Bits, die ersten 4 für die Version
                                und die letzten 4 für die Länge.
                                Beispiel: HEX 0x65 ist Binär 0x01100101
                                Aufgeteilt also 0110 = DEZ 6 und 0101 = DEZ 5
                                Daraus resultiert Version 6 und Länge 20
                                */
    unsigned char  tos;	        //  IP type of service
                                /*  1 Byte:
                                    1000   --   minimize delay
                                    0100   --   maximize throughput
                                    0010   --   maximize reliability
                                    0001   --   minimize monetary cost
                                    0000   --   normal service
                                */
    unsigned short totallength; //  Total length
                                /*  2 Bytes = 16 bits
                                    Länge des IP-Paketes einschließlich der nachfolgenden Daten
                                */
    unsigned short id;          //  Unique identifier
                                /*  16 bit breit.
                                    Dieses und die beiden folgenden Felder 'Flags' und 'Fragment Offset'
                                    steuern die Reassembly (=Zusammensetzen von zuvor fragmentierten IP
                                    Datenpakete). Eindeutige Kennung eines Datagramms. Anhand dieses
                                    Feldes und der 'Source Address' kann der Empfänger die
                                    Zusammengehörigkeit von Fragmenten detektieren und sie wieder
                                    reassemblieren.
                                */
    unsigned short offset;      //  Fragment offset field
    unsigned char  ttl;         //  Time to live
    unsigned char  protocol;    //  Protocol(TCP, UDP, etc.)
    unsigned short checksum;    //  IP checksum
                                //  16 bit breit. Eine Prüfsumme ausschließlich für den Header
    unsigned int   srcaddr;     //  Source address
    unsigned int   dstaddr;     //  Destination address
 }; // Ende struct IPHDR

 struct TCPHDR
 {
   unsigned short	srcport; // Port über den wir senden
   unsigned short	dstport; // Port den wir ansprechen wollen
   unsigned int 	seqno;
   unsigned int 	ackno;
   unsigned char	offset;
   unsigned char	flags;   // Art des Pakets:
                                 // FIN / SYN / RST
                                 // PSH / ACK / URG
                                 // ENC / CWR
   unsigned short	window;
   unsigned short	checksum;
   unsigned short	urgptr;
 };

 struct FORCSUM
 {
      unsigned int srcaddr;
      unsigned int dstaddr;
      unsigned char padzero;
      unsigned char protocol;
      unsigned short tcplength;
 };

 // Funktions Prototypen

 int  RawSocket(char destIP[], int destPort, int fd, char srcIP[], int srcPort, int tcpFlag);
 int  csum(const void *bufv, int length);
 void IP_auslesen(char* IP_ADRESSE);
 int  SockAttempt(int * fd);

 int main(int argc, char *argv[])
 {
   //Deklaration der benötigte Variablen
   char srcIP[MAX_PATH], destIP[MAX_PATH];
   int  destPort, srcPort, tcpFlag, fd;

   //Initialisierung der Variablen
   IP_auslesen(srcIP);
   strcpy(destIP,"193.99.144.71"); // ping auf www.heise.de

   destPort = 80;
   srcPort  = 1723; // PPTP Port
   tcpFlag  = 2;    // SYN Flag
   fd       = 0;

   system("CLS");

   printf("Settings:\r\n");
   printf("---------\r\n");
   printf("Source IP       : %s\r\n",srcIP);
   printf("Source Port     : %i\r\n",srcPort);
   printf("Destination IP  : %s\r\n",destIP);
   printf("Destination Port: %i\r\n",destPort);
   printf("\r\n");
   printf("Now attempting to create socket...\r\n");

   if(SockAttempt(&fd)==0)
   {
		printf("... successful !!!\r\n\r\n");
   }

   printf("Creating own TCP/IP headers...\r\n");
   RawSocket(destIP, destPort, fd, srcIP, srcPort, tcpFlag);

   closesocket(fd);
   WSACleanup();

   system("PAUSE");
   return 0;
 }

 int SockAttempt(int * fd)
 {
   WORD sockVersion;
   WSADATA wsaData;
   int iErr = 0, opt = 1;

   sockVersion = MAKEWORD(2, 2);
   if (WSAStartup(sockVersion, &wsaData)!=0)
   {
	   printf("WSAStartup Error -> ");
	   iErr = WSAGetLastError();
   }
   else
   {
       *fd = WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
       if (*fd == SOCKET_ERROR)
       {
          printf("WSASocket Error -> ");
          iErr = WSAGetLastError();
       }
       else
       {
          if (setsockopt(*fd, IPPROTO_IP, IP_HDRINCL,(char*)&opt, sizeof(opt)) == SOCKET_ERROR)
          {
             printf("setsockopt Error -> ");
             iErr = WSAGetLastError();
          }
       }
   }

   return iErr;
 }

 int RawSocket(char destIP[], int destPort, int fd, char srcIP[], int srcPort, int tcpFlag)
 {
    struct sockaddr_in to;
    struct FORCSUM forcsum;
    struct TCPHDR tcp;
    struct IPHDR ip;
    char buf[60] = {0};
    int iErr;

	to.sin_family      = AF_INET;
	to.sin_port        = htons((u_short)destPort);
	to.sin_addr.s_addr = inet_addr(destIP);

	// IP header erstellen
	ip.verlen = 0x45;
	ip.tos	  = 0x00;
	ip.totallength = 24;
	ip.id = 1;
	ip.offset = 0;
	ip.ttl = 0x80;
	ip.protocol = IPPROTO_TCP;
	ip.checksum = 0;
	ip.dstaddr = inet_addr(destIP);
	ip.srcaddr = inet_addr(srcIP);

	// TCP header erstellen
	tcp.dstport = htons((u_short)destPort);
	tcp.ackno = 0;
	tcp.offset = (unsigned char)(80);
	tcp.flags = tcpFlag;
	tcp.window = htons(0x4000);
	tcp.urgptr = 0;
	tcp.checksum = 0;

	forcsum.dstaddr = ip.dstaddr;
	forcsum.padzero = 0;
	forcsum.protocol = IPPROTO_TCP;
	forcsum.tcplength = htons(sizeof(tcp));

	tcp.srcport = htons((u_short)srcPort);
	tcp.seqno = htonl((unsigned short)((rand()<<16)|rand()));

	forcsum.srcaddr = inet_addr(srcIP);

	memcpy(buf, &forcsum, sizeof(forcsum));
	memcpy(buf+sizeof(forcsum), &tcp, sizeof(tcp));
	tcp.checksum = csum(buf, sizeof(forcsum)+sizeof(tcp));

	memcpy(buf, &ip, sizeof(ip));
	memcpy(buf+sizeof(ip), &tcp, sizeof(tcp));

	memset(buf+sizeof(ip)+sizeof(tcp), 0,sizeof(buf)-sizeof(ip)-sizeof(tcp));

	ip.checksum = csum(buf, sizeof(ip)+sizeof(tcp));

	memcpy(buf, &ip, sizeof(ip));

	printf("done...\r\n");
	printf("Attempting to send data...\r\n");
[B][U]	iErr = sendto(fd, buf, sizeof(ip)+sizeof(tcp), 0,(struct sockaddr*)&to, sizeof(to));

	if(iErr == SOCKET_ERROR)
	{
		iErr = WSAGetLastError();
		printf("sendto Error: %i\r\n\r\n",iErr);
	}
	else
		printf("Bytes Sent: %i\r\n\r\n",iErr);


	return 0;
 }
[/U]
[/B]
 int csum(const void *bufv, int length)
 {
    const unsigned short *buf = (const unsigned short *)bufv;
    unsigned long result = 0;

    while (length > 1) {
        result += *(buf++);
        length  -= sizeof(*buf);
    }
    if (length) result += *(unsigned char*)buf;
    result = (result >> 16) + (result & 0xFFFF);
    result += (result >> 16);
    result = (~result)&0xFFFF;

    return (int)result;
 }

 void IP_auslesen(char* IP_ADRESSE)
 {
  struct    hostent* h;
  WSADATA   wsaData;
  UCHAR     ucAddress[4];
  CHAR      szHostName[MAX_PATH];
  int       x;

    WSAStartup(MAKEWORD(1, 1), &wsaData);
    if(SOCKET_ERROR != gethostname(szHostName, NUM_ELEMENTS(szHostName)))
    {
        if(NULL != (h = gethostbyname(szHostName)))
        {
            for(x = 0; (h->h_addr_list[x]); x++)
            {

                ucAddress[0] = h->h_addr_list[x][0];
                ucAddress[1] = h->h_addr_list[x][1];
                ucAddress[2] = h->h_addr_list[x][2];
                ucAddress[3] = h->h_addr_list[x][3];

                wsprintf(IP_ADRESSE, "%d.%d.%d.%d", ucAddress[0], ucAddress[1], ucAddress[2], ucAddress[3]);
            }
        }
    }
    WSACleanup();
 }
Andere IP eingesetzt und kompilliert, es gibt einen sendto error 10004:
WSAEINTR

(10004)

Interrupted function call.

A blocking operation was interrupted by a call to WSACancelBlockingCall.
Ich habe nur leider gar keine Ahnung, was ich falsch mache. Die Firewall meldet sich, drücke ich auf zulassen kommt dieser Error, drücke ich auf ablehnen kommt dass die daten geshcickt wurden, aber es wird leider nichts geschickt, habe das per Wireshark nachgeprüft.
Kann mir da wer unter die Arme greifen, was ich falsch mache?

Edit: Bis zum unterstrichenen geht alles gut....
 
  • C TCP/IP code macht ärger Beitrag #2
C

cc_ip

Bekanntes Mitglied
Dabei seit
08.03.2007
Beiträge
214
Reaktionspunkte
0
dum di dum es gibt 3 möglichkeiten:

A: du hast win xp sp2 und du benutzt einen etwas andren code, als den hier (in welcher die sourceip nicht mit deiner übereinstimmt) der noch eine zeile code mehr hätte und die funktion "IP_auslesen()" unnötig macht (stichwort: fake sourc IP).

B: du sendest was auf ein bereits connected'es socket.
<--- aber trifft ja beides nicht zu, und hier kommt möglichkeit

(dein fehler) c: darum sag ich dir guck dir doch mal die Funktion:
"IP_auslesen()" an und du wirst merken da fehlen genau 2 zeilen code. Diese fehlermeldung zeigt auch das du Windows XP Sp2 benutzt, früher ging das noch so (wobei dein code dann in einen bestimmten maße sinnfrei wäre) jetzt wurde es leider gefixt.

Tipp: Ein teil von möglichkeit A ist genau dein fehler (und nein dein fehler ist nicht win xp sp2).
 
  • C TCP/IP code macht ärger Beitrag #3
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Ich benutze den Code genau so, hab den aus dem Internet.
Danke für die Tipps, ich werde mal drüber gucken.:goil:
 
  • C TCP/IP code macht ärger Beitrag #4
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, dank cc_ip 's Hilfe hat sich das Problem behoben.:ja:
 
  • C TCP/IP code macht ärger Beitrag #5
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Gut, nun zum nächsten Problem, ist es
a) möglich ein solches erstelltes Packet in eine bestehende Verbindung einzuschleusen?
b)Die Source IP zu verändern?
 
  • C TCP/IP code macht ärger Beitrag #6
MR.Q

MR.Q

Bekanntes Mitglied
Dabei seit
17.11.2005
Beiträge
1.359
Reaktionspunkte
0
Gut, nun zum nächsten Problem, ist es
a) möglich ein solches erstelltes Packet in eine bestehende Verbindung einzuschleusen?
b)Die Source IP zu verändern?

a) Da eine Verbindung aus einer Menge gesendeter Pakete besteht, logischerweise schon... Musst du halt die Daten die für die Verbindung relevant sind herausfinden, und in die Header einsetzen.

b) Sicher.
 
  • C TCP/IP code macht ärger Beitrag #7
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Zu a) Also quasie Mitsniffen und dann die Sachen anpassen, wie
Sequenznummer etc?
Bei einer anderen Verbindung wird das schwierig, oder nicht?
Zu b) Habe daon gehört, dass das IP fälschen ab SP2 nicht mehr möglich ist.
Deswegen die Frage, fälsche ich dann dei IP müsste Wireshark dann als
Source nicht auch diese gefälschte anzeigen? Weil Wireshark zeigt dann
immer die "richige" IP an.
 
  • C TCP/IP code macht ärger Beitrag #8
MR.Q

MR.Q

Bekanntes Mitglied
Dabei seit
17.11.2005
Beiträge
1.359
Reaktionspunkte
0
ad a) Ja.

ad b) Ein Paket ist nur eine Abfoge von Bytes, die dann halt dann noch gesendet werden. Demnach kann man prinzipiell alles herstellen und fälschen, wenn man die Bytes einfach nur anders zusammensetzt.
Inwieweit das dann am Ende noch von Windows kontrolliert wird (IP vergleichen und korrigieren zB) weis ich nicht. Zur Not musst du dann hardwarenaher Programmieren etc um den Schutz - sollte es einen geben - zu umgehen.

Ich mach nichts mit Windows - ich kann dir jetzt nicht so die systemspezifischen Sachen erklären ;)
 
  • C TCP/IP code macht ärger Beitrag #9
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, dann schonmal danke, kennt sich denn hier wer anders mit sowas aus, aber unter Windows?
Weil ich will das unbedingt unter Windows realisieren, kein OS Wechsel...
 
  • C TCP/IP code macht ärger Beitrag #10
C

cc_ip

Bekanntes Mitglied
Dabei seit
08.03.2007
Beiträge
214
Reaktionspunkte
0
google mal nach: winpcap
 
  • C TCP/IP code macht ärger Beitrag #11
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hab ich getan,bzw. hab das bereits installiert. Was muss ich denn nun machen?! Den Programm aufbau den ich hier habe, kann ich den wieter verwenden oder wie läuft das nun ab?!
 
  • C TCP/IP code macht ärger Beitrag #12
K

KillAV

Bekanntes Mitglied
Dabei seit
16.06.2007
Beiträge
49
Reaktionspunkte
0
Also bei mir geht dein Code,wenn ich die IP von meinem 2 Pc eingebe,das Programm starte dann empfängt der Pc 2 Daten von Pc 1.
Habe es mit nem Sniffer überprüft.

@Anno1989: Dein PostFach ist voll,deshalb kann ich dir nix senden.
 
  • C TCP/IP code macht ärger Beitrag #13
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Jo, also hab mir das Winpcap mal angesehen und mal versucht was zu kompillieren, leider erfolglos zu viele Fehler ind en Header Dateien.
Gibt es nicht auch eine Möglichkeit ohne Winpcap sich der Windows IP kontrole mit SP2 zu entziehen?
Es ist ja nun mal mein Windows, kann man da nicht irgendwo etwas verstellen?^^
 
  • C TCP/IP code macht ärger Beitrag #14
C

cc_ip

Bekanntes Mitglied
Dabei seit
08.03.2007
Beiträge
214
Reaktionspunkte
0
Zuletzt bearbeitet:
  • C TCP/IP code macht ärger Beitrag #15
K

KillAV

Bekanntes Mitglied
Dabei seit
16.06.2007
Beiträge
49
Reaktionspunkte
0
Boar geil!!!
Bei mir gehts damit kann man wirklich die Source-IP fälschen.
xD
 
  • C TCP/IP code macht ärger Beitrag #16
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Wo muss ich den Befehl hier:
net stop SharedAccess
eingeben?
Habs unter Start -> Ausführen gemacht, leider bleibt die Src Adresse wie Wireshakr anzeigt nach wie vor die Originale:
Internet Protocol, Src: 192.168.2.1 (192.168.2.1), Dst: 192.168.2.104 (192.168.2.104)
ODer hab ich da was falsch gemacht?^^
Edit: Admin bin ich
@KillAV: zeig mal bitte die Zeile, mit der du die Src IP veränderst.
 
  • C TCP/IP code macht ärger Beitrag #17
K

KillAV

Bekanntes Mitglied
Dabei seit
16.06.2007
Beiträge
49
Reaktionspunkte
0
PHP:
strcpy (srcIP,"Dann die IP");

Nur mein Sniffer zeigt mir an die Checksume (0) sei verkehrt.
 
  • C TCP/IP code macht ärger Beitrag #18
C

cc_ip

Bekanntes Mitglied
Dabei seit
08.03.2007
Beiträge
214
Reaktionspunkte
0
ich versteh nich warum ihr nich einfach winpcap benutzt ^^
edit: aha deine ip ist also dann: Dann die IP, sehr intressant ^^
 
  • C TCP/IP code macht ärger Beitrag #19
K

KillAV

Bekanntes Mitglied
Dabei seit
16.06.2007
Beiträge
49
Reaktionspunkte
0
Hmmm was ich nicht verstehe warum mir der Sniffer anzeigt,das die Checksume falsch sei.
o_O
 
Zuletzt bearbeitet:
  • C TCP/IP code macht ärger Beitrag #20
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Weil es bei ihm scheinbar auch so klappt, adde mich am ebsten mal per icq dann shcickst du mir nachher mal ein Packet, KillAV.;)
 
Thema:

C TCP/IP code macht ärger

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben