c++ recv hook

07/22/2013 16:19 Luôô#1
Hey,

ich hab mir einen recv, send hook gebastelt.
Die Send funktion funktioniert einwandfrei aber die recv funktion leitet die packete nachdem loggen nicht mehr weiter.
Wenn ich die logging funktion bei der recv funktion austelle geht es einwandfrei.
Code:
int WINAPI  XRecv(SOCKET Socket, char *Buffer, int Length, int Flags) 
{
	char *Buf = Buffer;
   	int leng = Recv(Socket, Buf, Length, Flags);
   	if (leng > 0)
   	{
		PacketCryption(Buf, leng);
		WriteLogRecv(Buf, leng);
	}
	return leng;
}

void WriteLogRecv(char* MSG, int Lenght)
{
	FILE * logfile;
	if((logfile=fopen("C:\\RecvLog.LOG", "a+")) != NULL)
	{
		time_t secs=time(0);
		tm *t=localtime(&secs);
		fprintf(logfile, "[RECV] :: %i >> %04d-%02d-%02d %02d:%02d:%02d >> ", Lenght, t->tm_year+1900,t->tm_mon+1,t->tm_mday, t->tm_hour,t->tm_min,t->tm_sec);
		for(unsigned int i = 0; i < Lenght; i++)
		{
			fprintf(logfile, "0x%02x, ", (BYTE)MSG[i]);
		}
		fprintf(logfile, "\n");
		fclose(logfile);
	}
}

Recv = (int (WINAPI  *)(SOCKET, char *, int, int))DetourFunction((PBYTE)GetProcAddress(GetModuleHandle(L"ws2_32.dll"), "recv"), (PBYTE)XRecv);
Ich hoffe ihr könnt mir helfen :handsdown:
07/22/2013 18:00 Dr. Coxxy#2
mmh sieht eigtl soweit korrekt aus, was machste denn in "PacketCryption"?

EDIT:
Quote:
int Lenght
hihi
07/22/2013 18:07 Luôô#3
simple byte verschiebung die ist aber auch richtig die benutze ich ja auch bei der send.
Es liegt an der log funktion. Egal welche Log Funktion/Klasse ich benutze
07/22/2013 18:33 Schlüsselbein#4
Debuggen.
07/22/2013 18:37 Luôô#5
Die Pakete kommen ja im log an. Kann es sein das die Log Funktion zu lange dauert und somit der Client ein TimeOut gibt?
07/22/2013 18:40 Padmak#6
Nein.
Debuggen -> schaun, ob er überhaupt die originale recv-Funktion aufruft und ob die übergebenen Daten alle passen

Padmak
07/22/2013 19:29 Dr. Coxxy#7
Quote:
Originally Posted by Luôô View Post
simple byte verschiebung die ist aber auch richtig die benutze ich ja auch bei der send.
Es liegt an der log funktion. Egal welche Log Funktion/Klasse ich benutze
dir ist klar, dass du wenn du den buffer decryptest und nach dem loggen deine änderungen des packets nicht wieder rückgängig machst, dass dann die originalanwendung versuchen wird den bereits decrypteten buffer nochmals zu decrypten, was wahrscheinlich ziemlich in die hose gehen wird?
(zmdst wenn du und das programm das tun was ich denke, deswegen auch die frage was du in packetcryption machst.)
07/22/2013 21:46 Luôô#8
Hab ich mir auch schon gedacht aber nein hab es auch schon wieder gecryptet.
Ich kann entweder nur loggen oder nur decrypten. Sonst kommen die Packet zu spät oder so an und ich kann nicht einloggen
07/22/2013 22:19 Dr. Coxxy#9
Quote:
Originally Posted by Luôô View Post
Hab ich mir auch schon gedacht aber nein hab es auch schon wieder gecryptet.
Ich kann entweder nur loggen oder nur decrypten. Sonst kommen die Packet zu spät oder so an und ich kann nicht einloggen
kann ich mir nicht vorstellen.
versuch mal den buffer encrypted zu loggen, also ohne etwas zu de oder/und encrypten.

was soll eigtl. das:
Code:
char *Buf = Buffer;
kannst doch direkt den übergebenen pointer benutzen?
wird dir der compiler zwar rausoptimieren, aber trzd. eigtl unnötig.
07/22/2013 23:14 Padmak#10
Kopier doch das empfangene in einen neuen Buffer, decrypte das und logg es dann mit.
Wenn das auch nicht geht, debuggen!

Padmak