Speicheradresse Verändern
-
Hi!
Ich wollte fragen wie das ist unter Windows XP mit der Adressverwaltung.
Angenommen ich habe eine Speicheradresse z.B.401F76.
In diese möchte ich einen neuen int Wert hineinschreiben (ich weiß dass die Adresse "groß" genug ist).Was wären theoretisch für Schritte notwendig um das zu machen?
Grüße, Michi
-
Bevor man das beantworten kann, muss man noch etwas wissen:
Gehört der Speicherbereich dir? Also zu deinem Prozess?Wenn dem so ist, dann kann man das relativ einfach erreichen. Der Zweck dahinter wäre mir allerdings schleierhaft.
Wenn dem nicht so ist, dann gäbe es wahrscheinlich auch gewisse Möglichkeiten, würde aber davon dringend abraten und ich weiss nicht, ob man dazu Hilfe in diesem Forum bekommen würde, da es stark nach irgendeinem Cheat, Virus oder sonstiges riecht.Grüssli
-
nein, der Prozess gehört nicht zu mir, vielmehr zu dem netten Spiel Mafia. Zwar gibt es etliche Cheatprogramme im Netz aber mich interessiert das selber, wie man sowas macht. Habe mal ein kleines Tutorial gesehen das war allerdings in Delphi geschrieben.
Naja kann ich verstehen, dass man dann natürlich keine Hilfe bekommt. Es würde mich allerdings wirklich interessieren. Wäre dennoch schön wenn ich wenigstens einen Link oder sowas bekomme wo sowas beschrieben steht in Form von c++.
Danke!
-
derDoc schrieb:
Naja kann ich verstehen, dass man dann natürlich keine Hilfe bekommt.
Gut, dass du Verständnis dafür hast.
-
derDoc schrieb:
Es würde mich allerdings wirklich interessieren.
Dann probiers mal im WinAPI-Forum weiter oben.
-
1. im singleplayer spiel zu cheaten ist uns egal das bring nur dir was.
2. wenn man im multiplayerspiel cheaten kann ist das spiel schlecht.=> es spricht nichts dagegen den eigenen speicher zu verändern
das geht glücklicherweise z.b. hier und hier
MfG helferlein
-
super danke werd mir das gleich mal durchlesen!
-
ja das Tutorial ist wirklich super!
Habe das ganze mal versucht, aber irgendwie will es nicht so recht klappen.
Habe zwar die Adresse rausgefunden, in der der entsprechende Wert gespeichert wird, aber wenn ich die Adresse eingebe und dann im Pair dahinter den wert dann tut sich im spiel gar nichts, obwohl das Programm die Sache Ausführt...Gruß
Der Code:
#include <windows.h> #include <tchar.h> #include <utility> // Adressen mit neuen Werten. std::pair<::DWORD, int> data[] = { std::make_pair (0x686614, 999), // Geld //std::make_pair (0x100579c, 321), // Timer }; const int data_size = sizeof (data) / sizeof (data[0]); int main (void) { // MineSweeper suchen und Fenster-Handle sichern. ::HWND hwnd = ::FindWindow (NULL, TEXT ("Mafia")); if (!::IsWindow (hwnd)) { ::_tprintf (_T ("ERROR: Mafia ist nicht aktiv!\n")); return -1; } // Prozess-ID auslesen und ausgeben. ::DWORD process_id = 0L; ::GetWindowThreadProcessId (hwnd, &process_id); ::_tprintf (_T ("INFO : Prozess-ID: %d\n"), process_id); // Zugriff auf den Prozess anfragen. ::HANDLE handle = ::OpenProcess (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, false, process_id); if (handle == NULL) { ::_tprintf (_T ("ERROR: Zugriff auf Prozess nicht möglich.\n")); return -1; } // Alle Änderungen vollziehen. for (int i = 0; i < data_size; ++i) { // Neuen Wert zuweisen. if (!::WriteProcessMemory (handle, reinterpret_cast<void*>(data[i].first), reinterpret_cast<void*>(&data[i].second), sizeof (data[i].second), NULL)) ::_tprintf (_T ("ERROR: Schreiben in '0x%x' nicht moeglich.\n"), data[i].first); } // Nicht vergessen das Handle wieder frei zu geben! ::CloseHandle (handle); return 0; }
-
Ev. hast du doch den falschen Wert erwischt. Probier es einfach nochmal ein paar mal.
-
Hm Aber wenn ich im Spiel den Wert minimiere dann zeigt mir TSearch genau diesen Wert auch an, ist also immer Synchron. Naja ich probier noch bisschen rum.
-
Der dargestellte Wert hat selten etwas zu tun mit dem Wert der letztendlich für Berechnungen benutzt wird. Das können getrennte Werte sein, einer mit Offset oder was auch immer.
-
Fellhuhn schrieb:
Der dargestellte Wert hat selten etwas zu tun mit dem Wert der letztendlich für Berechnungen benutzt wird. Das können getrennte Werte sein, einer mit Offset oder was auch immer.
Nicht in Minesweeper.

-
Also die Adresse stimmt auf jeden Fall. Ich bekomme immer die gleiche. Habe einfach die Adresse genommen die mir TSearch gefunden hat. Müsst doch gehen oder? Oder muss ich da noch ein paar weitere Werte verändern?
Beim Autohack Window zb ein paar Werte auf nop stellen.
Kenne mich da allerdings nicht so aus...
-
so bin jetzt mal ins Autohack von TSearch rein und hab geschaut was er macht wenn ich geld ausgebe oder bekomme. Habe beide gefreezt und dann das Programm gestartet et voila: Ich habe 9999 dollar
und das tolle ist, dass diese sich nicht verändern wenn ich etwas ausgebe etc.Aber: Wie kann ich es jetzt in das Programm einbauen, dass ich nicht immer mit Tsearch hantieren muss?
Überall wo mir unten 90 Angezeigt wird die Adressen in das Array einbauen und diese Werte so wie es Tsearch Zeigt mir 90 versehen? wohl kaum.meinungen?
-
Wenn sie sich nicht verändern heißt dies, das das Programm (TSearch?) diese durchweg auf dem Wert hält und diese nicht nur einmal reinschreibt. Liegt da der Haken?
-
Also habe geschaut welche Adressen auf 90,also no operation gesetzt werden wenn ich das einschalte und habe diese Adressen einfach mal in meinem Programm so gesetzt. Allerdings schmiert mir bei Programmstart jetzt mein eigentliches Game ab... komisch eigentlich weils ja über Tsearch geht.
std::pair<::DWORD, int> data[] = { std::make_pair (0x686614, 999), // Geld std::make_pair (0x44FA8D, 90), // Geld std::make_pair (0x44FA8E, 90), // Geld std::make_pair (0x45A9B8, 90), // Geld std::make_pair (0x45A9B9, 90), // Geld std::make_pair (0x45A9BA, 90), // Geld std::make_pair (0x45A9BB, 90), // Geld std::make_pair (0x45A9BC, 90), // Geld std::make_pair (0x45A9BD, 90), // Geld };
-
Falls die "90" ein NOP sein soll, dann muß sie hexadezimal (0x90) geschrieben werden und WriteProcessMemory () darf da nur ein einziges Byte schreiben (also kein sizeof(sonstwas)).
-
Tatsache! Funktioniert einwandfrei!
Aber warum muss das nur ein Byte also 8 bit groß sein?PS: Merkwürdig auch dass ich bestimmte Wert mit Tsearch einfach nicht finden kann!!! zB mein Leben. Unauffindbar egal welchen Wertebereich ich durchsuche...
-
Ein Byte, weil "NOP" eben ein x86-Assembler-Befehl mit einem Byte ist.
Befehle "auszunoppen" ist aber eher schon etwas fortgeschrittenes cheaten/hacken, da sollte man schon ein wenig davon verstehen was man macht.Was "das Leben" angeht... die werden normalerweise, und wenn das Spiel nicht versucht sich gegen Cheater zu schützen, null-basiert oder eins-basiert abgespeichert. D.h. "2 Leben" kann als 1 oder 2 abgespeichert sein.
Und nicht jeder Wert muss ein DWORD sein. Wenn das Spiel die "Anzahl der Leben" als char speichert (was leicht möglich ist, man wird ja kaum mehr als 255 Leben brauchen), dann viel Spass beim Suchen. Denn du wirst vermutlich etliche Bytes finden die den passenden Wert haben.
-
OK vielen Dank für die Hilfe.
Das heißt wenn ich hundert leben habe dann kann es sein dass sie als 50 gespeichert werden?
-
Such die "Hundert Leben
" mal nicht als Integer (0x00000064), sondern als Float (0x42C80000).
(Genaueres bei wikipedia (o.ä) : Binäre Darstellung von Fließkommazahlen))