|
You last visited: Today at 13:39
Advertisement
Hooked recv(Winsock) problem
Discussion on Hooked recv(Winsock) problem within the C/C++ forum part of the Coders Den category.
11/25/2013, 21:47
|
#1
|
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.
|
|
|
11/25/2013, 21:57
|
#2
|
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.
|
|
|
11/25/2013, 22:04
|
#3
|
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.
|
|
|
11/25/2013, 22:16
|
#4
|
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
|
Quote:
Originally Posted by snow911
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
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
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.
|
|
|
11/25/2013, 22:20
|
#5
|
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.
|
|
|
11/25/2013, 22:30
|
#6
|
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
|
Quote:
Originally Posted by Peter File
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?
|
|
|
11/26/2013, 00:52
|
#7
|
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.
|
|
|
11/26/2013, 16:48
|
#8
|
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
|
Quote:
Originally Posted by Peter File
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.
|
|
|
11/26/2013, 17:35
|
#9
|
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
|
|
|
11/26/2013, 18:05
|
#10
|
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,227
|
Quote:
Originally Posted by Omdihar
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.
|
|
|
|
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.
|
|