Home of Gamehacking - Archiv

Normale Version: Pointer Schreiben?
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4 5 6
Geht leider nicht, oder wie würdet hier so ein Pointer schreiben?

[Bild: 8g47ykhm78dq.png]
(07.10.2011, 23:32)chesar schrieb: [ -> ]Geht leider nicht, oder wie würdet hier so ein Pointer schreiben?
Hey,
ich würde das folgendermaßen machen (Ist nur ein Konzept, Syntax u.s.w musst du natürlich anpassen):
ReadProcessMemory, BaseAddress, EndAddress (also die erste Adresse - in deinem Beispiel 0x01E7604C)
Das ganze wird dann in EndAddress gespeichert.
Dann addierst du auf die EndAddress dein erstes Offset und machst wieder das gleiche.
ReadProcessMemory, EndAddress, EndAddress
Dann wieder add EndAddress, offset2
und ReadProcessMemory, EndAddress, EndAddress u.s.w bis du das letzte Offset auch durch hast.
In MASM sieht das so:
[code=ASM]
invoke ReadProcessMemory, hProcess, lpAddress, addr Buffer, 4, 0
mov eax, offset Buffer
mov eax, [eax]
add eax, nOffset1
invoke ReadProcessMemory, hProcess, eax, addr Buffer, 4, 0
mov eax, offset Buffer
mov eax, [eax]
add eax, nOffset2
invoke ReadProcessMemory, hProcess, eax, addr Buffer, 4, 0
mov eax, offset Buffer
mov eax, [eax]
add eax, nOffset3
invoke ReadProcessMemory, hProcess, eax, addr Buffer, 4, 0
mov eax, offset Buffer
mov eax, [eax]
add eax, nOffset4
invoke ReadProcessMemory, hProcess, eax, addr Buffer, 4, 0
mov eax, offset Buffer
mov eax, [eax]
add eax, nOffset5
mov lpAddress, eax
[/code]
(07.10.2011, 22:50)fr33k schrieb: [ -> ]evtl. so:
GetProcessId(ProcName)
pointer = Read_Long(&H1E7604C)
Write_Long(pointer + &H244, 123)
Write_Long(pointer + &H4B0, 123)
Write_Long(pointer + &H5C, 123)
usw...

NICHT getestet!!! aber sollte gehen

Ich code zwar in Delphi und verstehe eigentlich so gut wie garnichts von VB, aber Entschuldigung das kann meines Erachtens auch nicht funktionieren. Die Sache mit den Pointern ist ja die das man einen "Startpunkt" hat. Das wäre in seinem Falle die Aussage "Homefront.exe++016D8F70". Siehe Beitrag 20.
Ausgehend vom Startpunkt ließt man den Speicher ein, dem eingelesenen Wert der ebenfalls eine Adresse darstellt addiert man ein Offset hinzu und ließt diesen Wert (diese Addy) ebenfalls wieder ein. Und je nachdem wieviele Pointer man braucht macht man das mehrere Male.

@chesar
Ob das Beispiel von Acubra so funktioniert kann ich Dir auch nicht sagen, aber ich kann Dir zeigen wie so eine Codecave aussehen könnte. Die könntest Du dann wenigstens nachvollziehen und so hättest Du erstmal ne Grundlage wie das überhaupt funktioniert.
[code=ASM]
push eax
mov eax, [01E7604C]
mov eax, [eax+224]
mov eax, [eax+4B0]
mov eax, [eax+5C]
mov eax, [eax]
mov eax, [eax+1D8]
Nun steht in EAX die/der Addresse/Wert die/den Du suchst...
Abschließend darfst Du auch folgenden Befehl nicht vergessen
pop eax[/code]

Wie Du siehst... Eine Code Injection mittels Pointern zu realisieren ist nicht der Hit.
Sicher wird das für dich nicht großartig hilfreich sein aber ich zeige Dir mal wie da unter Delphi aussehen könnte...
[code=Delphi]ReadProcessMemory (ProcOpen, pointer ($01E7604C), @AmmoAddy, 4, ReadWert);
AmmoAddy:= AmmoAddy + $224;
ReadProcessMemory (ProcOpen, pointer (AmmoAddy), @AmmoAddy, 4, ReadWert);
AmmoAddy:= AmmoAddy + $4B0;
ReadProcessMemory(ProcOpen, pointer (AmmoAddy), @Ammo, 4, ReadWert);
...
...
...[/code]
bekomme leider nichts gebacken :(
Wir oder was würdet ihr denn bei solch einer Pointer Adresse machen?
Es darum die Munni zu freezen.
@sILeNt heLLsCrEAm
ja mitlerweile weiss ich auch was er wollte, und ich habe Beitrag Nr. 20 nicht gelesen.
......................
@fr33k
Schwamm drüber...
War ja auch nicht böse gemeint.
Wieder lieb??? Angel

@chesar
Wenns ums freezen eines Wertes geht, würde ich in jedem Fall ne Codecave mit Pointern schreiben so wie ich es aufgezeigt hatte...
Genauso funktionieren auch Teile meines Lara Croft Trainers. Das ist die simpelste und einfachste Methode eine Adresse zu manpulieren.

Würde ich das ganze vom Trainer aus freezen müsste ich das in eine Timer Prozedur schreiben. Funktioniert zwar auch, ist für mich aber keine saubere Lösung.
An dieser Stelle nenne ich immer gerne das Beispiel mit der Health. Wenn man die Health durch den Trainer freezen lässt und der Trainer grade den Wert nicht freezt (also der Timer grade nicht gesetzt ist) und man einen Freien Fall versucht der unweigerlich zum "Tode" der Spielfigur führt, nützt die Timerfunktion des Trainer nicht viel. Und deshalb ist das keine saubere Lösung. Und es gibt auch Möglichkeiten sowas zu umgehen bzw. das dass nicht immer in einem Spiel funktionieren muss.
Ich hab es z.b. auch schon bemerkt das ich einen Wert gefunden hab, nehmen wir z.b. wieder die Health, dann versucht man diesen Wert mit Cheat Engine zu freezen und was passiert...? Der Wert nimmt dennoch ab...
(08.10.2011, 03:19)sILeNt heLLsCrEAm schrieb: [ -> ]Würde ich das ganze vom Trainer aus freezen müsste ich das in eine Timer Prozedur schreiben. Funktioniert zwar auch, ist für mich aber keine saubere Lösung.

Hey,
@chesar:
Lies dich mal in die VB Programmierung ein und du wirst sehr schnell selber eine Lösung finden. sILeNt heLLsCrEAm und ich haben da denke ich etwas Licht ins Dunkel gebracht.

@sILeNt heLLsCrEAm:
Mal ne Frage, wenn ich via CodeCave eine Addresse "freeze" also immer den gleichen Wert schreibe, geht das dann theoretisch auch "schneller" als über einen Trainer? Ich meine die ReadProcessMemory Aufrufe und dann der WriteProcessMemory Befehl dauern doch länger, als wenn das im Programm selber über die Register geschieht, oder?
(08.10.2011, 03:28)Acubra schrieb: [ -> ]Mal ne Frage, wenn ich via CodeCave eine Addresse "freeze" also immer den gleichen Wert schreibe, geht das dann theoretisch auch "schneller" als über einen Trainer? Ich meine die ReadProcessMemory Aufrufe und dann der WriteProcessMemory Befehl dauern doch länger, als wenn das im Programm selber über die Register geschieht, oder?
Theoretisch, Ja. Praktisch, glaub ich das weniger. Oder hast Du irgendwo noch einen 286er/386er rumgurken? Aber ich glaube das Du damit nicht in den Genuss von Rage, Skyrim und alle "neumodischen" Spiele kommen würdest.

Aber das wäre wohl dieselbe Frage wie - Was ist besser? Xor oder Mov?
Konkret gesagt... Was ist besser
[code=ASM]XOR EAX, EAX
// oder
MOV EAX, 0[/code]
Theoretich ist XOR schneller da es nur 2 Bytes beansprucht. MOV EAX, 0 hingegen beansprucht ganze 5 Bytes und braucht somit mehr Taktzyklen. Aber dem entgegen stehen ja die modernen Chips bzw. Prozessoren von Heute jenseits der 2GHz Grenze.

Um konkret auf Deine Frage zurückzukommen. Definitiv Ja. Die ganzen Read Aufrufe brauchen zeitlich gesehen länger. Und wenn Du einen Wert via Codecave freezt kannst Du auch beeinflussen wann dieser gefreezt werden soll bzw. wann dieser gefreezt wird. Die Ammo bräuchte ja z.b. nur gefreezt werden wenn diese auch wirklich nur abnehmen würde. Also irgendwo im Code die Stelle finden von wo aus dieser Wert geschrieben wird und da die Codeinjection machen. Würdest Du den Wert durch den Trainer freezen würde dieser ja permanent manipuliert auch wenns nicht nötig ist.
Hier ist eine Pointer-Schreib-Funktion

[code=VB] Public Sub Write_Pointer(ByVal WhatToWrite As Int32, ByVal address As Int32, ByVal Offset1 As Int32, Optional ByVal Offset2 As Int32 = Nothing, Optional ByVal Offset3 As Int32 = Nothing, Optional ByVal Offset4 As Int32 = Nothing, Optional ByVal Offset5 As Int32 = Nothing)

address = Read_4Byte(address)
Dim address1 As Int32 = Read_4Byte(address + Offset1)

If Not Offset2 = Nothing Then
Dim address2 As Int32 = Read_4Byte(address1 + Offset2)
If Not Offset3 = Nothing Then
Dim address3 As Int32 = Read_4Byte(address2 + Offset3)
If Not Offset4 = Nothing Then
Dim address4 As Int32 = Read_4Byte(address3 + Offset4)
If Not Offset5 = Nothing Then
Write_4Byte(address4 + Offset5, WhatToWrite)
Else
Write_4Byte(address3 + Offset4, WhatToWrite)
End If
Else
Write_4Byte(address2 + Offset3, WhatToWrite)
End If
Else
Write_4Byte(address1 + Offset2, WhatToWrite)
End If
Else
Write_4Byte(address + Offset1, WhatToWrite)
End If

End Sub[/code]
Obiges einfach in das Trainermodul einfügen und folgendermaßen vom Programmcode aus aufrufen

[code=VB]Write_Pointer(999, &H1e7604c, &H224, &H4b0, &H5c, &H0, &H1d8)[/code]
du meinst Write_Byte oder? und nicht Write_4Byte?
Der Name "write_4Byte" wurde nicht deklariert
Seiten: 1 2 3 4 5 6