Wert einer bestimmten Speicheradresse ändern
-
Dabei geht es doch um das Patchen von Programmdateien. Ich glaube nicht dass matt_9908 das machen möchte. Ich glaube eher er will bestimmte Speicherstellen in einem laufenden Programm ändern.
@matt_9908
Dafür verwendet man unter Windows z.B.WriteProcessMemory.
Vielleicht hilft dir das Stichwort ja, ich schätze damit solltest du brauchbare Anleitungen ergoogeln können.
-
hustbaer schrieb:
@matt_9908
Dafür verwendet man unter Windows z.B.WriteProcessMemory.
Vielleicht hilft dir das Stichwort ja, ich schätze damit solltest du brauchbare Anleitungen ergoogeln können.Danke sehr das sieht schonmal ziemlich vielversprechend aus!

Ich werds heut abend oder morgen mal damit versuchen und sagen ob es klappt!

-
Diese Antwort war ein Versehen! Bitte ignorieren! 
.I
\/Ja ich würde gerne Werte von anderen Programmen überschreiben.
Also so funktioniert es schonmal nicht... Ok...
Gibt es da vielleicht noch andere Möglichkeiten um sowas umzusetzen oder wäre das ganze dann schon zu fortgeschritten für einen Anfänger??
-
Vielleicht solltest du mal genau beschreiben was überhaupt dein Ziel ist. Vermutlich willst du von einem bestimmten Programm Daten überschreiben um was auch immer zu erreichen. WriteProcessMemory scheint ja schon die richtige Funktion zu sein. Vermutlich hast du sie nur nicht richtig benutzt.
-
Eine andere Möglichkeit wäre Cheat Engine. Ich gehe mal davon aus, dass du so etwas in limitiertem Umfang schreiben möchtest. Allerdings wird das wohl etwas zu fortgeschritten für dich sein, wenn du fragen musst, wie so etwas prinzipiell funktioniert.
-
sebi707 schrieb:
Vielleicht solltest du mal genau beschreiben was überhaupt dein Ziel ist. Vermutlich willst du von einem bestimmten Programm Daten überschreiben um was auch immer zu erreichen. WriteProcessMemory scheint ja schon die richtige Funktion zu sein. Vermutlich hast du sie nur nicht richtig benutzt.
Ich habe es mit der Funktion noch gar nicht ausprobiert wie kann ich sie dann falsch verwendet haben?

-
matt_9908 schrieb:
Ich habe es mit der Funktion noch gar nicht ausprobiert wie kann ich sie dann falsch verwendet haben?

Dann solltest du es mal damit versuchen (Hinweis: dein Programm wird dafür ziemlich sicher mit Admin-Rechten ausgeführt werden müssen).
Möglicherweise wird es aber auch schnell etwas komplizierter, als du dir das anfangs vorgestellt hast.
Ich würde dir allerdings erst einmal empfehlen, dich ein wenig in Virtuelle Speicherverwaltung einzulesen, damit klar wird, warum genau dein erster Ansatz nicht funktioniert,
und du eine Idee davon bekommst, auf was du da eigentlich mitWriteProcessMemoryund verwandten Funktionen zugreifst.Gruss,
Finnegan
-
Ich hab gerade mal etwas experimentiert weil ich sowas bisher auch noch nicht gemacht habe. Mit Read/WriteProcessMemory ist das aber ziemlich einfach. Das komplizierteste ist noch den richtigen Prozess zu finden.
Der Code für das Zielprogramm target.exe (am besten ohne Optimierungen compilieren da sonst wohlmöglich der Wert von data in einem Register gespeichert bleibt):
#include <iostream> int main() { int data = 12345; std::cout << "Address: " << &data << std::endl; while(true) { std::cout << data << std::endl; std::cin.get(); } }Und das Programm zum auslesen und ändern der Daten:
#include <windows.h> #include <tlhelp32.h> #include <iostream> using namespace std; HANDLE findProcess(const char* name) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if(Process32First(snapshot, &entry) == TRUE) { while(Process32Next(snapshot, &entry) == TRUE) { if(_stricmp(entry.szExeFile, name) == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); CloseHandle(snapshot); return hProcess; } } } CloseHandle(snapshot); return nullptr; } int main() { HANDLE hProcess = findProcess("target.exe"); if(!hProcess) { cout << "Cannot find process" << endl; return EXIT_FAILURE; } // Read address size_t addr; cout << "Address: "; cin >> hex >> addr; // Read value int data; ReadProcessMemory(hProcess, reinterpret_cast<void*>(addr), &data, 4, nullptr); cout << data << endl; // Write data while(true) { cout << "Write data: "; cin >> dec >> data; WriteProcessMemory(hProcess, reinterpret_cast<void*>(addr), &data, 4, nullptr); } CloseHandle(hProcess); return 0; }Vorgehensweise: target.exe starten welches dann die Adresse ausgibt an der ein int gespeichert ist. Das zweite Programm starten und dort die vom Target ausgegebene Adresse eintippen.
-
@sebi707
Jo, das ist der einfache Teil
Der schwierige Teil ist rauszubekommen welche Adressen man mit welchen Werten überschreiben sollte.
-
matt_9908 schrieb:
Ja ich würde gerne Werte von anderen Programmen überschreiben.
Also so funktioniert es schonmal nicht... Ok...
Gibt es da vielleicht noch andere Möglichkeiten um sowas umzusetzen oder wäre das ganze dann schon zu fortgeschritten für einen Anfänger??
Das hier habe ich, wie auch immer das passieren konnte, versehentlich abgeschickt und es irgendwie nicht gemerkt (Habe übers Handy geantwortet und war in Eile...) also bitte ignoriert diesen Beitrag und entschuldigt bitte meine abgrundtiefe Dummheit

Naja zurück zum Thema:
Der Code von sebi707 war genau das, was ich brauchte und er funktioniert auch hervorragend! Die Funktion findProcess verstehe ich ehrlich gesagt nicht wirklich, aber ich denke, dass das einfach an meinen mangelnder Erfahrung und Programmierkenntnis liegt... (Keine Sorge das hol ich noch nach
)Aber das war eigentlich schon alles was ich wissen wollte! Danke sehr an alle, die sich hier die Zeit genommen haben mir zu helfen!
