Konstanter Speicherplatz



  • Wieso willst du das unbedingt im Code festlegen wenn du es einfach in den Einstellungen einstellen kannst?



  • Na weil mich sowas interessiert und ich eigentlich interessiert daran bin alles möglichst unabhängig von irgendwas zu machen





  • 3P!CF41L schrieb:

    ... wenn das dazugehörige Opferprogramm immer an die selbe Stelle speichert

    Du willst also eigentlich von einem fremden Programm (fertiges Binary ohne Source) Werte auslesen oder wie?



  • Genau...sone Art Trainer soll das mal werden

    Dazu muss ich auch noch wissen, wie ich aus dem kompletten RAM werte auslesen kann.
    bzw, wie kann man denn rauskriegen wo ein Programm "xyz" die variable "var1" speichert?





  • Reverse Engineering !

    Wenn du zb soetwas hast:

    struct A
    {
       int a;
       int b;
    };
    
    struct B
    {
       float c;
       A* d;
       int e;
    }
    
    B* globalB = new B;
    

    Und du bist an dem Wert b in der Klasse A interessiert, dann kann es sein dass du zuerst die Addresse von globalB finden musst, 4 addieren + dereferenzieren, auf das Ergebnis nochmal 4 addieren und wieder dereferenzieren musst.

    Ein Beispiel was so aussehen könnte: Ein Spiel, globalB ist ein Zeiger der immer auf den den aktuellen Spieler zeigt, B ist eine Struktur die Spieler hält und in A stehen Informationen über den Status des Spielers, zb HP.



  • Ist es nicht so, dass das seit Windows 7 nicht mehr möglich ist?



  • Was soll nicht mehr möglich sein? Wenn man eine statische Adresse findet, nimmt man einfach die moduleBase + offset, und findet so immer den selben Wert.
    Findet man überhaupt keinen statischen Bezug, muss man sich an entsprechenden Stellen im Code "einklinken".

    Versuchs mal mit http://www.cheatengine.org



  • Das Problem ist die ASLR...



  • dot schrieb:

    Das Problem ist die ASLR...

    Das ist doch kein Problem. Es wird doch nur die Startadresse zufällig gewählt. Und die kann man abfragen. Der Offset zur eigentlichen Adresse bleibt gleich.



  • MisterX schrieb:

    dot schrieb:

    Das Problem ist die ASLR...

    Das ist doch kein Problem. Es wird doch nur die Startadresse zufällig gewählt. Und die kann man abfragen. Der Offset zur eigentlichen Adresse bleibt gleich.

    Ja, aber das ist eben etwas, was man berücksichtigen muss...



  • dot schrieb:

    MisterX schrieb:

    dot schrieb:

    Das Problem ist die ASLR...

    Das ist doch kein Problem. Es wird doch nur die Startadresse zufällig gewählt. Und die kann man abfragen. Der Offset zur eigentlichen Adresse bleibt gleich.

    Ja, aber das ist eben etwas, was man berücksichtigen muss...

    Stimmt, aber das ist sein geringstes Problem glaube ich 😃 Vor allem weil 90% der Programme immer bei 0x400000 anfangen.

    BaseAddress + Offset zeigt auf nen Pointer.
    Pointer dereferenzieren + Offset zeigt auf den Wert den du willst.

    Danach kannst du dich richten. 🙂



  • dot schrieb:

    Das Problem ist die ASLR...

    Die man sowohl systemweit als auch in der Executable selbst abstellen kann. System weit würde per Registry gehen, ist aber ein Sicherheitsproblem. Den Flag in der Exe entfernen ist kein Problem, einfach nen PE-Editor nehmen.
    Obwohl es wirklich nicht zuviel verlange ist, am Anfang die Module-Liste mit den tlhelp32 Funktionen zu lesen, sich die Addresse des Hauptmodules zu merken und darauf Offsets zu addieren.



  • Ja, das ist alles richtig. Das ändert aber nix dran dass das Problem des Threaderstellers die ASLR ist/war. Und genau das hab ich gesagt 😉



  • Nachdem ich nach ein paar Tutorials geguckt habe bin ich auch auf ein brauchbares gestoßen. Ich scheitere aber nach wenigen Zeilen. Der Tutor^^ verwendet einen Dateityp namens "Window" und bei mir gibts den nicht. . .In welcher header-Datei findet man den denn?



  • Das solltest du den Tutor fragen...



  • 3P!CF41L schrieb:

    einen Dateityp namens "Window"

    lass mich raten: die zugehörige Variable heißt HWND 🤡



  • [quote="Patrickssj6"]

    dot schrieb:

    Stimmt, aber das ist sein geringstes Problem glaube ich 😃 Vor allem weil 90% der Programme immer bei 0x400000 anfangen.

    glauben ist nicht wissen



  • Bei 3P!CF41L ist wohl der Name Programm 🤡 ...

    Wie schon der yxMan meinte, ist es wohl eher eine Variable mit Namen hWindow , und zwar vom Typ HWND . Was das ist, kann ich gerne erklären:

    Mit Windows kann man arbeiten. Man kann sogar einigermaßen gut mit Windows arbeiten. Aber man weiß nicht, wie das System in seinem Innersten funktioniert, weil der Quellcode unter Verschluss steht. Mit der API des Systems kann man tolle Sachen machen, aber auch hier stößt man manchmal auf Grenzen, die sich "Handles" nennen. Hierbei handelt es sich um Zeiger auf Speicher - um Werte ... ähhh, ungefähr so, die Implementierung dieser Typen ist nicht offen, die behält Microsoft für sich. Wenn du dir die Definition dieser Typen anschaust, stolperst du über den Wert "unused", was einfach nur heißt, dass du nicht wissen sollst, was wirklich hinter dem Objekt steckt. Du kannst dich allerdings darauf verlassen, dass, wenn du Funktionen der API, welche diese verschlossenen Objekte verwenden, aufrufst, diese das Objekt ordentlich behandeln werden.

    Es gibt mehrere Handle-Typen, und manchmal verschwimmen die Grenzen zueinander auch. HANDLE steht für Datei-Handles, Heap-Handles und Konsolenhandles, diese sind von der Definition und dem Typ her gleich und können in bestimmten Kontexten ausgewechselt werden. HWND steht für Handle for Windows, HCURSOR ist ein Handle auf einen Cursor, HDC einer auf einen Device Context usw ...


Anmelden zum Antworten