recv hook problem

04/10/2015 20:06 Slade100#1
hey, also ich habe ein kleines problem, oder doch eher großes problem:o
arbeite gerade zum ersten mal mit hooks und so und hab versucht recv zu hooken,
also ich habe in einem spiel die recv funktion gehookt( glaube zumindest das ich das hab):D

z.b wenn ich mich einlogge sehe ich auch meine id/pw name etc.. andere namen die erscheinen kommen auch vor , aber am meisten ist da son müll drin
[Only registered and activated users can see links. Click Here To Register...]
sobald ich auf log in drücke kommen extreeeeem viele recv an ( ka ob soviel normal ist xD und dann nach mehreren sekunden stoppts einfach und nix kommt mehr...

hier meine funktionen die ich benutze

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
if (reason == DLL_PROCESS_ATTACH)
{
Console();
RecvAddr = (DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll "), "recv");
cout << hex << RecvAddr; // nur zum checken ob die richtige adresse kam :D
oDraw2D = (tDraw2D)DetourFunction((BYTE*)RecvAddr, (BYTE*)&Draw2D, 5);

}
return 1;
}

// ka ob man das was jetzt kommt so machen kann wie ich das jetzt gemacht habe xD

typedef int(__stdcall *tDraw2D)(SOCKET Socket, char *Buffer, int Length, int Flags);
tDraw2D oDraw2D = NULL;

void Draw2D(SOCKET Socket, char *Buffer, int Length, int Flags)
{
__asm PUSHAD;


for (int i = 0; i < Length; i++)
{
cout << Buffer[i];
printf(" ");
}
printf("\n");


__asm POPAD;
oDraw2D(Socket,Buffer,Length, Flags );
}

//und hier die detour function die ich aus einem tutorial ausm internet habe

void *DetourFunction(BYTE *orig, BYTE *hook, int len)
{
DWORD dwProt = 0;
BYTE *jmp = (BYTE*)malloc(len + 5);
VirtualProtect(orig, len, PAGE_READWRITE, &dwProt);
memcpy(jmp, orig, len);
jmp += len; // increment to the end of the copied bytes
jmp[0] = 0xE9;
*(DWORD*)(jmp + 1) = (DWORD)(orig + len - jmp) - 5;
memset(orig, 0x90, len);
orig[0] = 0xE9;
*(DWORD*)(orig + 1) = (DWORD)(hook - orig) - 5;
VirtualProtect(orig, len, dwProt, 0);
return (jmp - len);
}

ich bitte um hilfe ^^
04/10/2015 20:36 _asm#2
Quote:
Originally Posted by erfan100 View Post
hey, also ich habe ein kleines problem, oder doch eher großes problem:o
arbeite gerade zum ersten mal mit hooks und so und hab versucht recv zu hooken,
also ich habe in einem spiel die recv funktion gehookt( glaube zumindest das ich das hab):D

z.b wenn ich mich einlogge sehe ich auch meine id/pw name etc.. andere namen die erscheinen kommen auch vor , aber am meisten ist da son müll drin
[Only registered and activated users can see links. Click Here To Register...]
sobald ich auf log in drücke kommen extreeeeem viele recv an ( ka ob soviel normal ist xD und dann nach mehreren sekunden stoppts einfach und nix kommt mehr...

hier meine funktionen die ich benutze

BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
if (reason == DLL_PROCESS_ATTACH)
{
Console();
RecvAddr = (DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll "), "recv");
cout << hex << RecvAddr; // nur zum checken ob die richtige adresse kam :D
oDraw2D = (tDraw2D)DetourFunction((BYTE*)RecvAddr, (BYTE*)&Draw2D, 5);

}
return 1;
}

// ka ob man das was jetzt kommt so machen kann wie ich das jetzt gemacht habe xD

typedef int(__stdcall *tDraw2D)(SOCKET Socket, char *Buffer, int Length, int Flags);
tDraw2D oDraw2D = NULL;

void Draw2D(SOCKET Socket, char *Buffer, int Length, int Flags)
{
__asm PUSHAD;


for (int i = 0; i < Length; i++)
{
cout << Buffer[i];
printf(" ");
}
printf("\n");


__asm POPAD;
oDraw2D(Socket,Buffer,Length, Flags );
}

//und hier die detour function die ich aus einem tutorial ausm internet habe

void *DetourFunction(BYTE *orig, BYTE *hook, int len)
{
DWORD dwProt = 0;
BYTE *jmp = (BYTE*)malloc(len + 5);
VirtualProtect(orig, len, PAGE_READWRITE, &dwProt);
memcpy(jmp, orig, len);
jmp += len; // increment to the end of the copied bytes
jmp[0] = 0xE9;
*(DWORD*)(jmp + 1) = (DWORD)(orig + len - jmp) - 5;
memset(orig, 0x90, len);
orig[0] = 0xE9;
*(DWORD*)(orig + 1) = (DWORD)(hook - orig) - 5;
VirtualProtect(orig, len, dwProt, 0);
return (jmp - len);
}

ich bitte um hilfe ^^
1. Also erstmal vermeide bitte diese "Hook Funktionen" aus dem Internet, die sind totaler müll, nimm doch die Microsoft Detours oder die schönen [Only registered and activated users can see links. Click Here To Register...].
2. Am besten die Funktion "Draw2D" mit der __declspec(naked) calling convention umschreiben.
3. Ich denke, dass diese "kryptischen" Zeichen nur kommen, da die Packets vermutlich noch enrypted werden (Vermutung).
04/10/2015 20:52 Slade100#3
Quote:
Originally Posted by _asm View Post
1. Also erstmal vermeide bitte diese "Hook Funktionen" aus dem Internet, die sind totaler müll, nimm doch die Microsoft Detours oder die schönen [Only registered and activated users can see links. Click Here To Register...].
2. Am besten die Funktion "Draw2D" mit der __declspec(naked) calling convention umschreiben.
3. Ich denke, dass diese "kryptischen" Zeichen nur kommen, da die Packets vermutlich noch enrypted werden (Vermutung).
danke für die hilfe, zu
1. erst wollte ich detours.h verwenden aber ich bin noch ein ziemlicher anfänger in visual studio und daher konnte ich das nicht includen :/ das einfache #include hat nicht gereicht.. ( habe die header datei zu den headerdateien eingefügt) kann es seind as ich die auch noch iwo anders includen muss?
2. habe das jetzt zu
__declspec(naked) void Draw2D(SOCKET Socket, char *Buffer, int Length, int Flags)
{
__asm PUSHAD;


for (int i = 0; i < Length; i++)
{
cout << Buffer[i];
printf(" ");
}
printf("\n");


__asm POPAD;
oDraw2D(Socket,Buffer,Length, Flags );
}
umgeschrieben, ist das falsch? weil das game crashed

3. stimmt kann ich mir gut vorstellen, aber welche möglichkeiten habe die encrypteten zu kriegen? das problem ist das gamehackshield lässt mich nicht mit ollydbg drauf zugreifen
04/10/2015 21:08 _asm#4
Quote:
Originally Posted by erfan100 View Post
danke für die hilfe, zu
1. erst wollte ich detours.h verwenden aber ich bin noch ein ziemlicher anfänger in visual studio und daher konnte ich das nicht includen :/ das einfache #include hat nicht gereicht.. ( habe die header datei zu den headerdateien eingefügt) kann es seind as ich die auch noch iwo anders includen muss?
2. habe das jetzt zu
__declspec(naked) void Draw2D(SOCKET Socket, char *Buffer, int Length, int Flags)
{
__asm PUSHAD;


for (int i = 0; i < Length; i++)
{
cout << Buffer[i];
printf(" ");
}
printf("\n");


__asm POPAD;
oDraw2D(Socket,Buffer,Length, Flags );
}
umgeschrieben, ist das falsch? weil das game crashed

3. stimmt kann ich mir gut vorstellen, aber welche möglichkeiten habe die encrypteten zu kriegen? das problem ist das gamehackshield lässt mich nicht mit ollydbg drauf zugreifen
Du musst noch die detours lib linken und in deinem Projekt einbinden, also:
Code:
#pragma comment(lib, "detours.lib")
Welches Spiel ist es denn?... vielleicht kenne ich es und kann dir dabei mehr helfen, sonst kannst du die "Interne" Recv Funktion im Spiel suchen und die Assembler Funktion hooken.
Da wird dann dein Buffer in irgendeinem Register stehen, welches du dann nur noch returnen musst :).
Aber du sagtest doch, dass das ein Hackshield besitzt, also wird auch dein JMP Detour erkannt?

Sonst schau mal im letzten Post hier: [Only registered and activated users can see links. Click Here To Register...] rein.
04/10/2015 21:23 Slade100#5
Quote:
Originally Posted by _asm View Post
Du musst noch die detours lib linken und in deinem Projekt einbinden, also:
Code:
#pragma comment(lib, "detours.lib")
Welches Spiel ist es denn?... vielleicht kenne ich es und kann dir dabei mehr helfen, sonst kannst du die "Interne" Recv Funktion im Spiel suchen und die Assembler Funktion hooken.
Da wird dann dein Buffer in irgendeinem Register stehen, welches du dann nur noch returnen musst :).
Aber du sagtest doch, dass das ein Hackshield besitzt, also wird auch dein JMP Detour erkannt?

Sonst schau mal im letzten Post hier: [Only registered and activated users can see links. Click Here To Register...] rein.
also ein hackshield hats aufjedenfall und obs erkannt wird weiß ich nicht aber das würde vielleicht der grund sein wieso nach 30-60 sec keine recv mehr in der konsole rein kommen
das mit dem pragma comment hab ich gemacht, hat nicht funktioniert, trotzdem findet der die detours.h nicht obwhohl die da ist-.- oder muss ich die detours.lib im linker oder so auch noch hinzufügen?

kannst du mir noch sagen ob das hier so richtig ist? weil das game crasht wenn ich das so injecte
__declspec(naked) void Draw2D(SOCKET Socket, char *Buffer, int Length, int Flags){
.....
}

werde mit den link mal ansehen
edit: habe mir den link angeguckt, meinst du also ich soll am ende einfach extern "C" __declspec(naked) void Draw2D(); schreiben?
04/10/2015 23:22 _asm#6
Du nimmst dir einfach die Klasse, die er dort bereitgestellt hat und compilst die DLL o.O?
Wenn's immer noch nicht klappt dann versuch deine Hook-Func so zu gestalten:

Code:
INT WINAPI OurRecv(SOCKET sock, CHAR* buf, INT len, INT flags)
{
	std::cout << "Received: ";
	for (int i = 0; i< strlen(buf);i++)
		std::cout <<  std::hex << static_cast<WORD>(buf[i]) << ' ';
	std::cout << std::endl;
	return RealRecv(sock, buf, len, flags);
}
04/11/2015 00:11 Slade100#7
erstmal danke die sehr für deine hilfe, habe das ganze jetzt umeschrieben und meine hook func in die form gebracht wie du gesagt hast und benutze die detours 1.5 diesmal sieht das ganze schonmal viel besser aus^^
unzwar so

Received: 24 5f 2f 32
Received: a
Received: a
Received: a
Received: 22 3e 9 32
Received: a
Received: a
Received: a
Received: 22 ffa7 ffff 2e
Received: f
Received: f
Received: f
Received: ff94 ff9e 49 9
Received: f
Received: ff94 72 ffe5 2f
Received: f
Received: ff94 2c ffeb 31
Received: f
Received: ff94 ff85 f 32
Received: f
Received: ff94 ffae 1b 32
Received: f
Received: ff94 64 2d 32
Received: f
Received: ff94 2b 2f 32
Received: f
Received: ff94 5f 2f 32
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: a
Received: 23 3e 9 32
Received: a
Received: 22 6 10 30
Received: a
Received: a
Received: a
Received: a
Received: a
Received: 23 6 10 30
Received: f
Received: f
Received: f
Received: ff94 ff89 74
Received: f
Received: ffff fff4
Received: f
Received: ff94 31 ff9a 19
Received: f
Received: ffff fff4
Received: f
Received: ff94 5 ff82 1c
Received: f
Received: ffff fff4
Received: f
Received: ff94 ffa8 ffa6 20
Received: f
Received: ffff fff4
Received: f
Received: ff94 fff3 13 22
Received: f
Received: ffff fff4
ob das jetzt 100 pro richtig ist weiß nicht da ich mich nicht so gut auskenne^^, aber vllt könntest du ja sagen obs richtig aussieht :D

aber trotzdem hören die recv nach ca 30 sec auf :S weißt du vllt woran das liegt? vielleicht am hackshield?
04/11/2015 00:19 _asm#8
Hmm... Kannst du mal WPE Pro ausprobieren und schauen ob das auch nach ca 30 sek aufhört? Wenn ja -> irgendein "Anti-Hack" Mechanismus :D
04/11/2015 00:34 Slade100#9
wpe pro hab ich mal ausprobiert das kann nicht nichtmal erst attachen, sobald ich wpe pro start stürzt das game ab :/
04/11/2015 00:45 _asm#10
Also bevor du überhaupt attachst, stürzt es schon ab?
Wenn das so ist, dann wird es anscheind vom Spiel erkannt, pack es mit UPX wenn dies der Fall ist.
04/11/2015 01:06 Slade100#11
Quote:
Originally Posted by _asm View Post
Also bevor du überhaupt attachst, stürzt es schon ab?
Wenn das so ist, dann wird es anscheind vom Spiel erkannt, pack es mit UPX wenn dies der Fall ist.
jo bevor ich attache, ich werde upx mal runterladen, aber ich glaube attachen klappt dann immernoch nciht, genau wie mit ollydbg wenn ich attachen will kommt immer error_access_denied, oder wenn ich injector start stürzt es entweder ab oder der prozess wird nicht angezeigt... auch mit uce kann ich eigentlich den prozess nicht auswählen aber wenn ich einstelle das es automatisch beim start vom prozess injected werden soll klappts( und das ist die einzige mögichkeit wie ich auch dlls injecten kann^^)
04/11/2015 01:14 _asm#12
Okay habe die Lösung für das "30 sek Problem", anscheind wird bei Kalonline dein Detour "proofed" also die 5 bytes die gesetzt werden (E9 - JMP)...
Anders ausgedrückt: Hackshield erkennt Hooks von externen Anwendungen auf der Recv-Funktion.
Also dir bleiben viele Möglichkeiten, dass zu bypassen:
1. Hook 5 bytes nach der Recv-Funktion im Client (schau auch mal im debugger nach, was nach 30 sek auf der Adresse wo der Detour ist, passiert!)
2. Setz einen Hardware Breakpoint (bin mir da aber nicht sicher ob die vom Hackshield treiber entfernt werden)
3. Vectored Exception Handler / Structured Exception Handler setzen

Edit: Wegen dein Debugging Problem, hier eine Lösung wie du das "Hacking-Shield" (wortwitz haha bin ich lustig...) umgehst:

Lad dir [Only registered and activated users can see links. Click Here To Register...] und [Only registered and activated users can see links. Click Here To Register...] herunter.
Schmeiß die DLL's in deinem Olly ordner -> F3 in Olly -> Kalonline Prozess öffnen -> Tada alles API Hooks werden unhooked und du solltest debuggen können
2. Möglichkeit: Mit den VEH-Debugger von CE debuggen.
04/11/2015 01:20 bloodx#13
Du willst kal hooken? Du brauchst kein push und pop -

Nen recv Hook + 5 Bytes wegen Hackshild check
04/11/2015 01:26 _asm#14
Quote:
Originally Posted by bloodx View Post
Du willst kal hooken? Du brauchst kein push und pop -

Nen recv Hook + 5 Bytes wegen Hackshild check
Sagte ich ja bereits mit den 5 bytes :s
04/11/2015 01:31 Slade100#15
Quote:
Originally Posted by _asm View Post
Okay habe die Lösung für das "30 sek Problem", anscheind wird bei Kalonline dein Detour "proofed" also die 5 bytes die gesetzt werden (E9 - JMP)...
Anders ausgedrückt: Hackshield erkennt Hooks von externen Anwendungen auf der Recv-Funktion.
Also dir bleiben viele Möglichkeiten, dass zu bypassen:
1. Hook 5 bytes nach der Recv-Funktion im Client (schau auch mal im debugger nach, was nach 30 sek auf der Adresse wo der Detour ist, passiert!)
2. Setz einen Hardware Breakpoint (bin mir da aber nicht sicher ob die vom Hackshield treiber entfernt werden)
3. Vectored Exception Handler / Structured Exception Handler setzen

Edit: Wegen dein Debugging Problem, hier eine Lösung wie du das "Hacking-Shield" (wortwitz haha bin ich lustig...) umgehst:

Lad dir [Only registered and activated users can see links. Click Here To Register...] und [Only registered and activated users can see links. Click Here To Register...] herunter.
Schmeiß die DLL's in deinem Olly ordner -> F3 in Olly -> Kalonline Prozess öffnen -> Tada alles API Hooks werden unhooked und du solltest debuggen können
2. Möglichkeit: Mit den VEH-Debugger von CE debuggen.
jo habe im debuger von der ce gesehn das mein jmp auf der adresse nicht mehr da ist nach ca 30 sec^^

Quote:
Originally Posted by bloodx View Post
Du willst kal hooken? Du brauchst kein push und pop -

Nen recv Hook + 5 Bytes wegen Hackshild check
danke aber habe das mit push und pop nicht mehr

das ganze sieht jetzt so aus


int MyPacketRecv(SOCKET Socket, char *Buffer, int Length, int Flags);

int(__stdcall *PacketRecv)(SOCKET Socket, char *Buffer, int Length, int Flags);

int MyPacketRecv(SOCKET Socket, char *Buffer, int Length, int Flags) {
std::cout << "Received: ";
for (int i = 0; i< strlen(Buffer); i++)
std::cout << std::hex << static_cast<WORD>(Buffer[i]) << ' ';
std::cout << std::endl;
return PacketRecv(Socket, Buffer, Length, Flags);
}


BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
{
if (reason == DLL_PROCESS_ATTACH)
{
Console();
Color(15);
RecvAddr = (DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll "), "recv");
std::cout << std::hex << RecvAddr << std::endl;
PacketRecv = (int(__stdcall *)(SOCKET, char *, int, int))DetourFunction((PBYTE)RecvAddr, (PBYTE)MyPacketRecv);
}
return 1;
}

5 bytes weiter währen doch

PacketRecv = (int(__stdcall *)(SOCKET, char *, int, int))DetourFunction((PBYTE)(RecvAddr+5), (PBYTE)MyPacketRecv);

oder nicht?
aber wenn ich das mache gibts nen crash :S