Hi Leute,
ich möchte gerne die Speicher-Adresse einer Funktion im einem Prozess finden. Die Funktion ist dabei jedoch nicht eine Funktion aus einer importierten
DLL, sondern eine Prozesseigene Funktion.
Hier ein Beispiel an einer Probeprocedure.
Part I
Delphi-Quellcode:
procedure Box(text:string);
begin
Showmessage(text);
end;
z.B. wird dies in einem Programme verwendet.
Part II
Delphi-Quellcode:
type
TBox = procedure(text:string);
var
pBox : TBox;
procedure TForm1.FormCreate(Sender: TObject);
begin
@pBox = x;
end;
Mein Ziel ist es die Speicheradresse X herauszufinden
Folgende Schwierigkeit stellt sich jedoch bei diesem Unterfangen.
1. Ich habe nicht den Quellcode der EXE in der die Procedure Box deklariert ist.
2. Die EXE selbst ist mit einer Art EXE-Packer überzogen, sodass das man durch
disassamblern auch nicht viel weiter kommt.
Ich injektiere dem Zielprozess eine eigene
DLL. In dieser
DLL steht ein Code ähnlich dem aus Part II. Ich befinde mich also mit der
DLL im Prozessspeicherraum der Anwendung.
Mein Ziel ist es nun, diese eine spezielle Funktion selbst aufzurufen, dafür ist es dringend nötig ihre Position heraus zu finden.
Da ich keine Anhaltspunkt habe wo ich suchen muss, ist das ganze etwas schwierig.
Fragen:
1. Fallen euch irgendwelche Techniken ein?
2. Gibt es eine Debug-Tool welches mir dabei helfen könnte?
3. Wenn es mir gelingen würde den EXE-Packer zu entfernen und die Original EXE zu extrahieren, gäbe es dann eine Art Zentralverzeichnis(Table, etc. ) in der EXE dem alle Funktionen nummeriert mit ihren Adressen stehen?
4. Wenn ja wie finde ich diesen
5. Ich kann den Prozess dazubringen die gesuchte Funktion auszuführen, gibt es ein Tool das die gerade ausgeführten Codeabschnitte lokalisieren kann?
Um vielleicht noch etwas Klarheit in die Sache zu bringen, es handlet sich dabei um eine Art Console. In diese werden Kommandos eingegeben und der Prozess reagiert auf diese. Ich möchte in diese Console gerne Informationen(eigene Ausgabezeilen) hinzufügen, die nichts mit dem eigentlich Prozess zutun haben. Ein Externes Programm lagert Informationen in einer Textdatei aus. Die
DLL soll die Funktion "WriteToConsole" aufrufen können und in bestimmten Zeitabständen die Informationen aus der Datei in die besagte Console schreiben.
Dazu ist es halt notwendig die interne SpeicherAdresse dieser Funktion zu wissen.
PS: Bitte schreibt mir, wenn ich an eingigen Stellen mein Problem unverstänbdlch beschrieben habe. Beschreiben war noch nie eine meiner großen Stärken
Bin für jede Hilfe Dankbar
Mit freundlichen Grüßen
Tobi