Home of Gamehacking - Archiv
Kleine Hilfe zu WriteProcessMemory gesucht... - Druckversion

+- Home of Gamehacking - Archiv (http://archiv-homeofgamehacking.de)
+-- Forum: Coding (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=15)
+--- Forum: Delphi (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=20)
+--- Thema: Kleine Hilfe zu WriteProcessMemory gesucht... (/showthread.php?tid=1175)

Seiten: 1 2 3 4 5 6 7


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 12.09.2012

(11.09.2012, 23:45)darius83 schrieb: Hmm das mit VirtualAllocEx muss ich mir mal genauer anschaun... Weiss aber jetzt schon, dass ich da wieder Probleme bekomme, weil dann ja die JMP Befehle nicht mehr fest sind und ich ka habe, wie ich dann rausbekomme, welche Bytes ich dafür schreiben muss XD

Es gibt doch auch Möglichkeiten ohne das du die Sprünge berechnen lassen musst.
Geht sogar einfacher als Du denkst.


EDIT//
Noch was zu Deinem Code...
[code=Delphi]RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('C'));[/code]
Ist ja schön und gut das Du Deinem Trainer den Hotkey global zusicherst (registrierst). Aber... Erstens funktioniert das nicht in jedem Spiel und zweitens... Wenn dann solltest Du nachdem Dein Trainer beendet wurde diesen Hotkey auch wieder freigeben.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - darius83 - 12.09.2012

(12.09.2012, 05:48)sILeNt heLLsCrEAm schrieb: Es gibt doch auch Möglichkeiten ohne das du die Sprünge berechnen lassen musst.
Geht sogar einfacher als Du denkst.


EDIT//
Noch was zu Deinem Code...
[code=Delphi]RegisterHotKey(Form1.Handle, ID, MOD_Alt, Ord('C'));[/code]
Ist ja schön und gut das Du Deinem Trainer den Hotkey global zusicherst (registrierst). Aber... Erstens funktioniert das nicht in jedem Spiel und zweitens... Wenn dann solltest Du nachdem Dein Trainer beendet wurde diesen Hotkey auch wieder freigeben.

Hmmm also VirtualAllocEx gibt ja nur die BaseAdresse zurück, an der Speicher reserviert wurde... wenn ich den 2. Parameter auf NULL setze, ist die Adresse random, wenn ich das richtig verstanden habe. Wie bekomm ich denn dann die Bytes für den Jump dahin und wieder zurück? oder wie komme ich anders an die Stellen?

Wegen dem Key, ja hab UnRegisterHotKey(Form1.Handle, ID); vergessen :/ naja und zumindest hier gehts mit Globalem Hotkey... wie funktioniert das denn mit Lokalen? Hotkeys?

LG Darius83






RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 13.09.2012

An dieser Stelle seien da mal 2 Möglichkeiten genannt wie man die Berechnung der Sprünge umgehen kann und das Ganze mit in die Codeinjection verlagert...
Den nachfolgenden Beispielen liegt folgender Beispielcode zu Grunde...

[code=ASM]
//Original Code
---------------
007BB1DF - 8B 48 10 - mov ecx,[eax+10]
007BB1E2 - 03 48 04 - add ecx,[eax+04]
007BB1E5 - 8B 16 - mov edx,[esi]
007BB1E7 - 51 - push ecx
007BB1E8 - 8B CE - mov ecx,esi
007BB1EA - FF 52 0C - call dword ptr [edx+0C][/code]

Beispiel 1


Beispiel 2


Und wie man sicherlich schon bemerkt ist das Beispiel 2 umfangreicher bzw. komplexer und nimmt, Laienhaft ausgedrückt, mehr Platz weg. Von daher favourisiere ich die erste Methode und da brauch ich im Trainer nicht noch irgendwelche Funktionen um die Sprünge zu berrechnen...
Aber wie heißt es - Jeder hat seine eigene Methode... Und solange in einem Spielprozess der ungenutzte Speicher da ist dann nutze ich in der Regel diesen, ehe ich mir mit VirtualAlloc einen Speicherbereich zuweise...

grEEtZ sILeNt heLLsCrEAm


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - DNA - 13.09.2012

Ich habe gerade mal einen meiner Beiträge bei drolle rausgesucht,
hier wird eine weitere Möglichkeit gezeigt.

Zitat:Die Bytes, die für einen JMP geschrieben werden müssen, sind abhängig von 2 Sachen ...

1. Die addi VON der gesprungen wird
2. Die addi ZU der gesprungen wird

Ich habe hier gerade ein Beispiel von GTA2 ...

Der Originalcode steht bei 433B70(JumpFrom) und der Codecave ist bei 2A0000(JumpTo)
Rechnerisch sieht das Folgendermaßen aus ...

Code:

Code:
    JumpTo - JumpFrom -5 (und das ganze muss dann noch umgedreht werden)
    2A0000 - 433B70 - 5 = FFFFFFFFFFE6C48B (umdrehen) 8B C4 E6 FF (den rest streichen wir, da wir nur die ersten 4 Bytes brauchen)



Für den JMP in meinem Fall müsste man folgende Bytes schreiben
E9 8B C4 E6 FF

Und wer jetzt denkt, dass das alles war, den muss ich enttäuschen ^^

Wir brauchen ja auch noch einen JMP zurück zum Originalcode ...
die Formel ist änlich wie die oben:


Code:
    JumpTo - JumpFrom - 5
    433B77 - 2A0020 - 5 = 193B52 (umdrehen) 52 3B 19 00 (da kein Taschenrechner vorne Nullen anzeigt, wir aber 4 Bytes brauchen, müssen wir uns die dazu denken)



CI würde so aussehen:
E9 52 3B 19 00

So, ich hoffe ich konnte irgendwem damit helfen


Ich benutze eigentlich nur noch VirtualAlloc und habe mir eine Funktion (in VB)
geschrieben, die automatisch die richtigen Bytes berechnet und an die richtige
Stelle schreibt.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 13.09.2012

Die Berechnung der Sprünge könnte man in Delphi auch mit ein bissl Inline ASM realisieren.
Ich glaube Acubra hat sowas auch in einem seiner C++ Projekte gezeigt.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - Acubra - 13.09.2012

(13.09.2012, 17:18)sILeNt heLLsCrEAm schrieb: Die Berechnung der Sprünge könnte man in Delphi auch mit ein bissl Inline ASM realisieren.
Ich glaube Acubra hat sowas auch in einem seiner C++ Projekte gezeigt.

Hey,
siehe hier: http://homeofgamehacking.de/showthread.php?tid=842
Lässt sich aber ohne InlineASM einfacher und übersichtlicher realisieren, nur war ich damals anscheinend auf irgendeinem ASM Trip oder so.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - darius83 - 14.09.2012

Hmm so schwer scheints ja wirklich nicht zu sein mit dem VirtualAllocEx. Allerdings hab ich da grad ein Problem. Wie bekomme ich jetzt die Bytes für den Jump in die Cave? Zurück ist kein Problem, da ja die Adresse fest ist, aber irgendwie muss ich die Pointer-Var vom Alloc ja in Bytes zerlegen...

LG Darius83


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - DNA - 14.09.2012

Eigentlich ist diesbezüglich alles in den letzten
5 beiträgen gesagt worden.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - darius83 - 14.09.2012

(14.09.2012, 12:06)DNA schrieb: Eigentlich ist diesbezüglich alles in den letzten
5 beiträgen gesagt worden.

Ich glaube eher, ich habe mich ein wenig missverständlich ausgedrückt... Ich rede davon, dass ich in Delphi jetzt als Rückgabewert von VirtualAllocEx eine Variable vom Typ Pointer habe und nicht weiss, wie ich damit umgehen muss, um mein Array of Bytes zu bekommen, mit dem ich dann arbeiten kann... den Rest hab ich ja verstanden, aber ich hab noch nie was mit --> Var: Pointer <-- zu tun gehabt und bin da grad etwas hilflos :P

LG Darius83


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 14.09.2012

Da hab ich dich schon richtig verstanden, aber irgendwie hatte ich mit meinem Handy nen Verbindungsabbruch und der Beitrag wurde widererwarten nicht gepostet...

Egal... Hier siehst Du ein Beispiel...
[code=Delphi]var
BaseAdress: PByte;
begin
BaseAdress:= VirtualAllocEx (hProcess, nil, 1000, Mem_Commit or Mem_Reserve, Page_Execute_ReadWrite);[/code]

Da die Basisadresse des zugewiesenen Speichers ja bekannt ist (BaseAdress) musst Du davon ausgehend auch wissen wo der Jump hinsoll. Nehmen wir mal an die Basis Adresse ist 10000000h und der Jump steht an Adresse 10000500h. Dann könntest Du das auch so verstehen das der Jump an "Basisadresse + 0x500h" steht.
Das wiederrum würde dann so aussehen...
[code=Delphi]WriteProcessMemory(hProcess, Pointer(BaseAdress+$500), lpBuffer, nSize, lpNumberOfBytesWritten);[/code]

grEEtZ sILeNt heLLsCrEAm