[Tutorial] Chams

01/01/2013 16:35 Dr. Coxxy#1
Und noch ein Tutorial von mir, erstmal das letzte.
Chams in DirectX 9 Spielen, über 17 Seiten anschaulich in CS:S demonstriert.
Zusammen entwickeln wir einen Logger und den Chamshack selber.
Vollständige sources liegen bei.
Man sollte vorher mein HookingTutorial (auch hier im forum: [Only registered and activated users can see links. Click Here To Register...] ) gelesen und verstanden haben.

[Only registered and activated users can see links. Click Here To Register...]
05/02/2013 10:03 Cambios#2
Ganz ehrlich, das ist nicht DEIN Tutorial, das is von Silverdeath aus Oldschoolhack :facepalm:

#reported
05/02/2013 13:03 Jeoni#3
Silverdeath aus OSH IST Dr. Coxxy aus Elitepvpers. Das kannst du gerne verifizieren, aber ich denke, dass er es schon irgendwann mal erwähnt hat.
MfG
Jeoni
05/02/2013 14:33 Cambios#4
Quote:
Originally Posted by Jeoni View Post
Silverdeath aus OSH IST Dr. Coxxy aus Elitepvpers. Das kannst du gerne verifizieren, aber ich denke, dass er es schon irgendwann mal erwähnt hat.
MfG
Jeoni
Und das weißt du woher, das es Silverdeath ist? ;)
Ich mein, behaupten kann ja jeder das er Silverdeath wär^^
Sollte er es wirklich sein okay, aber ich bezweifle es.
05/02/2013 18:56 Dr. Coxxy#5
Quote:
Originally Posted by Cambios View Post
Und das weißt du woher, das es Silverdeath ist? ;)
Ich mein, behaupten kann ja jeder das er Silverdeath wär^^
Sollte er es wirklich sein okay, aber ich bezweifle es.
vergleich mal die sig und das avatar bild mit dem aus osh bob.
05/02/2013 19:51 snow#6
Quote:
Originally Posted by Dr. Coxxy View Post
vergleich mal die sig und das avatar bild mit dem aus osh bob.
Das hast du doch mit Absicht gemacht, damit das nicht so auffällt!!11!

Nettes Tutorial, vielen Dank. :)

Eine Frage hätte ich noch zu den DX-Hooks: Das sind ja alles Member-Funktionen der IDirect3DDevice9-Schnittstelle und dementsprechend werden die via thiscall aufgerufen (korrekt? this-Zeiger in ecx, ja?).
Wie übersetzt der Compiler den stdcall mit dem Parameter? Eignet sich da nicht eher ein fastcall, der ja auch Parameter in den Registern speichert? Ich hab mich noch nie großartig mit Calling Conventions beschäftigt, kann also sein, dass ich hier gerade mächtig falsch liege, aber die Technik wie man Member-Funktionen hookt, interessiert mich. :)
05/02/2013 20:02 Jeoni#7
Das mit dem thiscall könnte man zwar denken, ist aber leider nicht so ;)
Die VT-Funktionen der IDirect3DDevice9-Schnittstelle sind stdcalls, die als ersten Paramter den Device- bzw this-pointer (das, was beim thiscall ecx wäre) haben.
Also EndScene hat dementsprechend dann diesen Prototyp:
Code:
HRESULT __stdcall EndScene(LPDIRECT3DDEVICE9 pDevice);
Warum genau das so gehandhabt wird und nicht über den nähergelegenen thiscall weiß ich aber auch nicht :D
Hoffe, dass ich helfen konnte
Jeoni
05/02/2013 20:21 Dr. Coxxy#8
Quote:
Originally Posted by snow911 View Post
Das hast du doch mit Absicht gemacht, damit das nicht so auffällt!!11!

Nettes Tutorial, vielen Dank. :)

Eine Frage hätte ich noch zu den DX-Hooks: Das sind ja alles Member-Funktionen der IDirect3DDevice9-Schnittstelle und dementsprechend werden die via thiscall aufgerufen (korrekt? this-Zeiger in ecx, ja?).
Wie übersetzt der Compiler den stdcall mit dem Parameter? Eignet sich da nicht eher ein fastcall, der ja auch Parameter in den Registern speichert? Ich hab mich noch nie großartig mit Calling Conventions beschäftigt, kann also sein, dass ich hier gerade mächtig falsch liege, aber die Technik wie man Member-Funktionen hookt, interessiert mich. :)
winapi ist afaik komplett stdcall um kompatibilität mit C zu wahren (und war halt damals normal...).
05/02/2013 20:56 snow#9
Okay, das klingt plausibel. Danke. :)

Wie mache ich das denn, wenn ich einen Prototypen für eine Member-Funktion, die wirklich ein thiscall ist, erstellen will? Ich habe gerade mal die Calling Conventions angeschaut. Der this-Zeiger landet ja im ecx-Register, aber einen thiscall Prototypen kann man nicht einfach so erstellen, korrekt?
Ein fastcall hat die ersten 2 Argumente im ecx & edx Register, richtig? Das würde doch heißen, dass ich einen Memberfunktion-Prototypen so aufbauen kann:
int (__fastcall *Hook)(void *thisptr, void *spam, int arg0, int arg1 /* Parameter der Funktion */);
Korrekt oder liege ich komplett daneben? :o
05/02/2013 22:47 Omdi#10
Quote:
Originally Posted by snow911 View Post
Okay, das klingt plausibel. Danke. :)

Wie mache ich das denn, wenn ich einen Prototypen für eine Member-Funktion, die wirklich ein thiscall ist, erstellen will? Ich habe gerade mal die Calling Conventions angeschaut. Der this-Zeiger landet ja im ecx-Register, aber einen thiscall Prototypen kann man nicht einfach so erstellen, korrekt?
Ein fastcall hat die ersten 2 Argumente im ecx & edx Register, richtig? Das würde doch heißen, dass ich einen Memberfunktion-Prototypen so aufbauen kann:
int (__fastcall *Hook)(void *thisptr, void *spam, int arg0, int arg1 /* Parameter der Funktion */);
Korrekt oder liege ich komplett daneben? :o
Das ist korrekt ;)

Nur mal so ein kleines Beispiel :

Code:
typedef void (__thiscall *tSetHP)(void*, float);
tSetHP oSetHP = nullptr;

//hook sethp blablabla

void __fastcall hkSetHP(void *pThis, void *pFastcall, float fHP)
{
    return oSetHP (pThis, 9999999.9999);
}
05/02/2013 23:01 Dr. Coxxy#11
wozu ich natürlich auch ein tutorial gemacht habe...:
[Only registered and activated users can see links. Click Here To Register...]
05/13/2013 20:45 MrSm!th#12
Quote:
Originally Posted by Jeoni View Post
Das mit dem thiscall könnte man zwar denken, ist aber leider nicht so ;)
Die VT-Funktionen der IDirect3DDevice9-Schnittstelle sind stdcalls, die als ersten Paramter den Device- bzw this-pointer (das, was beim thiscall ecx wäre) haben.
Also EndScene hat dementsprechend dann diesen Prototyp:
Code:
HRESULT __stdcall EndScene(LPDIRECT3DDEVICE9 pDevice);
Warum genau das so gehandhabt wird und nicht über den nähergelegenen thiscall weiß ich aber auch nicht :D
Hoffe, dass ich helfen konnte
Jeoni
Der Deviceptr WIRD im ECX-Register übergeben.
05/13/2013 22:32 Jeoni#13
Tut mir Leid, aber da muss ich wiedersprechen :D
Bei den Funktionen eines IDirect3DDevice9-Objekts ist das zumindest nicht so (EndScene gehört ja dazu). Diese Funktionen sind nicht thiscall, hier wird der deviceptr (thisptr?), der bei thiscall-Funktionen im ECX-Register liegt, als 1. Argument übergeben über den Stack übergeben (stdcall). In ECX steht nicht der Deviceptr (das impliziert deine Aussage ja, oder?).

Hier ein Bild dazu (mein Schulprojekt in Olly):
[Only registered and activated users can see links. Click Here To Register...]
Die aktuelle Position ("call edx") ist der Call zu EndScene. Der Push davor pusht den deviceptr (wie man sehen kann hier 0x02665060). In ECX befindet sich währenddessen ein anderer Wert (0x02667DFC), welcher einen Pointer zur D3D9-VTable darstellt. Bei Hooks o.Ä. anzunehmen, dass der deviceptr in ecx ist, würde also vermutlich zum Crash führen.
Das ganze gilt nur für D3D9 unter 32Bit (von 'dort' stammt auch der Screenshot). Wie es mit D3D10/11 und / oder auf 64 Bit aussieht, weiß ich nicht.
Natürlich ist das bei den 'normalen' Klassen, die man in C++ (andere Sprachen ggf auch, da kenne ich mich nicht aus) erstellt, natürlich nicht der Fall. Memberfunktionen sind dann ganz normal thiscall und der thisptr liegt auch in ECX, statt über den Stack übergeben zu werden ;)

Mit freundlichen Grüßen
Jeoni