Winsock send Hook crasht Programm?

06/21/2013 08:41 Cambios#1
Hey,
Habe vorhin ein Hook zusammengeschraubt womit ich mir bisschen die Pakete von Netzwerk Programmen anschauen wollte. In Counterstrike funktioniert das ganze ohne große Probleme, bei Firefox oder WoW schmiert es aber mit ner Acces Violation ab.. hab ich da irgendwas übersehen im Code?
Versuch schon seit gut ner Stunde rum, bekomms aber nicht gebacken.. mittlerweile schaut der Code auch schon bissel wüsst aus vom rumprobieren.. :rolleyes:

Code:
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
void WINAPI my_thread();
void log(char* msg);
void* detourFunc(BYTE *src, const BYTE *dst, const int len);
int WINAPI  hkSend(SOCKET sock, const char* buffer, int len,int flags);

//WSA Funktion "send"
typedef int (__stdcall * send_t)(SOCKET sock, const char* buffer, int len,int flags);
send_t pSend;

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
 switch (reason)
 {
  case DLL_PROCESS_ATTACH:
  CreateThread(0, 0, (LPTHREAD_START_ROUTINE)my_thread, 0, 0, 0);
  break;

  case DLL_PROCESS_DETACH:
  break;
 }

return TRUE;
}

void GetConsole(LPCSTR sTitle) {
	FILE *fh;
	AllocConsole();
	freopen_s(&fh, "CONOUT$", "wb", stdout);
	SetConsoleTitleA(sTitle);
}

 void WINAPI my_thread()
{
 GetConsole("Sendlog");
 DWORD dwSend = (DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll"), "send");
 pSend = (send_t)detourFunc((byte*)dwSend, (byte*)hkSend, 5);
}

int WINAPI hkSend(SOCKET sock, const char* buffer, int len,int flags)
{
	printf("buffer: %p\n", buffer);
	printf("length: %i\n", len);
	printf("flags: %i\n", flags);
	printf("---------------------\n");	
	return pSend(sock, buffer, len, flags);
}

void log(char* msg)
{
 FILE* fp = fopen("log.txt","a");
 fputs(msg, fp);
 fclose(fp);     
}

void* detourFunc(BYTE *src, const BYTE *dst, const int len) //gamedeception hook funktion..
{
	BYTE *jmp = (BYTE*)malloc(len+5);
	DWORD dwback;
	VirtualProtect(src, len, PAGE_READWRITE, &dwback);
	memcpy(jmp, src, len);   jmp += len;
	jmp[0] = 0xE9;
	*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
	src[0] = 0xE9;
	*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
	VirtualProtect(src, len, dwback, &dwback);
	return (jmp-len);
}
Hab ich da ne Deklation falsch gesetzt oder sonstige Noob fehler die man normal sehen sollte? :confused:
Bin verwirrt :s..

Die Log vom Wow Ordner sagt mir leider auch nicht all zu viel..

Code:
Program:	Wow.exe
ProcessID:	1132
Exception:	0xC0000005 (ACCESS_VIOLATION) at 0023:104E2F78

The instruction at "0x104E2F78" referenced memory at "0x104E2F78".
The memory could not be "executed".
Grüße:handsdown:
06/21/2013 09:44 Dr. Coxxy#2
musst in der detour funktion dem allokierten buffer mit virtualprotect execute rechte geben, ansonsten kriegste obige access violation wenn der prozess mit DEP läuft und versucht dein trampolin auszuführen.
06/21/2013 13:20 Master674b#3
Quote:
Originally Posted by Dr. Coxxy View Post
musst in der detour funktion dem allokierten buffer mit virtualprotect execute rechte geben, ansonsten kriegste obige access violation wenn der prozess mit DEP läuft und versucht dein trampolin auszuführen.
:facepalm:

Mit VirtualProtect, oh Gott... Du weißt hoffentlich, das VirtualProtect immer eine ganze memory PAGE ändert.
Wie wärs mal mit nem heap der HEAP_CREATE_ENABLE_EXECUTE gesetzt hat?

Was soll überhaupt diese Rotz Detourfunktion. Weißt du überhaupt was passiert, wenn ein anderer Thread gerade in dem Moment in dem du versuchst einen Detour zu schreiben diese 5+ bytes ausführt?

Threadsicherheit = NULL
06/21/2013 13:44 Dr. Coxxy#4
Quote:
Originally Posted by Master674b View Post
:facepalm:

Mit VirtualProtect, oh Gott... Du weißt hoffentlich, das VirtualProtect immer eine ganze memory PAGE ändert.
Wie wärs mal mit nem heap der HEAP_CREATE_ENABLE_EXECUTE gesetzt hat?

Was soll überhaupt diese Rotz Detourfunktion. Weißt du überhaupt was passiert, wenn ein anderer Thread gerade in dem Moment in dem du versuchst einen Detour zu schreiben diese 5+ bytes ausführt?

Threadsicherheit = NULL
weißte wie wenig das bei einem 0815 hack interessiert, dass es in 0.0000000000000001% der fälle mal nicht so optimal laufen kann?
wenn man direkt alle rechte setzt kann eh ziemlich wenig schiefgehen @ page.
06/21/2013 16:22 Padmak#5
Was ist aber, wenn dieser "0.0000000000000001% der fälle" mal eintritt, das kriegst du niemals richtig debuggt und gefixed.
Ausreden wie "das ist doch hier nicht wichtig" oder "wen interessiert das, das ist nur für mich" sind immer Schwachsinn, man sollte IMMER richtigen Code schreiben und nicht nur wenn's wichtig ist.

Padmak
06/21/2013 17:38 Dr. Coxxy#6
Quote:
Originally Posted by Padmak View Post
Was ist aber, wenn dieser "0.0000000000000001% der fälle" mal eintritt, das kriegst du niemals richtig debuggt und gefixed.
Ausreden wie "das ist doch hier nicht wichtig" oder "wen interessiert das, das ist nur für mich" sind immer Schwachsinn, man sollte IMMER richtigen Code schreiben und nicht nur wenn's wichtig ist.

Padmak
warum nicht gleich alle werte die du jemals benutzt doppelt abspeichern, am besten noch mit nem server synchronisieren, kann ja sein, dass kosmische strahlung mal nen bit im ram dreht, oder die NSA deine daten manipuliert!!!111einself11
06/21/2013 17:43 Cambios#7
Quote:
Originally Posted by Master674b View Post
:facepalm:

Was soll überhaupt diese Rotz Detourfunktion. Weißt du überhaupt was passiert, wenn ein anderer Thread gerade in dem Moment in dem du versuchst einen Detour zu schreiben diese 5+ bytes ausführt?

Threadsicherheit = NULL
Das ist die ganz normale Gamedeception Detour Funktion die du eigendlich überall findest, wenn mal nicht die Ms Detour benutzt wird..
Was erwartest du bitte von mir?..
Es geht mir hier nur darum die Netzwerkpakete die mit Winsock send rausgeschickt werden abzufangen und mir anzuzeigen, nicht darum nen ultra Programm zu machen das 100% sicher ist und sauber läuft bei anderen.

@Topic
Habe jetzt versucht die Execute Rechte (PAGE_EXECUTE_READWRITE) zu setzen, aber komischerweise schmiert das ganze immer noch ab, werde mir das ganze irgendwie später nochmal anschaun müssen.. hm
06/21/2013 17:49 Dr. Coxxy#8
Quote:
Originally Posted by Cambios View Post
Das ist die ganz normale Gamedeception Detour Funktion die du eigendlich überall findest, wenn mal nicht die Ms Detour benutzt wird..
Was erwartest du bitte von mir?..
Es geht mir hier nur darum die Netzwerkpakete die mit Winsock send rausgeschickt werden abzufangen und mir anzuzeigen, nicht darum nen ultra Programm zu machen das 100% sicher ist und sauber läuft bei anderen.

@Topic
Habe jetzt versucht die Execute Rechte (PAGE_EXECUTE_READWRITE) zu setzen, aber komischerweise schmiert das ganze immer noch ab, werde mir das ganze irgendwie später nochmal anschaun müssen.. hm
was fürn windoof, zeig mal, was du genau machst und guck mal mitm taskmanager nach ob der prozess data execution prevention aktiviert hat (musste evtl noch die spalte im taskmanager aktivieren).
06/21/2013 18:03 Cambios#9
Quote:
Originally Posted by Dr. Coxxy View Post
was fürn windoof, zeig mal, was du genau machst und guck mal mitm taskmanager nach ob der prozess data execution prevention aktiviert hat (musste evtl noch die spalte im taskmanager aktivieren).
Also beim Wow.exe Prozzes is die DEP Aktiviert laut Taskmanager..
Habe das ganze jetzt nochmal bisschen anders gemacht (hatte vorhin nochmal ne eigene detour funktion versucht die ich damals mal schrieb, aber die ist schrott.. :rolleyes:) - jetzt Crasht das ganze nicht mehr.. nur werden jetzt in der Console keine Pakete mehr angezeigt.
Bei Wow.exe könnte es vllt daran liegen das es per WSAsend schickt aber bei Counterstrike hats gestern ja geklappt, aber dort wirds auch nicht mehr angezeigt.. ein teufels kreis :D

Momentanige Detour Funktion ->
Code:
void* detourFunc(BYTE *src, const BYTE *dst, const int len) //gamedeception. i rather use windows detours, but however :P
{
	BYTE *jmp = (BYTE*)malloc(len+5);
	DWORD dwback;
	VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
	memcpy(jmp, src, len);   jmp += len;
	jmp[0] = 0xE9;
	*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
	src[0] = 0xE9;
	*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
	VirtualProtect(src, len, dwback, &dwback);
	VirtualProtect(jmp-len,len+5,PAGE_EXECUTE_READWRITE,&dwback);
	return (jmp-len);
}
Momentaniger Thread + send Funktion ->
Code:
 void WINAPI my_thread()
{
 GetConsole("Sendlog");
 DWORD dwSend = (DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll"), "send");
 pSend = (send_t)detourFunc((byte*)dwSend, (byte*)hkSend, 5);

}

int WINAPI hkSend(SOCKET sock, const char* buffer, int len,int flags)
{

	printf("buffer: %p\n", buffer);
	printf("length: %i\n", len);
	printf("flags: %i\n", flags);
	printf("---------------------\n");	

	return pSend(sock, buffer, len, flags);
}
Eigendlich sollte es ja die Anzeige anzeigen, tuts aber leider nicht..hm..
Jetzt erstmal was futtern.. später nochmal drüber schaun^^

p.s: Hab grade bei Filezilla getestet, da funktionierts - in Wow jetzt auch^^ Danke für eure Hilfe :)
Hätte ich eigendlich selbst drauf kommen können wegen den EXECUTE Rechten.. grml Peinlich^^

Grüße
06/21/2013 20:04 Padmak#10
Quote:
Originally Posted by Cambios View Post
The memory could not be "executed".
Hier stands übrigens schon :P

Padmak
06/21/2013 20:51 Cambios#11
Quote:
Originally Posted by Padmak View Post
Hier stands übrigens schon :P

Padmak
sowas kann ja auch mal andere ursachen haben.. :D
Hatte das z.b damals auch bei Detours wo es andere Fehler gab wo es dann zur selben Meldung kam, es aber an völlig anderen Dingen lag.. von daher war das dann etwas verwirrend für mich.. hätte aber eigendlich selbst drauf kommen sollen.. :o
06/29/2013 10:26 buFFy!#12
der Code kommt mir bekannt vor :rolleyes:

[Only registered and activated users can see links. Click Here To Register...]
06/30/2013 03:33 Cambios#13
Quote:
Originally Posted by buFFy! View Post
der Code kommt mir bekannt vor :rolleyes:

[Only registered and activated users can see links. Click Here To Register...]
Ausschnitte davon sind teilweise von dort übernommen ja :D
Aber ich benutze das Progg (btw die Dll) ja nur für mich und release es nicht (mittlerweile hab ich ne eigene Version geschrieben) , weil ich von WoW die gesendeten Pakete abfangen wollte und dann bisschen Pakete reversen - da kam mir die kleine Vorlage recht zum bisschen rumprobieren mit den Paketen. Hatte lange nicht mehr mit Hooks gearbeitet, nur damals bei Counterstrike noch mit Opengl Hooks.. und da brauchte ich bisschen Einstieg wieder - und dafür sind Tutorials ja da ;)
06/30/2013 10:45 Master674b#14
Quote:
Originally Posted by Cambios View Post
Ausschnitte davon sind teilweise von dort übernommen ja :D
Aber ich benutze das Progg (btw die Dll) ja nur für mich und release es nicht (mittlerweile hab ich ne eigene Version geschrieben) , weil ich von WoW die gesendeten Pakete abfangen wollte und dann bisschen Pakete reversen - da kam mir die kleine Vorlage recht zum bisschen rumprobieren mit den Paketen. Hatte lange nicht mehr mit Hooks gearbeitet, nur damals bei Counterstrike noch mit Opengl Hooks.. und da brauchte ich bisschen Einstieg wieder - und dafür sind Tutorials ja da ;)
Tu dir einfach selbst den gefallen und nimm MS Detours 2.x+ :D
Außer für kommerzielle Projekte, da darfst du das nicht benutzen.
06/30/2013 19:49 Cambios#15
Quote:
Originally Posted by Master674b View Post
Tu dir einfach selbst den gefallen und nimm MS Detours 2.x+ :D
Außer für kommerzielle Projekte, da darfst du das nicht benutzen.
Ich mag Ms Detours nicht, ich komme mit der Gamedeception Methode besser klar und es kommt ohne externe Libs etc aus. Von daher, Nope ;)