hook/detour um +5 bytes verschieben ?

10/15/2012 19:59 Melodyzer#1
Hallo,

Ich versuche grade die Funktion eines Botes fuer ein bestimmtes Spiel zu verstehen.
Damit ich jetzt etwas umgehen kann, muss ich diesen code (Recv)
Code:
int (__stdcall *PacketRecv)(SOCKET Socket, char *Buffer, int Length, int Flags);

void MyPacketRecv(SOCKET Socket, char *Buffer, int Length, int Flags) 
{
           switch(Buffer[2])
           {
           }
           return PacketRecv(Socket, Buffer, Length, Flags); 
}


void InitDetours() 
{
		
	PacketRecv = (int (__stdcall *)(SOCKET, char *, int, int))DetourFunction((PBYTE)recv, (PBYTE)MyPacketRecv);
}
um +5 bytes verschieben, was ist damit jetzt genau gemeint ?
Habe leider nicht soviel Ahnung von der Materie bin aber extrem interessiert daran es zu verstehen. :)
mfg
10/15/2012 20:18 Jeoni#2
Erstmal musste wissen, was ein hook ist, und wie er aufgebaut ist / funktioniert. Dazu gibt's hier nen super Tutorial (SuFu nutzen).
Um 5 Bytes verschieben heißt, dass du den Call zu deiner Hookfunction eben um 5 Bytes verschiebst :D
Im Code sehe das eben so aus:
Code:
PacketRecv = (int (__stdcall *)(SOCKET, char *, int, int))DetourFunction((PBYTE)recv + 5, (PBYTE)MyPacketRecv);
Gibt aber dabei vermutlich Probleme.
Danach liegt der Call eben bei Byte 6 bis 10 (1 Byte: Call Offset; 4Byte Sprungadresse (wenn's nen 32Bit Prozess ist, bei 64Bit eben 8 Byte)) oder so. Du musst natürlich schauen, dass der Call keinen schon vorhandenen Befehl zerstört (auch im Tutorial erklärt, soviel ich weiß), dann wird das Programm höchstwahrscheinlich crashen.
Die DetourFunction, die bei den "normalen" (nicht verschobenen) Hooks genutzt wird, kann man hier mit ziemlicher sicherheit vergessen und man muss die Argumente / Parameter vermutlich aus dem Stack auslesen, da die ersten 5 Bytes an Befehlen den Stackaufbau, auf den die Detourfunktion aufbaut (toller Satzbau :D ), vermutlich zerstört.
Um hier weiterzukommen, kannste ja nach MidFunction Hooks suchen und googlen, die beschäftigen sich genau mit dem Problem und da gibt's einige sehr gute Ansätze.
Obwohl ich nicht der Beste in diesem Gebiet bin, kannste mir bei Fragen gerne eine PN senden ;)
Mit freundlichen Grüßen
Jeoni
10/16/2012 21:05 MrSm!th#3
Quote:
Originally Posted by Jeoni View Post
Erstmal musste wissen, was ein hook ist, und wie er aufgebaut ist / funktioniert. Dazu gibt's hier nen super Tutorial (SuFu nutzen).
Um 5 Bytes verschieben heißt, dass du den Call zu deiner Hookfunction eben um 5 Bytes verschiebst :D
Im Code sehe das eben so aus:
Code:
PacketRecv = (int (__stdcall *)(SOCKET, char *, int, int))DetourFunction((PBYTE)recv + 5, (PBYTE)MyPacketRecv);
Gibt aber dabei vermutlich Probleme.
Danach liegt der Call eben bei Byte 6 bis 10 (1 Byte: Call Offset; 4Byte Sprungadresse (wenn's nen 32Bit Prozess ist, bei 64Bit eben 8 Byte)) oder so. Du musst natürlich schauen, dass der Call keinen schon vorhandenen Befehl zerstört (auch im Tutorial erklärt, soviel ich weiß), dann wird das Programm höchstwahrscheinlich crashen.
Die DetourFunction, die bei den "normalen" (nicht verschobenen) Hooks genutzt wird, kann man hier mit ziemlicher sicherheit vergessen und man muss die Argumente / Parameter vermutlich aus dem Stack auslesen, da die ersten 5 Bytes an Befehlen den Stackaufbau, auf den die Detourfunktion aufbaut (toller Satzbau :D ), vermutlich zerstört.
Um hier weiterzukommen, kannste ja nach MidFunction Hooks suchen und googlen, die beschäftigen sich genau mit dem Problem und da gibt's einige sehr gute Ansätze.
Obwohl ich nicht der Beste in diesem Gebiet bin, kannste mir bei Fragen gerne eine PN senden ;)
Mit freundlichen Grüßen
Jeoni
Aufgrund seiner Parameter-Liste schließe ich auf die MS Detours Library und nicht die schlechte DetourFunction, die im Internet kursiert.
Insofern zerschießt er sich da keine Befehle. Der Aufbau des Stackframes sieht von CallingConvention zu CallingConvention unterschiedlich aus und dementsprechend anders sollte man das Offset setzen und auf die Parameter zugreifen.
10/16/2012 23:26 MoepMeep#4
Wie ich nur an diesem Stück code erkenne aus welcher Sektion du kommst. Der Ansatz, den anscheinend alle dort verfolgen, ist Schwachsinn und kommt nur daher, da niemand dort auch nur annähernd vernünftig reversen kann.
Die Crypt-Funktionen liegen schon seit Jahren offen, also mach es vernünftig oder lass es sein.
10/18/2012 15:11 Melodyzer#5
Quote:
Originally Posted by MoepMeep View Post
Wie ich nur an diesem Stück code erkenne aus welcher Sektion du kommst. Der Ansatz, den anscheinend alle dort verfolgen, ist Schwachsinn und kommt nur daher, da niemand dort auch nur annähernd vernünftig reversen kann.
Die Crypt-Funktionen liegen schon seit Jahren offen, also mach es vernünftig oder lass es sein.
Kein Wunder wenn es dein Tutorial ist oder ?