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 - 09.09.2012

Diese Diskussion sollten wir lieber im Gamehacking Forum weiterführen da wir an dieser Stelle zu sehr ins Offtopic geraten.
Ich denke mal das Du, so wie Du schreibst, auch schon einen Spiele Titel hast bei dem Du mit dem Suchen einer Adresse nicht weiterkommst.
Dann poste doch einfach mal einen Thread wie gesagt im Gamehacking Forum und da können wir weiter drüber philosophieren Wink


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

Soo, ich habe mal geschaut, wie ich das ganze mit einer Codecave lösen könnte, habe dann 2 Adressen gefunden:

game.dat+166D77 - 89 46 04 - mov [esi+04],eax // Geld wird durch sammeln erhöht.

game.dat+166CD5 - 89 47 04 - mov [edi+04],eax // Geld wird durch ausgeben gesenkt.

Rein theoretisch kann ich ja jetzt an beiden einen Jump schreiben und eax dann auf einen festen Wert setzen (mov eax,3A98 z.B.). Mit CE klappt das ganze auch wunderbar Wink

aber wie realisiere ich das ganze jetzt in Delphi, damit ich nicht jedes mal wieder in CE die beiden Adressen raussuchen muss und anschliessend die Codecave in CE eingeben muss? Also, wie sage ich Delphi, an welcher Stelle die Bytes für die CodeCave geschrieben werden müssen, irgendwie muss ich ja da auch den entsprechenden Adresswert finden, oder schreibe ich das ganze immer an die selbe Stelle?

LG Darius83




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

Hey,
starte das Spiel doch einfach neu und gucke ob sich die Offsets (166D77, 166CD5) verändert haben. Wenn nicht, dann werden die Adressen (abhängig von der Baseadresse der game.dat) immer die gleichen sein. Somit kannst du dann auch per WriteProcessMemory einfach deine Bytes schreiben.
Du musst natürlich zuerst die BaseAdresse herausfinden und darauf dann das jeweilige Offset addieren, um zur eigentlichen Adresse zu kommen (vorausgesetzt die BaseAdresse der game.dat ändert sich bei jedem Neustart).



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

Hmmm und wieso funktioniert das hier nicht?

[code=delphi]
WriteProcessMemory(Pidhandle, Pointer($00566d77),Pointer($E98492D201) , 5, Written);
[/code]

Written gibt imer 0 aus...


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

Das kann auch nicht funktionieren...
Anstelle von "Pointer($E98492D201)" erwartet die Funktion die Daten die geschrieben werden sollen. In deinem Fall weiß die Funktion nichts damit anzufangen.
Ich würde das der Funktion als Array übergeben. Ist eigentlich am einfachsten.
Ich lass mich natürlich gerne auch eines Besseren belehren.

Das würde dann z.B. so aussehen.
[code=Delphi]var
JMPCC: array [0..4] of byte = ($E9, $84, $92, $D2, $01);
Written: SIZE_T;
begin
WriteProcessMemory(Pidhandle, Pointer($00566d77), @JMPCC, 5, Written);
end;[/code]


(09.09.2012, 18:35)darius83 schrieb: Rein theoretisch kann ich ja jetzt an beiden einen Jump schreiben und eax dann auf einen festen Wert setzen (mov eax,3A98 z.B.). Mit CE klappt das ganze auch wunderbar.
Aber bedenke... Das funktioniert nur wenn auch nur die Geldadresse durch diese Befehle laufen. Wenn durch diese Befehle auch Adressen laufen die für das Spiel von anderen Nöten sind kann es sein das es crasht. Sowas muss nicht immer sofort passieren, kann aber z.B. beim Level laden oder im Home Screen vorkommen. Je nachdem halt...


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

(10.09.2012, 00:32)sILeNt heLLsCrEAm schrieb: Aber bedenke... Das funktioniert nur wenn auch nur die Geldadresse durch diese Befehle laufen. Wenn durch diese Befehle auch Adressen laufen die für das Spiel von anderen Nöten sind kann es sein das es crasht. Sowas muss nicht immer sofort passieren, kann aber z.B. beim Level laden oder im Home Screen vorkommen. Je nachdem halt...

Also ich habs jetzt hinbekommen, dass ich mit Delphi den jmp befehl an die stelle schreibe, habs mit array of byte gemacht, auch wenn ich von selbst schon drauf gekommen war XD aber hab jetzt 2 probleme...

1. kann ich die sprungadresse, die ich in CE benutzt habe nicht beschreiben... muss ich in delphi da noch iwas vorher senden oder den speicherbereich erst freigeben oder so?
2. kommt es wie du schon angedeutet hast im homescreen oder beim laden des lvls zum crash...
ich denke mal, dass es momentan einfach daran liegt, dass der jump geschrieben wird, aber dort nix steht, der jump quasi ins nirvana führt, aber kann auch noch andere ursachen haben, die ich nicht testen kann, solange ich dort nicht reinschreiben kann :(
Deswegen hatte ich ja beim Pointertrainer auch die Abfrage drin, dass er erst den Wert ändert, wenn er größer 0 ist... müsste bei cave doch auch klappen oder? Also prüfen, wenn > 0 dann ändern sonst code normal ausführen

LG Darius83



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

Das ist richtig...
Zu allererst müsstest Du z.B. am einfachsten mit Cheat Engine nachverfolgen ob die Daten so geschrieben wurden wie Du es beabsichtigt hast. Also der Jump zur Codecave und die Codecave selbst.
Ich denke mal das der Jump geschrieben wurde, aber je nachdem wo deine Codecave steht kann es natürlich sein das dein Trainer keine Schreib-/Zugriffsrechte auf diesen Speicherbereich hat. Vom Trainer selbst her würdest Du das wahrscheinlich nicht bemerken, aber mit einem Debugger oder eben dem Dissassembler von CE könntest Du z.B. nachvollziehen ob alles korrekt geschrieben ist.
Wenn das nicht der Fall ist, dann liegts eben daran das der Trainer die Daten zwar vermutlich schreibt diese aber nicht in den Prozess injeziert werden weil eben die Schreibrechte fehlen. Diese Schreibrechte kannst Du dir mit der API VirtualProtectEx zusichern.

[code=MSDN]BOOL WINAPI VirtualProtectEx(
_In_ HANDLE hProcess,
_In_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flNewProtect,
_Out_ PDWORD lpflOldProtect
);[/code]


Zitat:hProcess [in]

A handle to the process whose memory protection is to be changed. The handle must have the PROCESS_VM_OPERATION access right. For more information, see Process Security and Access Rights.
lpAddress [in]

A pointer to the base address of the region of pages whose access protection attributes are to be changed.

All pages in the specified region must be within the same reserved region allocated when calling the VirtualAlloc or VirtualAllocEx function using MEM_RESERVE. The pages cannot span adjacent reserved regions that were allocated by separate calls to VirtualAlloc or VirtualAllocEx using MEM_RESERVE.
dwSize [in]

The size of the region whose access protection attributes are changed, in bytes. The region of affected pages includes all pages containing one or more bytes in the range from the lpAddress parameter to (lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes the protection attributes of both pages to be changed.
flNewProtect [in]

The memory protection option. This parameter can be one of the memory protection constants.

This value must be compatible with the access protection specified for the pages using VirtualAlloc or VirtualAllocEx.
lpflOldProtect [out]

A pointer to a variable that receives the previous access protection of the first page in the specified region of pages. If this parameter is NULL or does not point to a valid variable, the function fails.



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

Ok, jetzt hats geklappt... Musste mir allerdings erstmal eine andere Speicheradresse suchen für den Cave... Anscheinend erstellt CE über Auto Assemble - CodeCave extra Speicher für die Cave, jedenfalls ist ebendieser Bereich bei mir auch mit VirtualProtectEx nicht beschreibbar gewesen... :/ Wie kann ich sowas denn in Delphi realisieren? Naja ich poste morgen Abend mal, was ich so gebastelt habe Wink

LG Darius83


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

(11.09.2012, 00:36)darius83 schrieb: Anscheinend erstellt CE über Auto Assemble - CodeCave extra Speicher für die Cave
Hey,
entweder du benutzt die "Scan for CodeCaves" Funktion von Cheat Engine (siehe mein CodeCave Tutorial), oder du verwendest die VirtualAlloc (bzw. VirtualAllocEx) Funktion (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx) um selber Speicher zu alloziieren.
In C++ sieht das Ganze so aus : http://homeofgamehacking.de/showthread.php?tid=842


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

(11.09.2012, 16:03)Acubra schrieb:
(11.09.2012, 00:36)darius83 schrieb: Anscheinend erstellt CE über Auto Assemble - CodeCave extra Speicher für die Cave
Hey,
entweder du benutzt die "Scan for CodeCaves" Funktion von Cheat Engine (siehe mein CodeCave Tutorial), oder du verwendest die VirtualAlloc (bzw. VirtualAllocEx) Funktion (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx) um selber Speicher zu alloziieren.
In C++ sieht das Ganze so aus : http://homeofgamehacking.de/showthread.php?tid=842

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

Naja hier erstmal mein momentaner Code und @sILeNt heLLsCrEAm:
Du hast jetzt auch deinen Shortcut drin :P