Suche Helfer und Lehrer zur Bewältigung von Hobbyprojekt
-
rhino-du schrieb:
Ich habe mich da jetzt Tag und Nacht mit Cheat Engine durchgekämpft. Habe jetzt Werte aller Buttons die ich brauche und auch aller fader.
Was mich nun wundert ist das das Programm jedes mal andere Anfangs Adressen hat und immer die hinteren 4 Hex Werte bestehen bleiben zb. 0xXXXXCB60Guckst du hier:
ASLR.
Möglicherweise kannst du das für dein OS deaktivieren, dann hast du schon mal fixe Offsets. Auf der anderen Seite kannst du natürlich auch versuchen, die einzelnen Module der Anwendung zu identifizieren und die Offsets relativ zur Modulstartadresse bestimmen.
-
Gilt das ASLR nur ab Vista? Ich programmiere das ganze nämlich in Win7 und das Pult würde später auf WinXP laufen. Sprich da hätte ich das Problem dann nicht?
-
Hmm, das mit dem Midi kapiere ich immer noch nicht. Liegt wohl daran, dass ich davon (und Audio generell) sowieso null Ahnung habe.
Mach dir keine Gedanken um ASLR. Wenn sich die DLLs selbst nicht verändern, dann ist auch der Code immer an derselben Stelle (in der DLL). Lediglich die DLL Basisadressen können sich ändern, deshalb nimmt man offsets.
Also aktuelle Codeadresse minus aktueller Basisadresse ist der offset.
Wenn das Programm neu startet, einfach die Basisadresse der DLL holen (CreateToolhelp32Snapshot(TH32CS_SNAPMODULE...) plus dem offset ist dann wieder genau die Codestelle...
-
Ich versuche jetzt schon seit 2 Tagen mich irgendwie durch Examples und Tutorials zu lesen, aber ich komme mit den Adressen einfach nicht weiter.
Genau so wie mit Midi.
-
Zwei Zitate aus dem von dir verlinkten Thread
Chris schrieb:
Difficult to explain and no job for an evening. Finding the memory locations of the required informations took about half an year.
und
Bibi schrieb:
Since the adresses I’ve found for 6.615won’t work with 6.616, i’m affraid to have to do the process each time i’ll upgrade onpc
Und wenn das Programm nicht gerade globale Variablen für das ganze Zeug verwendet, dann gibt's sowieso keine fixen Adressen. D.h. man muss die Adressen über zwei, drei .... viele Zwischenschritte zusammenbasteln.
Nach dem Schema A = Read(Address1), B = Read(A + Offset1), C = Read(B + Offset2), .. .
Netterweise sagt einem aber keiner dass irgendwas nicht fix ist, und auf dem selben PC, unter ähnlichen Voraussetzungen, ergibt sich trotzdem immer die selbe Adresse. Bis sich eben eine andere ergibt.
-
Aber irgendwo muss dem Programm ja auch die Startadresse zugewiesen werden und das muss man ja irgendwo auslesen können oder?
-
Startadresse des Programms?
-
Halt ab da, wo die ganzen Adressen anfangen für das Programm. Damit ich dann nicht jedes mal die neue Adresse für das Programm im C Programm reinschreiben muss, damit ich werte auslesen und reinschreiben kann.
-
Tja, wie schon von @hustbaer erwähnt, kann das eine langwierige Geschichte sein, an gewisse Werte zu kommen (wenn das Programm zB. besonders viele (verkettete) Strukturen im dynamischen Speicher (Heap) anlegt).
-
rhino-du schrieb:
Halt ab da, wo die ganzen Adressen anfangen für das Programm. Damit ich dann nicht jedes mal die neue Adresse für das Programm im C Programm reinschreiben muss, damit ich werte auslesen und reinschreiben kann.
Meinst du quasi die Stackadresse der main-Funktion? Ja, die kann man irgendwie bekommen. Aber dir ist schon bewusst, dass typische Programme viele Daten nicht auf ihrem Stack speichern?
-
Cheat Engine sagt mir z.B. die Adresse für den 1. Wert den ich brauche:
gmaLib.dll+12B694
und für Wert 2:
gmaLib.dll+12B698also wird die Adresse in abhängigkeit von der Adresse der gmaLib.dll eigentlich immer gleich, also der Unterschied zwischen gmaLib.dll und dem 1./2. Wert.
Jetzt müsste ich dann nur die "Adresse" von der gmaLib.dll nach jedem Programm start neu abfragen und das ist das Problem was mich nicht weiter bringt.
-
rhino-du schrieb:
Jetzt müsste ich dann nur die "Adresse" von der gmaLib.dll nach jedem Programm start neu abfragen und das ist das Problem was mich nicht weiter bringt.
Gregson schrieb:
Wenn das Programm neu startet, einfach die Basisadresse der DLL holen (CreateToolhelp32Snapshot(TH32CS_SNAPMODULE...) plus dem offset ist dann wieder genau die Codestelle...
-
Ja danke! Jetzt hab ich, kriege nach jedem neustart die neue Adresse! Danke!
-
Ich stehe vor einem ähnlichen Problem.
kann mir jemand ein codebeispiel posten zum ermitteln des basepointers?
-
Es wurde doch bereits alles dazu gesagt... ?