Adresse eines Wertes herausbekommen



  • Hallo,
    ich wollte ein Programm schreiben, welches Werte in einem Java-Programm verändert. Das Problem ist das die Adressen immer andere sind. Deswegen möchte ich die Adressen mithilfe der Werte suchen, wie bei CheatEngine, jedoch mit dem Programm. Gibt es Möglichkeiten das in C++ zu machen?



  • Ja.
    Allerdings gerade bei Java nicht empfehlenswert, wegen GC.



  • @Mechanics wie heißt die Funktion bzw. wie geht das



  • Das hängt vom Betriebssystem und nicht von C++ ab.
    Unter Windows kann man mit ReadProcessMemory auf den Speicher anderer Prozesse zugreifen, den Speicher kann man dann entsprechend durchsuchen. Davor brauchst du wahrscheinlich QueryVirtualMemory oder so, ist jetzt schon lange her.



  • @Mechanics soweit ich das jetzt verstanden habe, braucht man für ReadProcessMemory die Adresse wo der Wert gespeichert ist. Ich möchte aber die Adresse mithilfe der Werte ermitteln geht das (win 10)?



  • @luis Ja, das geht. Aber nicht vorgefertigt, da musst du einiges dafür programmieren.
    Was zu tun wäre:

    • Erstmal den passenden Prozess finden und ein Handle darauf öffnen
    • Die Speicherbereiche ermitteln die der Prozess verwendet
    • Jeden Speicherbereich durchgehen und Stückweise mit ReadProcessMemory lesen
    • In den gelesenen Stücken nach deinem Wert suchen

    Jetzt wirst du nur dummerweise tausende Stellen finden wo der Wert steht. Und da sich die Adresse wie du schon richtig erkannt hast bei Java jederzeit ändern kann... wird das so wohl nix werden.
    (Bzw. falls dir das nicht klar ist: Bei Java ist die Adresse nicht bloss bei jedem Programmstart anders. Die ändert sich auch während das Programm läuft!)

    Such dir ein einfacheres Projekt. Oder such dir fertige Tools die das können (falls es sowas gibt).



  • Was man dazu braucht, ist nicht eine Adresse sondern eine Verkettung von Adressen und Offsets. Was man macht ist quasi (Programmanfang+Offset0) als Adresse1 interpretieren. Da (Adresse1+Offset1) als Adresse usw. und nach n Schritten ist Adresse n dann die Adresse von deinem Wert.

    Es gibt Tools, die diese Offsets ermitteln, bzw. dabei helfen. Eine Anwendung dafür sind Livesplit Autosplitters: https://github.com/LiveSplit/LiveSplit/blob/master/Documentation/Auto-Splitters.md


  • Mod

    Da du noch nicht klar gesagt hast, dass es sich um einen Cheat handeln soll (sondern nur so etwas wie CheatEngine, die du kennst und für Cheats ja nehmen könntest): Wenn das Java-Programm kooperativ ist, dann ist das ganz einfach. Weil es beispielsweise von dir geschrieben ist. Andererseits gibt es auch weitaus einfachere Möglichkeiten, Programme kooperieren zu lassen. Oder anders gefragt: Was genau und warum hast du vor?



  • Mein Tip: Er will in Minecraft cheaten 🙂



  • Und noch was anderes, da bin ich gestern spontan nicht draufgekommen... Da es Java ist, hättest du auch andere Möglichkeiten. Da kann man recht viel reverse engineeren, das geht wieder meist einfacher, als bei C++ Programmen. Und dann könntest du z.B. eigenen Java Code injecten, der über Reflection mit dem restlichen Programm interagiert.
    Aber alles ein Haufen Aufwand natürlich.



  • Man kann auch einen "agent" reinhängen: https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html
    Damit kann man auch alle möglichen Schweinereien anstellen.



  • Genau, sowas hatte ich im Sinn. Aber das ist schon etwas fortgeschritten.



  • Das ist sehr fortgeschritten, weswegen ich es auch nicht erwähnt habe.


Log in to reply