DetourCreateProcessWithDll(): Wie offset des Prozessspeichers herausfinden?
-
Hi!
Wenn ich mit DetourCreateProcessWithDll() einen Prozess starte, verschieben sich die Adressen um einen bestimmten Wert. zB. ein Wert, der normalerweise immer auf 0x00EB5420 liegt, liegt dann auf 0x00EB5420 + offset.
Wie bekomme ich dieses offset? Wie berechnet sich das? Ist es immer gleich?
-
Mist, es scheint sich mehr zu verschieben.
Eine Funktion, die vorher auf 0x0082E510 lag, liegt nun auf 0x0194E510, ein +offset.
Aber eine andere Funktion, die vorher auf 0x10041D00 lag, liegt nun auf 0x00641D00, also ein -offset.Wie soll ich denn da klar kommen?
-
Reverse Engineering.
-
Was willst du damit sagen?

Ich habe bereits viele Adressen von Funktionen und Variablen zusammengesucht. Mit Detours verschieben sich die Adressen; es muss doch eine Möglichkeit geben herauszufinden, was sich wohin verschiebt.
-

-
Ist doch einfach - hast Du vista/seven? Image base randomisation?
offset/*RVA*/ = RealAddress - RealImageBase; // 0x10041D00 - 0x10000000 = 0x41D00 address = CurrentImageBase/*HMODULE*/ + offset; // 0x600000 + 0x41D00 = 0x641D00
-
Windows XP.
Ohne spezielle Compilereinstellung gibt es auch keine image base randomization, oder? Also bleibt alles gleich zwischen den Betriebssystemen, hoffe ich?Und hast du gemerkt, dass ich von microsoft detours rede? Also einfach 0x10000000 abziehen geht schon mal nicht. Die offsets der eigentlichen Adressen sind nach dem erstellen des Prozesses mit DetourCreateProcessWithDll() verschieden. Eine Adresse rutscht nach vorne, die andre nach hinten...
-
Wenn die DLL eine Ladeadresse hat, die mit einem anderen Modul kollidier, dann wird die DLL an einen beliebigen freien Adressraum geladen.
Das Ergebnis ist also mehr oder weniger zufällig
wie bei ASLR!
-
Ah, sowas hab ich mir schon gedacht, aber ...
Detours Help schrieb:
DetourCreateProcessWithDll creates a new process with the specified DLL inserted into it.
The process is created in a suspended state with the CREATE_SUSPENDED flag to CreateProcess. Detours then modifies the image of the application binary in the new process to include the specified DLL as its first import. Execution in the process is then resumed. When execution resumes, the Windows process loader will first load the target DLL and then any other DLLs in the application's import table, before calling the application entry point.
DetourCreateProcessWithDll modifies the in-memory import table of the target PE binary program in the new process it creates. The updated import table will contain a reference to function ordinal #1 exported from the target DLL.
Note: The new process will fail to start if the target DLL does not contain a exported function with ordinal #1.
After the target DLL has been loaded, it can reverse changes to the in-memory import table by calling DetourRestoreAfterWith. To facilitate reversing these changes, DetourCreateProcessWithDll copies relevant reversal data into a payload in the target process using the DetourCopyPayloadToProcess API. The loaded DLL can then use the DetourRestoreAfterWith API to restores the contents of the import table.
Also sollte die DLL eigentlich an erster Stelle stehen. Somit sollten alle offsets im Plus sein.
Allerdings verwende ich dann noch die Funktion DetourRestoreAfterWith(), welche die Änderungen im Image rückgängig macht.
Liegt es vielleicht daran? Kann gerade nicht testen und bin mir auch nicht sicher, ob ich in jedem Fall DetourRestoreAfterWith() verwendet habe.
-
wo isses Problem? Einfach vorher schauen an welchem Offset die Funktion liegt. (addy-base=offset)
Dann holst du dir mit GetModuleHandle die Base für das entsprechende Modul und addierst den offset drauf.greetz KN4CK3R