In diesem Tutorial werde ich versuchen zu erklären, wie ihr euch
einen Super-1337 D3D Hack für euer Lieblingsgame coded. Dabei
versuche ich, das Tutorial einerseits so ausführlich und
verständlich wie möglich zu halten, andererseits auch dafür zu
sorgen, dass man den Code nicht einfach per Copy&Paste in seinen
Compiler reinhacken kann. Am Ende des Tutorials solltet ihr zu so
etwas fähig sein.
Also als erstes solltet ihr natürlich C++ programmieren können, am
besten ist es wenn ihr schon den ein oder anderen Trainer gecoded
habt. Gewisse Kentnisse im Bezug auf DLL-Programmierung wären auch
nicht schlecht. Weiterhin:
[+] Visual C++ Compiler. Express Edition (umsonsts):
Es kann sein dass ihr zu der Express Edition noch das Platform SDK
von Microsoft benötigt um überhaupt irgendwas compilen zu können.
Ich persönlich benutz das alte VC++ 6.0
[+] DirectX SDK.
Installieren und in VC++ die Verzeichnisse Include, Bin und Lib
einfügen. Extras->Optionen->Projekte und Projektmappen->VC++-
Verzeichnisse: unter Librarys added ihr das 'lib' Verzeichnis vom
SDK, unter Binarys added ihr das 'bin' Verzeichnis und unter
'Includes' added ihr das 'Include' Verzeichnis.
[+] IDA Pro.
[+] Viel Zeit und jede menge kühle Coke xD
VC++ sollte jetzt ohne Probleme eure Projekte compilen können und
das SDK richtig eingebunden haben.
So, jetzt können wir endlich anfangen. Als erstes ein bisschen
Theorie zu DirectX (gibt auch jede Menge Tutorials im Internet
dazu).
Die für uns wichtigste Funktion die D3D9 bereitstellt, ist
EndScene.
Diese Funktion wird pro Bild das dargestellt wird genau
1x aufgerufen. Und zwar immer am Ende (wie der Name ja sagt).
In dieser Funktion werden wir auch unsere ganze Zeichenarbeit (das
Menü) verrichten. Unser Ziel ist es also, diese Funktion zu
hooken. Was Hooks sind, lest ihr euch am besten bei Wikipedia
durch (sucht nach Hook). Über diese Funktion holen wir uns den
D3D DevicePointer, mit dem wir dann Zugriff auf die
Zeichenfunktionen von D3D bekommen.
Also, dann schmeißen wir mal IDA Pro an um die Funktion ausfindig
zu machen. Dazu öffnet ihr mit IDA die Datei d3d9.dll aus dem
Windows/System32 Ordner. Aktiviert beim Anfangsdialog alle Haken
um die DLL komplett zu laden. Jetzt müsst ihr ein bisschen warten
bis IDA die ganze Library analysiert hat.
Oben in der Mitte seht ihr den Tab Functions.
Den aktiviert ihr.
Jetzt drückt ihr im Hauptmenü von IDA auf Search->Search und tippt
EndScene ein. Ihr solltet hier landen:
EndScene ist also offensichtlich eine Methode der Klasse CD3DBase.
Wir sehen hier auch die Adresse an der unsere Funktion steht:
0x4FDD71B0 Das ist erstmal das wichtigste für uns. Jetzt können
wir die Funktion mithilfe von Detours hooken. Was Detours genau
sind und wozu man sie benutzen kann versucht ihr am besten über
Google herauszufinden. Grob funktionieren Detours so: Wenn ich
einen Detour (=Umweg) auf eine Funktion anwende, dann wird die
Funktion nicht mehr normal ausgeführt, sondern zu mir in das
Programm umgeleitet. Dann hab ich vollen Zugriff auf die Funktion.
Öffnet jetzt euer VC++ und legt ein neues Dynamic Link Library
Projekt an. Stellt sicher, dass ihr ein komplett leeres Projekt
bekommt. Dort fügt ihr dann folgenden Code ein:
Code:
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
// Hier kommt unser Code rein
break;
}
return true;
}
Das ist Standard für jede DLL die in ein Programm injected wird.
Sollte jeder von euch schon einmal gesehen haben. Unser Code wird
ausgeführt sobald die DLL an unseren Prozess angehängt wird.
Compilen können wir das so noch nicht, dazu müssen wir obendrüber
ersteinmal die wichtigsten Header mit einbinden.
Jetzt habt ihr auch gleichzeitig die DirectX funktionen
includiert. Wenn ihr das SDK richtig in VC++ eingestellt habt
sollte das jetzt auch ohne Fehler zu compilen sein. Eventuell
müsst ihr folgendes noch obendrüber einfügen:
Code:
#pragma once
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
Das #pragma once sagt dem Compiler dass alles nur einmal
eingebunden wird. Ich bekomm sonst oft Fehler... Spätestens jetzt
sollte das fehlerfrei compilebar sein. Wenn nicht, guckt euch im
Internet um und stellt sicher, dass ihr das SDK richtig in VC++
eingestellt habt.
Jetzt können wir uns den Hook genauer anschauen. Am besten ist es,
wenn man das ganze in einem Thread macht, damit man sicher gehen
kann dass alles läuft. Also erstellen wir einen neuen Thread:
So da ist jetzt schon einiges vorweggenommen, aber es sollte klar
sein was hier passiert. Eigentlich brauchen wir das Handle nicht
mehr, aber so stellen wir sicher, dass die DLL auch wirklich
geladen wurde und dass D3D9 überhaupt läuft. An dieser Stelle
müssen wir jetzt die DetourFunction einfügen. Wer will kann die
von Microsoft benutzen, ich nehm die von GameDeception.
Bevor wir jetzt ans detouren gehen, gibt’s noch einiges
nachzuholen. Unser Thread muss natürlich auch gestartet werden.
Deswegen adden wir jetzt in DLLMain:
Jetzt aber zu unserer EndScene Funktion. Als erstes brauchen wir
eine Typendefinition, damit der Compiler bei dem Detour später
nicht meckert. Die EndScene Funktion schaut folgendermaßen aus:
Wir sehen hier auch, dass das Argument vom Typ LPDIRECT3DDEVICE9
ist. Hier können wir also auf den Pointer zum D3D Device
zugreifen. Ich nenn ihn jetzt einmal pDevice. Nähere Information
zu der Funktion gibt’s in der d3d9.h (dort ist sie deklariert)
oder im Internet.
Jetzt zurück zu unserem Typedef. Fügt folgendes in euer Projekt
ein:
Wozu wir das brauchen wird gleich klar. Typedefs sind C-Standart,
ihr solltet wissen was diese zwei Zeilen bewirken (Wenn nicht: wie
immer -> Google).
Jetzt können wir die Funktion Detouren. Allgemein schaut das immer
so aus:
Code:
PointerOriginalFunktion = (TYPECAST) DetourFunc ( OffsetOriginalFunktion, UnsereFunktion, Länge );
Das ganze wird klar wenn ich das auf EndScene anwende. Bei der
Microsoft Detour variante brauchen wir keine Länge anzugeben. Hier
verwenden wir einfach immer 5, das ist das Minimum. Auf unsere
Funktion angewandt:
Die Zeile fügt ihr in unseren Thread ein. Vergleicht sie dann mit
dem Typedef von gerade eben, dann versteht ihr das ganze gleich
besser. Allerdings taucht hier jetzt hkEndScene auf, und die ist
ja noch nirgendwo deklariert. Also holen wir das nach. Fügt am
Anfang die gehookte Funktion ein:
Das ist jetzt die Funktion in der wir Zeichnen können. Wie ihr
seht wird zur Originalfunktion returned. Aber das mit den Detours
ist ja längst klar ;D
An dieser Stelle sind wir eigentlich fertig, unser Ziel den D3D
DevicePointer zu bekommen haben wir hiermit erreicht. Jetzt wollen
wir aber gleich etwas Zeichnen um unseren Hook zu testen.
An dieser Stelle paste ich einfach mal meine Funktion zum Zeichnen
von Rechtecken:
Code:
void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
{
D3DRECT rect = {X, Y, X+L, Y+H};
Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0); // bei Google gibt’s näheres
}
Jetzt könnt ihr in der gehookten EndScene Funktion z.B. folgende Zeile einfügen:
Code:
DrawRect ( pDevice, 10, 10, 200, 200, txtPink);
txtPink ist bei euch noch nicht deklariert. Also holt das nach:
Wenn ihr die fertige DLL jetzt z.B. in Bioshock injected, seht ihr
hoffentlich links oben ein großes Pinkes Rechteck. Das ist der
Beweis das euer Hook funktioniert ;D
Als Injector könnt ihr z.B. den OSInject von KN4CK3R nehmen.
Jetzt zur Schrift. Als erstes Erstellen wir einen FontPointer:
Code:
ID3DXFont *pFont;
Dann muss unsere Schrift initialisiert werden. Dazu rufen wir
folgende Funktion auf:
Lest euch mal das hier durch:
view_cpp_article.pl?chapter=3;article=17
Da gibt’s genauere Informationen. Wir callen diese Funktion in
unserer gehookten EndScene, da wir ja nur da auf den DevicePointer
zugreifen können. Aber Vorsicht: Die Funktion muss nur 1x
aufgerufen werden. Wäre unsinnig die Schrift jedes mal neu zu
initialisieren. Also sorgt dafür, dass die Funktion nur 1x
gecalled wird.
Jetzt hier zur eigentlich DrawFont Funktion:
Code:
void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...)
{
char buffer[256];
va_list args; // deswegen: #include <cstdio>
va_start (args, format);
vsprintf (buffer,format, args);
RECT FontRect = { X, Y, X + 120, Y + 16 };
g_pFont->DrawText( NULL, buffer, -1, &FontRect, DT_NOCLIP , Color ); // Zeichnen
va_end (args);
}
Mit va_lists solltet ihr euch auskennen und somit die Funktion
verstehen können. In EndScene:
Code:
DrawFont ( 300, 50, txtPink, “I <3 purple“ );
Compilen, Injecten und staunen (hoffentlich xD). In CSS verursacht
die Font Probleme, da braucht ihrs gar nicht erst zu versuchen.
Wie man ein Menü programmiert erklär ich nicht, wer soweit
gekommen ist schafft das von alleine. Hier jetzt noch kurz warum
ich va_list mit eingefügt hab:
Dazu erzähl ich jetzt nicht viel, nur: Wenn wir schon im Prozess
injected sind brauchen wir kein WriteProcessMemory mehr. Jetzt
nutzen wir folgende Funktion:
Damit können wir die Texturen für unsere Chams erzeugen. Also
gleich mal ein Beispiel. Added das:
Code:
LPDIRECT3DTEXTURE9 texPink;
Jetzt können wir eine Textur erzeugen. Dazu rufen wir die Funktion
folgendermaßen auf:
Code:
GenerateTexture(pDevice, &texPink,txtPink);
Wie die Font darf auch diese Funktion nur 1x aufgerufen werden.
Stellt das sicher.
Jetzt haben wir eine einfarbige Pinke Textur. Um die jetzt auf
unseren Player zu bekommen ist noch einiges an Arbeit nötig. Bis
jetzt haben wir nämlich nur EndScene gehookt, das reicht uns jetzt
nicht mehr. Werft jetzt wieder IDA an und hookt folgende
Funktionen:
Jetzt zur Erklärung:
Strides definieren in unserem Game immer eine bestimmte Gruppen
von Objekten die gezeichnet werden. Zum Beispiel die Wände oder
eben die Player. Die Werte variieren in jedem Game. In Warrock
haben zum Beispiel die Player die Stridenummer 44. In Operation 7
haben die Player 20. Wie findet ihr nun die passende Nummer? Ganz
einfach, ihr führt eine Variable ein die sich mit Tastendruck
ändern lässt und färbt dann einfach immer diesen bestimmten
Stride. Dann loggt ihr euch die Nummer an der eure Player bunt
wurden und schon habt ihrs.
Der restliche Code:
Die erste Zeile ist der eigentliche Wallhack. Damit werden alle
Stride == 20 Objekte im Vordergrund gezeichnet.
Die zweite Zeile bewirkt, dass unsre Player komplett mit unserer
Textur ausgfüllt werden. Die dritte Zeile färbt die Player dann in
Grün.
In der vierten Zeile wird das alles angewandt. Jetzt wären wir
eigentlich schon fertig, aber wir wollen ja zweifarbige Chams.
Grün, wenn sich die Player hinter der Wand befinden, und rot wenn
sie im Vordergrund sind.
Deswegen folgen jetzt noch einmal
dieselben drei Zeilen wie vorher, mit dem Unterschied, dass in der
5. Zeile der RenderState auf true gesetzt wird. Das stellt sicher,
dass nur die Player im Vordergrund gezeichnet werden.
pDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); // in DrawIndexedPrimitive
Weiterhin für die Tastatureingaben:
Code:
if (GetAsyncKeyState(VK_INSERT)&1) { bla; }
Und noch mehr: da es eher schlecht ist, die ganzen Funktionen mit
statischen Offsets zu hooken, hier zwei Methoden die das ganze
dynamisch verarbeiten. Hier die Methode von SwTTy für die Adressen
der d3d9.dll:
Grobe Infos gibt’s auf Wikipedia: Tabelle virtueller Methoden ? Wikipedia
So, jetzt sind wir eigentlich schon am Schluss angekommen. Ich
hoffe ihr konntet hiermit etwas anfangen und euch ist das Thema
D3D jetzt ein bisschen klarer.
Gib quelle an
100% nicht selber geschrieben weil irgendwo habe ich das schonmal gesehen...
Quote:
Originally Posted by .67BeatzZ
Woher kopiert
Gib die Quelle an :9
Quote:
Originally Posted by -Arkian-
Wenn du Guardian werden willst schreib nicht in so nem Umgangston...
Hast du es nun kopiert? Ist nicht schlimm falls ja, musst halt nur die Quelle angeben. Falls nicht -> Trotzdem ein Thanks von mir und gute Arbeit!
Chillt, ich war nicht daheim.
Ich hab das von ein .pdf bei in gamers gedownloaded und der gepostet hat gehörts auch nicht hat er beschrieben, er hat nur den link dort gepostet.
In den .pdf steht nur das es von purple.d1amond ist ( kA wer des ist).
Und das ist nicht 100% Kopiert, 25% habe ich verbessert hinzugefügt wie z.b. Vorbereitung.
d3d Hooking WarRock 07/11/2010 - General Coding - 12 Replies hi liebe com,
kann mir jemand vllt d3d oer no menue hack tut empfehlen geht auch aus diesen forum ich hab mich ein bisschen mit olly und ida pro auseinander gesetzt und möchte jetzt meinen ersten hack mit Visual c++ erstellen
gebe thx!
PS: C++ lerne ich grad
C++ D3D Hooking 08/24/2009 - C/C++ - 12 Replies Hallo zusammen,
ich stehe gerade vor folgendem Problem:
ich habe eine DLL und einen Loader gecoded, jedoch will ich anstelle des Loader einen Injecter haben, sprich: das spiel, in das injected werden soll, soll schon laufen. Natürlich hab ich das ganze schon probiert, jedoch werden die D3D-funktionen nicht wirklich gehookt, da die DLL auf ein Direct3DCreate9 wartet. Da diese Funktion aber wahrscheinlich direkt beim Starten des "Opfer-Spiels" ausgeführt wird, werden deswegen die anderen...
DLL Hooking/Injection 03/20/2008 - General Coding - 4 Replies Can anyone lead me to some GOOD tutorials for DLL Hooking/Injection... as the ones ive found on Google are absolutely shit.
Thanks in advance. :bandit: