[How To]D3D Hooking erstellen...

11/04/2011 14:48 Ruffie.Sanji#1
Inhalt

[+] Einleitung
[+] Vorraussetzungen
[+] Die DLL Coden
[+] Rechtecke && Schrift Zeichnen
[+] Memoryhacks aus der DLL heraus
[+] Chams
[+] Noch mehr Funktionen

Einleitung

Vorraussetzungen

Vorbereitungen

Die DLL Coden

Rechtecke && Schrift Zeichnen



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:
Code:
HRESULT __stdcall SetStreamSource(LPDIRECT3DDEVICE9 pDevice,UINT
StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride);
HRESULT __stdcall DrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice,D3DPRIMITIVETYPE Type,INT
BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount);

Versucht es analog zu EndScene herzubringen. Dann erstellen wir
eine neue Variable:
Code:
if (Stride != NULL ) myStride = Stride;
Jetzt können wir den Wert aus Stride auch in den anderen
Funktionen nutzen.
Wechselt jetzt zu DrawIndexedPrimitive. Fügt folgenden Code ein:
Code:
if (myStride == 20) {
pDevice->SetRenderState(D3DRS_ZENABLE,false);
pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
pDevice->SetTexture( 0, texGreen);
pDevice->DrawIndexedPrimitive(Type,BaseVertexIndex, MinVertexIndex, NumVertices, startIndex,
primCount);
pDevice->SetRenderState(D3DRS_ZENABLE,true);
pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
pDevice->SetTexture( 0, texRed);
}
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.


Noch mehr Funktionen
Zum Beispiel 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:
Code:
HMODULE hModule = NULL;
while(!hModule)
{
hModule = GetModuleHandleA("d3d9.dll");
Sleep(100);
}
dwBeginScene = (DWORD)hModule + 0x87010;
dwEndScene = (DWORD)hModule + 0x871A0;
dwReset = (DWORD)hModule + 0x636B0;
dwDrawIndexedPrimitive = (DWORD)hModule + 0x88830;
dwSetViewPort = (DWORD)hModule + 0x82F70;

Und dann eine noch bessere Methode von Gordon. Dazu brauchen wir
erste diese zwei Funktionen von GameDeception:
Code:
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(;*szMask;++szMask,++pData,++bMask)
if(*szMask=='x' && *pData!=*bMask )
return false;
return (*szMask) == NULL;
}
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i < dwLen; i++)
if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
return (DWORD)(dwAddress+i);
return 0;
}
Und dann holt man sich das ganze per VMT:
Code:
HMODULE hModule = NULL;
while(!hModule)
{
hModule = GetModuleHandleA("d3d9.dll");
Sleep(100);
}
DWORD* VTableStart = 0;
DWORD FoundByGordon = dwFindPattern((DWORD)hModule, 0x128000,
(PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
memcpy(&VTableStart, (void*)(FoundByGordon+2), 4);
dwDrawIndexedPrimitive = (DWORD)VTableStart[82]; // für mehr: blick in die d3d9.h werfen!
dwEndScene = (DWORD)VTableStart[42];
[/spoiler]

Press Thanks für die Mühe DANKE !
11/04/2011 15:04 _Eckl#2
hmm warum kommt mir das so bekannt vor --> [Only registered and activated users can see links. Click Here To Register...]
11/04/2011 15:09 Ruffie.Sanji#3
Mir auch habe ihn gepostet weil ich denke das das vielen nützen wird ;)
11/04/2011 15:21 theitfan1337#4
#closed