TCP stream uitlezen via C++

Status
Niet open voor verdere reacties.

JB'tje

Gebruiker
Lid geworden
31 mei 2004
Berichten
556
Hallo allemaal,

Ik wil een programmatje maken dat de comminucatie van server naar spel(op de PC) kan uitlezen. Deze comminucatie gaat via TCP. Er hoeft dus geen verbinding gemaakt te worden, alleen uitgelezen van een al bestaande.

Ik heb gegoogled, maar nog niet iets gevonden waarmee ik verder kan. Ook heb ik een open source script waarin het ergens zou moeten staan, maar hierin heb ik het nog niet kunnen ontdekken :S

C++ is nieuw voor mij en verder dan de basis zal mijn kennis niet komen. Wel heb ik al ±7 jaar ervaring met PHP wat toch wel een beetje helpt met het identificeren van codes...


mocht iemand nog een werkend stukje script hebben dat TCP streams kan uitlezen, dan zie ik die graag!

Ik hoop door voornamelijk knip en plakwerk dit projectje te kunnen maken :D
Alvast bedankt!
JB'tje

p.s. Ik maak momenteel gebruik van visual studio 2008. Is dit een goede of kan ik beter overstappen naar een simpeler programeerprogramma?
 
Hallo allemaal,

Ik wil een programmatje maken dat de comminucatie van server naar spel(op de PC) kan uitlezen. Deze comminucatie gaat via TCP. Er hoeft dus geen verbinding gemaakt te worden, alleen uitgelezen van een al bestaande.

Ik weet niet precies wat je allemaal met de uit te lezen informatie wilt doen, maar een programma als Wireshark kan in elk geval alle communicatie tussen de server en het spel laten zien.
 
Het programma moet uiteindelijk gaan zoeken naar de volgende volgorde van code:
PHP:
04  03  02  01  00  50  02  80  97  69  38  00  XX  40  2C  00  
00  00  00  00  XX  XX  XX  XX  04  03  02  01  00  50  02  80  
97  69  38  00  XX  40  2C  00  00  00  00  00  XX  XX  XX  XX  
04  03  02  01  34  10  02  80  02  00  01  00  01  00  00  00  
68  00  00  00  03  00  00  00  00  00  00  00  37  00  00  00
Op de plaatsen waar XX staat zijn de waardes niet bekent, de rest staat vast.

Als dit beginstuk in het pakketje gevonden is moet uit het vervovolg (na wat hierboven staat):
PHP:
00  00  00  00  10  00  00  00  [12]  00  [13] 00 [14] 00 [15] 00
[16] 00 [17] 00 [18] 00 [19] 00  [20]  00  [21] 00 [22] 00  37  00
[1]  [2] [3] [4] [5] [6] [7] [8]  [9] [10] [11] 05  00  00  00  00
De decimale getallen opgehaald worden waar [1] tot [22] staat. Als op een van deze plekken een bepaald getal staat, moet er een beep of ander geluidje te horen zijn.....

De tussentijd tussen het binnenkomende pakketje en de beep moet zo kort morgelijk zijn.

M.v.g.
JB'tje
 
Ik vind het wel een interessante vraag, maar heb er zelf geen ervaring mee. Als je zoekt op 'c++ http sniffer' dan krijg je wel enkele voorbeelden, misschien dat dat helpt.

Dat je 7 jaar ervaring hebt met PHP is zeker mooi meegenomen en zal zeker wel in je voordeel werken. In elk geval succes. :)
 
Bedankt! :thumb:
Met deze zoekterm is inderdaad wel het een en ander te vinden!

http://1plus.se/source.asp?id=10 hier staat (wat de exe betreft) precies de source die ik nodig ga hebben....

Wel moet er een andere poort gecontroleerd worden, maar dat is een kwestie van aanpassen...


Ik heb nu de hele middag geprobeert om deze poort aan te passen en er een executable van te maken: het resultaat: 3x niets....

Als ik het .cpp bestandje open In MS Visual studio 2008 kan ik het niet debuggen -> dus geen exe van maken. Als ik het in een andere nieuw project zet (in een .h file), krijg ik 20 errors en 1 warning.....

Als ik het cpp bestand open met Borland C++ builder 6 is het wel mogelijk er een exe van te maken, maar zodra ik die aanroep gebeurt er helemaal niets :S


Kan iemand mij vertellen wat de precieze bedoeling is van de .cpp en .h bestanden? (wat zet je in de .h bestanden, en wat in de .cpp)

Ook zou ik heeel graag willen weten hoe ik dit .cpp bestandje wel kan compilen naar een .exe bestand... mocht iemand het weten, dan hoor ik het graag!

M.v.g.
JB'tje
 
Bij het project dat te downloaden is ontbreekt sowieso nog een header.

Code:
#include "packet_headers.h"

Bovenstaande header zit niet bij de download, en daardoor werkt het project niet. (ik vermoed dat dit bestand wel ergens op de site te downloaden is)
 
hmm ja..... dat had ik kunnen weten :(

Ik heb alle zichtbare bestandjes gedownload, maar nergens het missende bestandje gevonden.....


Door regels: 120, 121 en 160-180 is op te maken dat er in het missende bstandje een structure stond.... Volgens mij iets in de richting van het volgende?

PHP:
#pragma once


#ifndef _WIN32_WINNT            // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600     // Change this to the appropriate value to target other versions of Windows.
#endif


typedef struct lIP
{
	unsigned char ihl; // Version and IP Header Length
	unsigned char protocol;
} IP;

typedef struct lTCP
{
	unsigned short flags; //Flags 3 bits and Fragment offset 13 bits
	unsigned short data;
	unsigned long dest_port;
} TCP;

Zit ik een beetje in de buurt?????


'k heb hem een mailtje gestuurd.. nu nog hopen op een reactie!

M.v.g.
JB'tje


Edit:
Met bovenstaande content in packet_header.h krijg ik 7 errors en 1 warning....
1 van de errors wordt veroorzaakt door de andere 6... dus moeten er nog 6 opgelost worden voordat het script misschien weer werkt!

LNK2019: unresolved external symbol __imp__WSAStartup@8 referenced in function "bool __cdecl fInitWinsock(void)" (?fInitWinsock@@YA_NXZ) Sniffer.obj
LNK2019: unresolved external symbol __imp__bind@12 referenced in function "unsigned int __cdecl fInitSocket(void)" (?fInitSocket@@YAIXZ) Sniffer.obj
LNK2019: unresolved external symbol __imp__WSAIoctl@36 referenced in function "unsigned int __cdecl fInitSocket(void)" (?fInitSocket@@YAIXZ) Sniffer.obj
LNK2019: unresolved external symbol __imp__WSASocketW@24 referenced in function "unsigned int __cdecl fInitSocket(void)" (?fInitSocket@@YAIXZ) Sniffer.obj
LNK2019: unresolved external symbol __imp__ntohs@4 referenced in function _main Sniffer.obj
LNK2019: unresolved external symbol __imp__recv@16 referenced in function _main Sniffer.obj

Aangezien er geen regelnummers bijstaan van waar de error optreed.... kan ik er weinig mee.... (ja.. ze treden op in het bestand "Sniffer.obj") Ik heb het stukje code waar WSAstartup vergeleken met een andere code die wel werkt, maar helaas geen resultaten (niet posities en niet negatief...)


Edit 2: zoeken op de online MSDN gaf het volgende antwoord: #pragma comment(lib, "ws2_32.lib") moest ook nog in packet_headers.h komen te staan!!! Geen errors meer en het script is gemaakt...! (doet alleen niet wat het moet doen :S)
 
Laatst bewerkt:
Met bovenstaande code in het bestand "packet_headers.h" ben ik in staat zonder foutmeldingen het script te compilen....

Helaas werkt het niet zoals het zou moeten :S
Op regel 146 van sniffer.cpp staat "if(lIP->protocol==6){" hiermee controleerd het script of het protocol TCP is (wat ook ik nodig heb)


Als ik deze afdruk op het scherm blijkt het voornamelijk "0" te zijn en bij refreshen van een internetpagina komt er 1 2 en 5 ook uit..... Wellicht komt dit doordat ik het structure type van protocol "char" heb gegeven? (heb ik in meerdere andere bestandjes/codes gevonden...)

Kan iemand mij misschien vertellen waar de fout zit?

M.v.g.
JB'tje
 
De benodigde headers zijn wel te vinden via het internet. (zij het met een andere naamgeving)

Code:
struct iphdr {
	unsigned int ihl:4;
	unsigned int ver:4;
	unsigned char tos;
	unsigned short totlen;
	unsigned short id;
	unsigned short frag_and_flags;
	unsigned char ttl;
	unsigned char proto;
	unsigned short checksum;
	unsigned int src;
	unsigned int dst;
};


struct tcphdr {
	unsigned short sport;
	unsigned short dport;
	unsigned int   seq;
	unsigned int   acknum;
	unsigned int   unused:4;
	unsigned int   tcphl:4;
	unsigned char  Flags;
	unsigned short Windows;
	unsigned short cksum;
	unsigned short UrgPointer;
};

bron: http://www.somethinginteresting.org/src/poorsniff.h (+ poorsniff.c);
 
He,

hmm... dus als ik dan alles even op een rijtje zet:
Code:
struct IP {
	unsigned int ihl:4;
	unsigned int ver:4;
	unsigned char tos;
	unsigned short totlen;
	unsigned short id;
	unsigned short frag_and_flags;
	unsigned char ttl;
	unsigned char proto;
	unsigned short checksum;
	unsigned int src;
	unsigned int dst;
};
Gebruik ik dan als structure...

met
Code:
IP * lIP;
wordt er een pointer gemaakt naar de structure.

char lPacket[1024];
lIP = (IP*)lPacket;
Eerste regel: maak een char aan met veel opslagcapaciteit, 2e regel vul de structure met een lap gegevens die komt te staan in lPacket???? (ik weet of dat klopt van de 2e regel...)

Dan wordt via enkele code de netwerkadapter gezocht en gebonden aan een socket (zeg ik dit goed?)
Code:
int lRecv=recv(lSock,lPacket,1024,0);
Haalt een boel gegevens van die socket op en slaat die op in lPacket --> dus in de structure IP met de pointer lIP?

Dat zou dan betekenen dat ik na deze laatste regel code
Code:
printf("%i\n",lIP->proto);
plaats in de source, dat ik het protocol nummer afgedrukt in beeld zie???


Waarom word 168, 171, 84 en 55 dan heel vaak afgedrukt als ik een pagina ververs :shocked:? en niet gewoon allemaal "6" zoals de bedoeling is :S

Hoe gaat het schrijven naar een structure eigenlijk ik zijn werk?
Is het zo dat als ik via "recv(socket, buffer, size, 0)" dat er dan in buffer iets komt als:
"00152405705245105484120245810"
En dat het dan weggeschreven wordt naar de structure alsvolgt:
membertype1 = 1/2 int (4 bits) dus komt "0015" in te staan?
membertype2 = 1/2 int (4 bits) dus komt "2405" in te staan?
membertype3 = int (8 bits) dus komt "70524510" in te staan?

dat zou misschien de rare getallen verklaren, dat gewoon het verkeerde deel uitgelezen wordt doordat de structure niet goed is (of in dit geval waarschijnlijk de manier van ophalen?)


M.v.g.
JBtje



Edit:
Het is me gelukt het "poorsniff" script aan de praat, en werkend te krijgen!!! Nu maar eens een boel eruit strippen en hopen dat het dan nog steeds werkt :D Heel erg bedankt voor deze link!
 
Laatst bewerkt:
De laatste Edit, betekend dat nu dat je geen uitleg meer over het gebruik van de structures nodig hebt?
 
He,

In theorie betekent dat dat ja, maar aangezien ik z'n type ben dat niet zomaar iets aanneemt, zou ik heel graag een uitleg willen, of een link waar in een uitleg kan vinden (heb tot heden nog niet echt iets gevonden :S)

M.v.g.
JBtje

p.s. Het script werkt! (dus project zou af zijn... :S) --> ik heb dus maar weer eens iets nieuws bedacht om hier nog even mee door te kunnen gaan....Daarvoor moet ik DE muis op een bepaalde plek zetten, en laten klikken (linkermuisbutton). Ik heb nog wel een script waarin dit ook gebreurt, zal me benieuwen of ik het eruiit kan halen (^^)
 
Jou voorbeeld:
Code:
char lPacket[1024];
lIP = (IP*)lPacket;
Eerste regel: maak een char aan met veel opslagcapaciteit, 2e regel vul de structure met een lap gegevens die komt te staan in lPacket???? (ik weet of dat klopt van de 2e regel...)

Wat er in de eerste regel gebeurd is dat je 1024 bytes in het geheugen alloceerd. In de 2e regel leg je een pointer van het type IP (ik zou overigens verwachten dat daar struct IP * zou moeten staan) naar de gealloceerde ruimte. Dus IPacket en IIP wijzen naar dezelfde locatie. Doordat IIP het type van de structure heeft, kun je de data in het buffer benaderen via de veldnamen uit de structure.

Wat ik hier zou doen is het volgende:
Code:
struct IP IIP;
Deze alloceerd het geheugen ter grote van de structure die je wilt uitlezen.

Daarna moet je de data gaan lezen uit de stream die ergens er voor is geopend en de handle lSock heeft gekregen met:
Code:
int lRecv=recv(lSock,&IIP,sizeof(struct IP),0);
Met &IIP geef je het adres naar de geheugenlocatie waar IIP zich bevindt. De sizeof bepaald de grote van de structure en je geeft daarmee aan dat je dat aantal bytes uit de stream wilt lezen.

Daarna kun je dan inderdaad met:
Code:
printf("%i\n",lIP.proto);
afdrukken wat voor waarde er in het veld proto staat. Hier gebruik je een punt omdat IIP geen pointer is, maar een lvalue.

Daarna geef je aan welke getallen er uit het buffer komen. Dit kan ik niet helemaal plaatsen omdat ik niet weet hoe je die hebt afgedrukt. Wat ik wel kan aangeven is hoe het structure er dan uit ziet.

Voorbeeld, buffer in hex: FF 05 45 A6 3B 39 42 0D etc.

Dan wordt de structure "gewoon" van voor naar achteren er overheen gelegd. Dus dan heb je de volgende waarden (aanname: short is 2 bytes, int is 4 bytes):
unsigned int ihl:4 -> F
unsigned int ver:4 -> F
unsigned char tos -> 05
unsigned short totlen -> 45 A6
unsigned short id -> 3B 39
unsigned short frag_and_flags -> 0D
etc.​

Ik hoop dat dit is waar je naar zocht.
 
He!

Heel erg bedankt! dit was indedaad de info die nog ontbrak :D Het script werkt dan wel.. maar weten hoe het werkt is ook altijd wel makkelijk :thumb:

Ik zal het nog eens een paar keer doorlezen, zodat ik het helemaal ga begrijpen!

Super!
JBtje
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan