[+] 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;
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);
}
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; }
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;
}
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];
Press Thanks für die Mühe DANKE !






