Wolfteam Hacking Fragen

03/19/2014 20:58 JustinGX#1
Hi^^

bin hier ganz neu, weshalb ich mal ein paar Fragen hätte.
Und vorab, ja, ich kann programmieren, allerdings auch nur seit zwei Jahren Delphi. Wegen C++ und dergleichen müsste ich mich eben entsprechend mal umsehen.

hab am rande schon paar sachen mitbekommen, auch in anderen foren, allerdings hätte ich noch paar fragen:

- was ist eigentlich genau diese cshell und die dazugehörige base adresse? anscheinend findet man darüber seit neuestem die addys für hacks?
- wie funktioniert das mit der .asi? kann ich da auch trotzdem noch dlls nutzen oder wie benutzt man diese injektion?
- ist es bei d3d hooking eher schon engine hooking oder braucht man schlichtweg einfach neue umgehungsmethoden, um d3d hooks im spiel anzuwenden?

Wäre dankbar für ein paar nette und hilfreiche antworten^^

greets
03/19/2014 22:02 C0RE'#2
Cshell ist der Kern des Spiels. Base Adresse ist unterschiedlich
einfach dll in .asi umbenennen und in wt ordner-> wird automatisch injiziert

Einfache d3d Hooks.
03/22/2014 16:54 .tal0s#3
Quote:
Originally Posted by JustinGX View Post
...
- was ist eigentlich genau diese cshell und die dazugehörige base adresse? anscheinend findet man darüber seit neuestem die addys für hacks?
CShell.dll ist der Kern der LithTech Engine, sie enthält die meisten Addressen bzw. eigentlich statische/konstante des Spieles. Daher sind aus der CShell nur Memory Cheats möglich.

- wie funktioniert das mit der .asi? kann ich da auch trotzdem noch dlls nutzen oder wie benutzt man diese injektion?
Dll Injektion ist natürlich noch möglich.
Jedoch ist es einfacher die .dll in eine .asi umzubennen denn die SoundEngine von Wolfteam lädt jede .asi im Hauptverzeichniss.

- ist es bei d3d hooking eher schon engine hooking oder braucht man schlichtweg einfach neue umgehungsmethoden, um d3d hooks im spiel anzuwenden?
Ein Bypass wird nicht benötigt, ein Engine Hook wird auch nicht benötigt.
Es ist jedoch relativ kompliziert spieleigene Speicherbereiche die auf die d3d9.dll verweißen auf eine eigene Funktion umzuleiten.
Hier ist Reverse Engineering gefragt.

Quote:
Originally Posted by C0RE' View Post
Cshell ist der Kern des Spiels. Base Adresse ist 34xx..
einfach dll in .asi umbenennen und in wt ordner-> wird automatisch injiziert

Einfache d3d Hooks.
Die 'Base' Addresse ist immer 0x34400000
03/22/2014 17:59 C0RE'#4
Quote:
Originally Posted by .tal0s View Post
Die 'Base' Addresse ist immer 0x34400000
Nein.

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Wie hier der Fall: 3FF0000

Beim Nächsten Start:

[Only registered and activated users can see links. Click Here To Register...]

Schreib dir eine SearchPattern Funktion und erstell dir eine Signatur von den ersten 5-6 Zeilen der CShell, dann hast du immer die Base Addresse. Die Adresse variert meist zwischen 3x - 6x
03/22/2014 18:01 X3enox#5
Also ich selber habe ja noch nichts weiter groß mit d3d-Hooking gemacht.
Im Internet gibt es anscheinend schon vorgefertigte, wobei ich jetzt mal laut dir davon ausgehe, dass die nicht funktionieren werden.

Inwiefern können die sich unterscheiden bzw. was braucht man mehr als einen einfachen endscene-hook, der zb in nem einfachen d3d9 test window gehen würde?
03/22/2014 18:06 C0RE'#6
Quote:
Originally Posted by X3enox View Post
Also ich selber habe ja noch nichts weiter groß mit d3d-Hooking gemacht.
Im Internet gibt es anscheinend schon vorgefertigte, wobei ich jetzt mal laut dir davon ausgehe, dass die nicht funktionieren werden.

Inwiefern können die sich unterscheiden bzw. was braucht man mehr als einen einfachen endscene-hook, der zb in nem einfachen d3d9 test window gehen würde?
Sowas z.B um die DIP zu hooken :

Code:
DWORD CALLBACK DirectX9Thread( LPVOID lpParameter )
{
	LPDWORD pD3D9VTable = ( 0 );
	do
	{
		*(DWORD*)( &pD3D9VTable ) = FindD3D9VTable( );
	}
	while ( pD3D9VTable == 0 );

	DrawIndexedPrimitive_Hook	= ( pD3D9VTable[ 82 ] );
	DrawIndexedPrimitive_Jump	= ( DrawIndexedPrimitive_Hook + 0x5 );
	*(DWORD*)( &DrawIndexedPrimitive_Pointer ) = ( pD3D9VTable[ 82 ] );
	while ( TRUE )
	{
		if ( *(BYTE*)( DrawIndexedPrimitive_Hook ) != 0xE9 )
		{
			pTools->WriteJump( DrawIndexedPrimitive_Hook , (DWORD)DrawIndexedPrimitive_Call );
		}
		Sleep( 500 );
	}
	return ( 0 );
}
__declspec( naked )VOID DrawIndexedPrimitive_Call( )
{
	__asm
	{
		MOV EDI,EDI
		PUSH EBP
		MOV EBP,ESP
		PUSH [ EBP + 0x20 ]
		PUSH [ EBP + 0x1C ]
		PUSH [ EBP + 0x18 ]
		PUSH [ EBP + 0x14 ]
		PUSH [ EBP + 0x10 ]
		PUSH [ EBP + 0xC ]
		PUSH [ EBP + 0x8 ]
		CALL [ DrawIndexedPrimitive_Main ]
		JMP [ DrawIndexedPrimitive_Jump ]
	}
}
03/22/2014 18:51 X3enox#7
Wäre sowas jetzt speziell auf WT bezogen?
Also mich würde interessieren, was jetzt so einen ganz "normalen" EndScene-Hook von einem für WT funktionierenden Hook unterscheidet.
03/22/2014 23:01 snow#8
Quote:
Originally Posted by C0RE' View Post
Sowas z.B um die DIP zu hooken :

Code:
DWORD CALLBACK DirectX9Thread( LPVOID lpParameter )
{
	LPDWORD pD3D9VTable = ( 0 );
	do
	{
		*(DWORD*)( &pD3D9VTable ) = FindD3D9VTable( );
	}
	while ( pD3D9VTable == 0 );

	DrawIndexedPrimitive_Hook	= ( pD3D9VTable[ 82 ] );
	DrawIndexedPrimitive_Jump	= ( DrawIndexedPrimitive_Hook + 0x5 );
	*(DWORD*)( &DrawIndexedPrimitive_Pointer ) = ( pD3D9VTable[ 82 ] );
	while ( TRUE )
	{
		if ( *(BYTE*)( DrawIndexedPrimitive_Hook ) != 0xE9 )
		{
			pTools->WriteJump( DrawIndexedPrimitive_Hook , (DWORD)DrawIndexedPrimitive_Call );
		}
		Sleep( 500 );
	}
	return ( 0 );
}
__declspec( naked )VOID DrawIndexedPrimitive_Call( )
{
	__asm
	{
		MOV EDI,EDI
		PUSH EBP
		MOV EBP,ESP
		PUSH [ EBP + 0x20 ]
		PUSH [ EBP + 0x1C ]
		PUSH [ EBP + 0x18 ]
		PUSH [ EBP + 0x14 ]
		PUSH [ EBP + 0x10 ]
		PUSH [ EBP + 0xC ]
		PUSH [ EBP + 0x8 ]
		CALL [ DrawIndexedPrimitive_Main ]
		JMP [ DrawIndexedPrimitive_Jump ]
	}
}
Vollkommen überladen, ein normaler Detour mit MS Detours macht auch nichts anderes.
@X3enox: Ich habe DX Hooking bei Wolfteam nicht genauer angeschaut, aber wenn die EndScene nicht überprüfen, kannst du tatsächlich einfach einen ganz normalen Detour verwenden.

Quote:
Schreib dir eine SearchPattern Funktion und erstell dir eine Signatur von den ersten 5-6 Zeilen der CShell, dann hast du immer die Base Addresse. Die Adresse variert meist zwischen 3x - 6x
Oder man iteriert mit Module32Next durch alle Module, bis man etwas findet, was mit cSh oder wie das heißt, anfängt. Dann kann man den DWORD BaseAddress aus dem Struct verwenden. Wenn der Name konstant ist, kann man auch einfach reinterpret_cast<DWORD_PTR *>(GetModuleHandleA("namedesmoduls.endung")); verwenden.
03/22/2014 23:38 X3enox#9
Habe mir jetzt mal diverse Tutorials dazu durchgelesen und da stand wohl einiges interessantes dabei (UC, Oldschoolhack, ...).

Ein Search Pattern habe ich jetzt bereits, welches mir die EndScene ermittelt.
Zusätzlich auch einen Detour aus UC (ursprünglich glaube ich von GameDeception) und da wäre meine Frage, ob das so in WT klappen könnte? Generell sollte es ja funktionieren.

Code:
void *Detour(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}
Habe ich das so richtig verstanden, dass hiermit die ersten fünf Bytes der alten Funktion mit der neuen durch ein Jump überschrieben wird?

@C0RE'
Was wäre da eigentlich alles davon abhängig, ob das in WT läuft? Nur der Detour?
03/23/2014 14:33 C0RE'#10
Quote:
Originally Posted by X3enox View Post
@C0RE'
Was wäre da eigentlich alles davon abhängig, ob das in WT läuft? Nur der Detour?
Die Detour ist eigendlich egal, du must einfach immerwieder ausversuchen. EndScene, BeginScene, Present, ...