Pointer nach Update

03/09/2014 18:59 derrod#1
Hey Leute,
gibt es eine Möglichkeit, die pointer nach einem update nicht immer wieder neu suchen zu müssen?
Gruß Derrod
03/09/2014 19:11 Mostey#2
Codecave setzen und die Base darüber auslesen. Die Offsets bleiben ja in der Regel über einen längeren Zeitraum gleich und verschieben sich dann auch meistens nur um ein paar Byte wenn Änderungen an dieser spezifischen Stelle vorgenommen werden.
03/09/2014 19:16 Jeoni#3
Die Antwort darauf ist ganz klar jein.
Bei größeren Updates, bei denen sich viel ändert, kommt man um das Neufinden der Daten (u.a. Pointer) nicht herum. Um gegen kleinere Updates zu bestehen, können Techniken, wie ein Patternscan, um nach den Daten, oder nach Code, der direkt auf die Daten (bspw. einen statischen Pointer) zugreift, zu suchen, helfen (entschuldige die Satzstruktur). Oder, wenn du beispielsweise weißt, das irgendetwas wichtiges durch eine öffentliche Funktion (bspw. von der WinApi) geht, kannst du diese hooken / breakpointen, um an dein Zeug zu kommen. Gegebenenfalls kannst du auch Code des Ziels hooken, aber der wird sich vermutlich durch ein update eher verändern.
Eine 100%ig sichere Variante gibt es nicht.
Mit freundlichen Grüßen
Jeoni

/Edit: Mostey war schneller.
03/09/2014 19:21 derrod#4
Quote:
Originally Posted by Mostey View Post
Codecave setzen und die Base darüber auslesen. Die Offsets bleiben ja in der Regel über einen längeren Zeitraum gleich und verschieben sich dann auch meistens nur um ein paar Byte wenn Änderungen an dieser spezifischen Stelle vorgenommen werden.
Aber die Base wurde doch durch das update geändert, wie kann ich die dann auslesen?
03/09/2014 19:42 th0rex#5
Mhm ein update ändert gewöhnlicher weise nicht die base. Entweder ändert sich die base bei jedem start oder garnicht. Nutz einfach patterns. Hat Jeoni dir ja auch schon geraten.
03/09/2014 21:13 Mostey#6
Quote:
Originally Posted by derrod View Post
Aber die Base wurde doch durch das update geändert, wie kann ich die dann auslesen?
Schau dir mal an, was eine Codecave ist. Du leitest den Code in eine von dir deklarierte (und definierte) Funktion um, die über Inline Assembler den Inhalt eines Registers in eine von dir definierte Variable schiebt um die Adresse der Base zu erhalten. Der Vorteil daran ist, das du hier nicht mit statischen Adressen und Offsets arbeiten musst.

Irgendwo wird deine Base ja verwendet, da setzt du deine Codecave einfach rein. :)

Und diese Stelle kann übrigens mit einem Pattern Scan (Bytescan, Opcodescan) sinnvoll aufgesucht werden. So lange man in dieser Region den Code nicht ändert, bleibt die nämlich immer gleich.

Quote:
Originally Posted by omitma View Post
Mhm ein update ändert gewöhnlicher weise nicht die base. Entweder ändert sich die base bei jedem start oder garnicht. Nutz einfach patterns. Hat Jeoni dir ja auch schon geraten.
Doch, die kann sich auch mal schnell ändern. Statische Adressen ändern sich nach dem kompilieren.
03/10/2014 17:09 MrSm!th#7
^Zumindest, wenn sich ihre Position im Code ändert, z.B. weil neue Variablen hinzugekommen sind.
03/10/2014 17:12 Tyrar#8
Dennoch ist die Baseaddress Linkerabhängig bzw. wird die vom Linker festgelegt.
Ich gehe nicht davon aus, dass jedes mal, wenn der kram gelinkt wird auch eine andere Imagebase angegeben wird.
Um an die Imagebase zu kommen nutzt man GetModuleHandleA/GetModuleHandleW aus der WinAPI und übergibt dieser entweder einen nullptr (um an die Executable zu kommen) oder eben den jeweiligen Namen des Moduls.

@Schmitt: warum bist du einfach so schneller? :<
Dürfte der teil nicht nur relevant sein, wenn man wirklich den Anfang einer Funktion sucht und nicht nur einen Teil innerhalb einer Funktion?
03/10/2014 20:03 MrSm!th#9
Quote:
Dürfte der teil nicht nur relevant sein, wenn man wirklich den Anfang einer Funktion sucht und nicht nur einen Teil innerhalb einer Funktion?
Das bezog sich eher auf globale und statische Variablen.