Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 13:39

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Hooked recv(Winsock) problem

Discussion on Hooked recv(Winsock) problem within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Hooked recv(Winsock) problem

Hi!

Ich habe die send&recv function von Winsock gehooked (von einem Spiel).
Das Problem aber ist irgendwie die recv Funktion und zwar liefert sie mir falsche Werte bzw. "unmögliche" Werte. Verglichen mit WPE Pro liefert WPE Pro die richtigen Werte.

Siehe Screens: (Achtets aufs Recv)
Mein Sniffer:

WPE Pro:


Komisch, send funktioniert, aber recv nicht

Code:
Code:
void printPacket(const char *buf, int len) {
	
	cout << "0000   ";

	for ( int i = 0; i < strlen(buf); ++i ) { //weil recv failt, verwende ich strlen(buf) um unnötigen packet inhalt nicht auszugeben
		if ( i != 0 && i % 16 == 0 ) {
			cout << "  ";

			int line = ( i / 16 ) - 1;

			for ( int j = 0; j < 16; ++j ) {
				char c = buf[line * 16 + j];

				if ( c >= 32 && c <= 126 ) {
					cout << c;
				} else {
					cout << '.';
				}
			}

			cout << "\n" << hex << setw( 4 ) << setfill( '0' ) << i << dec << setw( 0 ) << "   ";
		} else if ( i % 16 == 8 ) {
			cout << ' ';
		}

		cout << hex << setw( 2 ) << setfill( '0' ) << ( int( buf[i] ) & 0xFF ) << ' ';
		cout << dec << setw( 0 );

		if ( i == len - 1 ) {
			int remaining = 16 - ( len % 16 );
			int fill = ( remaining * 3 ) + 2;

			if ( remaining >= 8 ) {
				++fill;
			}

			for ( int j = 0; j < fill; ++j ) {
				cout << ' ';
			}

			int line = ( i - ( ( len % 16 ) - 1 ) ) / 16 ;

			for ( int k = 0; k < ( len % 16 ); ++k ) {
				char c = buf[line * 16 + k];

				if ( c >= 32 && c <= 126 ) {
					cout << c;
				} else {
					cout << '.';
				}
			}
		}
	}

	cout << "\n\n";
}


int WINAPI send_hook(SOCKET s, const char *buf, int len, int flags){

	cout << "Send "<< TimeToString() << ": (Length: " << len << " bytes)\n\n";
	printPacket(buf, len);
	cout << endl;
	//Sleep(10);
	return send_detour(s, buf, len, flags);
}

int WINAPI recv_hook(SOCKET s, const char *buf, int len, int flags){
	
	cout << "Recv "<< TimeToString() << ": (Length: " << len << " bytes)\n\n";
	printPacket(buf, len);
	cout << endl;
	//Sleep(10);
	return recv_detour(s, buf, len, flags);
}

Habe erst vor kurzem angefangen mich mit Sockets zu beschäftigen und kann sein das ich etwas übersehe. Man lernt ja immer wieder was neues dazu, also seits nicht ganz böse zu mir

Wo ist mein fehler? :/
PS: Falls gefragt, ich leite das cout in die Console, deswegen das cout da.
XxharCs is offline  
Old 11/25/2013, 21:57   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Code:
printPacket(buf, len);
...
return recv_detour(s, buf, len, flags);
Du liest hier die Daten aus dem Buffer, bevor Daten in den Buffer geschrieben werden.

Code:
int received = recv_detour(s, buf, len, flags);
printPacket(buf, len);
return received;
sollte funktionieren.
snow is offline  
Thanks
1 User
Old 11/25/2013, 22:04   #3



 
+Yazzn's Avatar
 
elite*gold: 420
Join Date: Jan 2012
Posts: 1,030
Received Thanks: 982
Kleine Verbesserung: len gibt die Größe des receive buffers an, die Anzahl der empfangenen Bytes werden von der recv Funktion zurückgegeben.

Code:
int received = recv_detour(s, buf, len, flags);
printPacket(buf, received);
return received;
P.S.: Und buf ist bei recv nicht const.
+Yazzn is offline  
Thanks
1 User
Old 11/25/2013, 22:16   #4
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Quote:
Originally Posted by snow911 View Post
Du liest hier die Daten aus dem Buffer, bevor Daten in den Buffer geschrieben werden.

Code:
int received = recv_detour(s, buf, len, flags);
printPacket(buf, len);
return received;
sollte funktionieren.
&
Quote:
Originally Posted by Peter File View Post
Kleine Verbesserung: len gibt die Größe des receive buffers an, die Anzahl der empfangenen Bytes werden von der recv Funktion zurückgegeben.

Code:
int received = recv_detour(s, buf, len, flags);
printPacket(buf, received);
return received;
Das erklärt mal so einiges..^^ Danke!


Quote:
Originally Posted by Peter File View Post
P.S.: Und buf ist bei recv nicht const.
In printPacket wird buf sowieso in eine char Varable geschrieben oder sollte es sofort beim einlesen in eine char Variable gespeichert werden? Soweit ich weiß sollte man const nicht explizit weggelassen.
XxharCs is offline  
Old 11/25/2013, 22:20   #5



 
+Yazzn's Avatar
 
elite*gold: 420
Join Date: Jan 2012
Posts: 1,030
Received Thanks: 982
recv und recv_hook sollten die gleiche Signatur haben, weil wegen Prinzip.
+Yazzn is offline  
Thanks
1 User
Old 11/25/2013, 22:30   #6
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Quote:
Originally Posted by Peter File View Post
recv und recv_hook sollten die gleiche Signatur haben, weil wegen Prinzip.
Stimmt!

Mein verbesserter Code (nur recv ausschnitt):
Code:
DETOUR_TRAMPOLINE(int WINAPI recv_detour(SOCKET s, char *buf, int len, int flags), recv);
...
...
int WINAPI recv_hook(SOCKET s, char *buf, int len, int flags){
	
	int received = recv_detour(s, buf, len, flags);
	cout << "Recv "<< TimeToString() << ": (Length: " << received << " bytes)\n\n";
	printPacket(buf, received);
	cout << endl;
	//Sleep(10);
	return received;
}

Da ist aber jetzt ein neues kleines Problem aufgetaucht undzwar, bei etwas größeren Packets stehen wieder 4-5 Zeilen mehr, bei WPE nicht Woran liegt das?
XxharCs is offline  
Old 11/26/2013, 00:52   #7



 
+Yazzn's Avatar
 
elite*gold: 420
Join Date: Jan 2012
Posts: 1,030
Received Thanks: 982
Dann läuft da vermutlich was bei deiner printPacket Funktion falsch. Sonst erklär uns doch mal was deine printPacket Funktion genau machen soll.
+Yazzn is offline  
Old 11/26/2013, 16:48   #8
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Quote:
Originally Posted by Peter File View Post
Dann läuft da vermutlich was bei deiner printPacket Funktion falsch. Sonst erklär uns doch mal was deine printPacket Funktion genau machen soll.
Mit printPacket gebe ich einfach das Packet formatiert aus.(16 Stellen hex und dannach bzw. daneben den ASCII dazu/zur Zeile, diese formatierte Ausgabe hängt natürlich mit der Packet länge zusammen)

Ich glaub ich habe mich mit einer for-Schleife vertan, ich werd es nochmal durchgehen sobald ich mit der Zeit besser bin.
XxharCs is offline  
Old 11/26/2013, 17:35   #9




 
Omdi's Avatar
 
elite*gold: 93616
Join Date: Apr 2010
Posts: 13,737
Received Thanks: 14,990
Eventuell liegt es daran?

Code:
for ( int i = 0; i < strlen(buf); ++i ) { //weil recv failt, verwende ich strlen(buf) um unnötigen packet inhalt nicht auszugeben
Omdi is offline  
Old 11/26/2013, 18:05   #10
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
Quote:
Originally Posted by Omdihar View Post
Eventuell liegt es daran?

Code:
for ( int i = 0; i < strlen(buf); ++i ) { //weil recv failt, verwende ich strlen(buf) um unnötigen packet inhalt nicht auszugeben
Durch das behobene Problem mit der Packet Länge, verwende ich len, der Funktion wieder. len ist die Packetgröße die ich übergebe (also das received in dem Fall)

Code:
void printPacket(const char *buf, int len) {
    
...
	for ( int i = 0; i < len; ++i ) {
...
Code:
...
printPacket(buf, received);
...

Edit:
Das Problem war das ich Packet Länge übergegeben hab, man musste aber die Daten Länge des Packets übergeben.
Kann geclosed werden.
XxharCs is offline  
Reply


Similar Threads Similar Threads
Recv Funktion nutzen in C++ [Problem]
11/14/2013 - Nostale - 7 Replies
Hi, ich will mal wieder n bisschen mit der RECV Funktion rumspielen. 0051F131 > 8B45 FC MOV EAX,DWORD PTR SS: (EBP-4 !?!?!?!? WAS MACH ICH DAMIT) 0051F134 . 8B40 34 MOV EAX,DWORD PTR DS: 0051F137 . 8B55 F4 MOV EDX,DWORD PTR SS: (<< MEIN PAKET PER DLL) 0051F13A . E8 35A8FFFF CALL NostaleX.00519974 ;RECV Hier wird das Recv Paket an die Recv Funktion übergeben, wie schreib ich EAX wenn EBP einen Wert hat der von meiner DLL selbst...
Winsock send Hook Problem
08/08/2011 - General Coding - 20 Replies
Huhu, Ich würde gerne die send(...) Mehtode hooken, um das Socket abfangen zu können, damit ich danach eigene Pakete verschicken kann. Das Problem besteht darin, dass sobald ich die dll injecte(z.b in firefox) und ein paket versende, einmal die MessageBox erscheint, das send() aufgerufen wurde und danach das Programm abstürtzt. Zum hooken benutze ich microsoft detours 1.5 und arbeite unter win 7 64bit. Die dll compile ich als 32bit und injecte sie auch in einen 32bit prozess. Würde mich...
[HELP]Winsock Functions, recv from(von) Process
08/01/2011 - AutoIt - 2 Replies
Hallo Ich bauen grad einen TCP recv Script, um von einem Process die Packete zu empfangen. Habe hier ein bespiel server&client gebaut um packete zu simulieren. Diese Packete möchte ich nun per script empfangen. Nun bin ich grad am hängen. Hab da wenig erfahrung mit DLLCall und weiß nicht zu 100% ob das überhaupt möglich ist. Hier der Server: #include <GUIConstantsEx.au3> Opt('MustDeclareVars', 1)
[C++]Hook all Recv function Problem
08/21/2010 - C/C++ - 5 Replies
Hi Leute wenn ich send hooke egal welches läuft das alles super nur wenn ich irgendein recv hooke habe ich immer eine Packet size von 1000 bis 10000. sry das ich schon wieder nerve #include "WinSock2.h" #include <cstdio> #include <ctime> #include <fstream> #include <iomanip>
[Question] Hooking send() & recv() works, but recv hiding data for co???
05/06/2009 - CO2 Programming - 2 Replies
Hey guys, I've been making a DLL to allow another program to intercept the packets of conquer using windows pipes. (Then its the job of the main program to decrypt the packets, the DLL only gives a communication channel for the main program) (winsock functions btw) - hooking send() works fine for my internet browser - hooking recv() works fine for my internet browser - hooking send() works fine for conquer online



All times are GMT +2. The time now is 13:39.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.