Home of Gamehacking - Archiv

Normale Version: Two Worlds 2
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Guten Morgen...

Wie ich schon geschrieben hatte, arbeite ich ja bereits an einem Trainer für Two Worlds 2 in der Version 1.2.
Bei diesem Spiel wurden ganz schön straffe Geschütze aufgefahren um uns Gamehackern das Leben schwer zu machen. Ob gewollt oder nicht, aber jeder, dem das Spiel zugänglich ist, sollte sich mal dran versuchen die Werte für Gold, Erfahrungs-, Attribut- und Skillpunkte zu finden. Also das Spiel hat wirklich mal nen gescheiten Cheatschutz... Happy

Als erstes wäre da das die Basis Adresse der EXE sich bei jedem Neustart des Spiels ändert. Zweitens wäre da die Tatsache das sich jedes mal die Adressen der Werte ändern wenn man aus dem Spiel raustabt und wieder zurück. Und drittens wäre da noch zu erwähnen das die Werte alle mit nem Exlusiven Oder (XOR) encrypted/verschlüsselt sind.

Mal sehen, wenn ich Lust und Laune habe werde ich dazu mal nen Tutorial veröffentlichen. Aber wenn dann wird es sicherlich eins für absolute Profi's/Fortgeschrittene da ich das Finden der Adressen und Ändern der Werte nur mal Rande erklären würde...

In diesem Sinne...
Gute Nacht Smiling
sILeNt heLLsCrEAm

PS: Bleibt mir nur noch zu sagen das der Trainer noch lange nicht fertig ist. Die oben genannten Anti Cheat Maßnahmen konnte ich bereits umgehen. Heißt mit anderen Worten das diese Cheats so gut wie fertig sind. Aber der Rest wie Health, Ausdauer, Mana, One Hit Kill fehlen da noch.
(22.08.2011, 04:05)sILeNt heLLsCrEAm schrieb: [ -> ]Als erstes wäre da das die Basis Adresse der EXE sich bei jedem Neustart des Spiels ändert.

Das hört sich für mich an das sich der Code in der dll befindet xD.
Musst halt von der dll die adresse nehmen und dann ausrechnen wo sich der code befindet ansprechen kannste das dann mit der dll adresse + xy

also so ähnlich wie bei pointern xD

die werte suchen das wird da schon nerviger hasse es mit meinen laptop immer nach unbekannten werten zu suchen da der eh so garde nur die games packt dauerts ewig scheiß asus k70ic ist halt schon alt das ding...

werd mir das game aber auch mal ansehen d.h. wenn laptop das packt
Hi...

Da liegst Du völlig falsch. Ich habe gesagt das sich die Basis Adresse der EXE Datei ändert. Die Cheats stehen allesamt in der EXE und nicht in einer DLL.
Bei Halo 2 ist es genau dasselbe Problem... Dazu gibts hier aber auch schon nen Thread im Forum unter Trainer Requests.

2. Wenn es sowas simples wie mit ner DLL wäre würde ich nicht so nen riesen Fass aufmachen Happy

Hier noch nen Screenshot zum verdeutlichen...
[Bild: imagebase.jpg]

Ich hoffe das ist nun klar soweit. Aber wie schon gesagt hab ich eine Lösung dafür gefunden. Und zwar wird die EXE bzw. der Prozess über einen Remote Thread abgefangen und von da die "ModulBase" genommen.

Die verschlüsselten Werte bzw. die daraus resultierenden Code Injections sind auch fertig. Muss nur noch den Trainer coden. Das dauert noch ein bissl da ich morgen so gut wie keine Zeit hab und ansonsten muss ich noch die Sache mit den Hilfsbytes programmieren. Dann noch ein bissl testen... Ich will nicht zu viel versprechen aber es ist durchaus möglich das dieser noch diese Woche online geht.

grEEtZ sILeNt heLLsCrEAm

PS: Wenn Du die Grafik auf Mittel/Low runterschraubst sollte das auch auf deinem Lappi laufen... Auch mit den Auflösungen ist es recht komfortabel. Ich glaub bei 800x600 fängts da an.
Jemand von hier fragte mich das per ICQ.
Dort ging es auch um Halo 2 und die Base.
Hatte ihm diesen Code geschickt.
[code=asm]TL_GetBase proc uses ecx edx ebx edi dwProcessIdHappyWORD,lpszFileHappyWORD,iBaseSizeHappyWORD
local me32:MODULEENTRY32

xor ebx,ebx
invoke RtlZeroMemory,addr me32,sizeof MODULEENTRY32

mov edi,lpszFile
.if (edi)
invoke CreateToolhelp32Snapshot,TH32CS_SNAPMODULE,dwProcessId
.if (eax!=INVALID_HANDLE_VALUE)
push eax
mov me32.dwSize,sizeof me32
invoke Module32First,[esp+4],addr me32
.while (eax)
invoke lstrcmpi,addr me32.szModule,edi
jz @mod_check
invoke Module32Next,[esp+4],addr me32
.endw
call CloseHandle
jmp @mod_end
@mod_check:
call CloseHandle
mov eax,iBaseSize
test eax,eax
jz @mod_ok
cmp me32.modBaseSize,eax
je @mod_ok
dec ebx
jmp @mod_end
@mod_ok:
mov ebx,me32.modBaseAddr
.endif
.endif

@mod_end:
mov eax,ebx
ret
TL_GetBase endp[/code]

iBaseSize: 0=Kein Test. BaseSize=Testen. (Ist der Rückgabewert -1. Dann handelt es sich um eine falsche Version.)
lpszFile: Name der Exe/Dll(Ohne Pfad!). (Ist der Rückgabewert 0. Base konnte nicht ermittelt werden.)
dwProcessId: Die ProcessID.

invoke TL_GetBase,pid,addr szGameExe,148000h
oder
invoke TL_GetBase,pid,addr szGameExe,NULL ; BaseSize egal.

Vllt kann es noch jemand gebrauchen.

MfG
Aber wie du schon schreibst "lpszfile = Name der DLL". Über CreateToolHelp32Snapshot komm ich auch an die Basisadresse der DLL ran, aber nicht an die Basisadresse des Main Prozesses.
(23.08.2011, 12:18)sILeNt heLLsCrEAm schrieb: [ -> ]Aber wie du schon schreibst "lpszfile = Name der DLL". Über CreateToolHelp32Snapshot komm ich auch an die Basisadresse der DLL ran, aber nicht an die Basisadresse des Main Prozesses.

Vllt etwas unübersichtlich, aber da steht Exe/Dll. Wink

Man findet die Base der Executable unter Modules.
Immer(?) an erster Stelle.
[Bild: base.png]

MfG

Okay, durchaus möglich das dass geht. Ich code unter Delphi und da kann ich dir zwar soweit folgen aber mich wunderts dennoch das dass funktioniert.

Hier mein Beispiel aus Delphi...
[code=Delphi]
ProcSnap:= CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
ProcessEntry.dwSize:= SizeOf(ProcessEntry);
FindProcess:= Process32First(ProcSnap, ProcessEntry);
ProcID:= -1;
while FindProcess do begin
if (CompareText(ProcessEntry.szExeFile, ProcessName) =0) then
ProcID := ProcessEntry.th32ProcessID; //Hier krieg ich die ProzessID des vorher definierten Prozesses (EXE)
FindProcess := Process32Next(ProcSnap, ProcessEntry); //Wenn nicht...? Dann wird mit dem nächsten Prozess weiter gemacht.
end;
CloseHandle(ProcSnap);
if ProcID >= 0 then begin //Wurde die ProzessID zum definierten Prozess gefunden dann wird mit
ProcOpen := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID); //dem nächsten Schritt weitergemacht...[/code]

Um an die Basis Adresse einer DLL Datei zu kommen gehe ich über CreateToolHelp... um an die ProzessID des Main Prozesses zu kommen. Wenn ich die habe gehe ich ebenfalls über CreateToolHelp... Um mittels der ProzessID die jeweils geladenen Module durchzugehen.
Hier dazu das Delphi Beispiel...
[code=Delphi]
SnapMod:= CreateToolhelp32Snapshot(TH32CS_Snapmodule, ProcID);
ModuleEntry.dwSize := Sizeof(ModuleEntry);
FindDLLBase:= Module32First (SnapMod, ModuleEntry);
while FindDLLBase do begin
if (CompareText(Moduleentry.szModule, DLLName) =0) then
DLLBaseAddy:= ModuleEntry.modBaseAddr; //Wurde die vorher definierte DLL bzw. das Modul des entsprechenden Prozesses
FindDLLBase:= Module32Next(SnapMod, ModuleEntry); //passend zur ProzessID gefunden, wird die Basis Adresse in die Variable
end; //"DLLBaseAddy" kopiert bzw. gesichert.
CloseHandle(SnapMod);[/code]

Also ich wüsste nicht wie ich über CreateToolHelp... an die Basis Adresse der EXE rankommen sollte Huh
Ich komme da zu keinem Ergebnis. Hab das wie gesagt nun anders gelöst.

grEEtZ sILeNt heLLsCrEAm
@Maluc
Das ist nicht der Code den ich mal von dir hatte. Den du da geschrieben hast scheint nur bei einer DLL zu funktionieren. Dummerweise finde ich den Code von dir nicht mehr der funktioniert hatte. Die Exe steht zwar zuerst, es wird aber die erste Dll genommen.
Aber mit CreateToolHelp32Snapshot geht das schon mit der Exe.

@sILeNt heLLsCrEAm
Wenn du mal deine Lösung schreibst bringe ich mal meine Lösung in meinen Forum um die Base der Exe zu finden die auch schon bei den Witcher2 Trainer getestet ist.
Aber vieleicht wills du's erst mal für dich behalten? Man plaudert ja nicht gern neue Erkentnisse gleich aus.
Genauso isses dr.oLLe. Kann dir diese natülrich mal per PM zukommen lassen. Aber wie ich schon schrieb code ich in Delphi.

Nichts desto trotz ist der Trainer nun fertsch. Das war vielleicht ne schwere Geburt Happy

grEEtZ sILeNt heLLsCrEAm
Hey,
hier mal die Methode aus meiner Base:

[code=ASM]
invoke CreateToolhelp32Snapshot, TH32CS_SNAPMODULE, PID
mov hSnap,eax
mov xModule.dwSize, sizeof xModule
invoke Module32First, hSnap, addr xModule
invoke lstrcmpi, ModuleName, addr xModule.szModule
.if eax == 0
mov ebx, xModule.modBaseAddr
ret
.else
.while eax != 0
invoke Module32Next, hSnap, addr xModule
.if eax != 0
invoke lstrcmpi, ModuleName, addr xModule.szModule
.if eax == 0
mov ebx, xModule.modBaseAddr
ret
.endif
.endif
.endw
.endif
[/code]
Funktioniert mit .exe sowie .dll Dateien.
Seiten: 1 2