External Function Call?

...komplette Frage anzeigen

1 Antwort

Aufgrund des Stichwortes "DLL-Injection" gehe ich davon aus, dass es um Programmierung unter Windows geht. Dort ist eine "DLL" prinzipiell das gleiche wie ein "Programm" alias "EXE". Nur der Startcode unterscheidet sich in beiden geringfügig. Die Verkopplung der Adressierung von Funktionen und Daten zwischen den Dingern ist völlig gleich.

Ob Du also eine Funktion in einem "Programm" oder einer "DLL" aufrufen willst, ist wurscht.

Ein wenig irritierend wirkt, dass Du von einer "Adresse 0x??????" schreibst... Eine Funktion in einem externen Modul (egal ob DLL oder EXE) spricht man, solange man eine Hochsprache verwendet, immer mit dem vom Programmierer vergebenen Namen an. Zum Funktionsaufruf gehört nicht nur, den Befehlszeiger der CPU auf den Einsprung-Punkt der Funktion zu setzen, sondern auch, einen sogenannten "Stackframe" zu erzeugen, bei dem eine Reihe von Daten in genau festgelegtem Format und Reihenfolge auf den "Stack" abgelegt werden müssen, bevor der Funktionseinsprung erfolgt. Das alles willst Du nicht von Hand erledigen. Das macht man nicht mal, wenn man Assembler programmiert.

Was Du wollen wirst, ist, die Funktion in Deiner Hochsprache aufzurufen. Und da macht man das mit genau nichts anderem als ihrem Namen.

Damit der Compiler oder Interpreter der Hochsprache diesen Funktionsnamen den ganzen eben erklärten Details zuordnen und diese ganze Arbeit für Dich erledigen kann, muss ihm natürlich mitgeteilt werden, wenn man eine Funktion in einem externen Modul aufrufen will. Auch dieses Mitteilen übernehmen in der Hochsprache mitgelieferte Werkzeuge. In C++ lässt Du "Header" des externen Moduls includen, die genau nichts anderes machen, als dessen Einsprungpunkte erstmal zu "deklarieren". In den Deklarationen steht alles drin, was zum Erzeugen des richtigen "Stackframes" notwendig ist. Damit nach dem Laden des Programms und des externen Moduls an eine x-beliebige Stelle im Arbeitsspeicher (die Du definitiv nicht beeinflussen kannst, solange Du nicht schwerere Hacking-Geschütze auffährst) die Aufrufe dann auch an die richtige Adresse gehen, kümmert sich der Programm-Lader des Betriebssystems darum, dass nach dem Laden eines Moduls (wurscht, ob DLL oder EXE) sämtliche Aufrufpunkte in den Modulen auf die aktuell gültigen Adressen der zugehörigen Eintrittspunkte gesetzt werden. Dies wird in Tabellen im Programmcode festgehalten.

Wenn diese Antwort nicht treffen sollte, müsste mal mehr Hintergrundinformation her.Bisher gehe ich davon aus, dass Dereta sich in C++ einarbeitet und dort dabei ist, Module kombinieren zu wollen. Und auch dort gerade beim Einarbeiten in die Grundprinzipien ist.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Dereta
25.07.2016, 10:32

Habe ich es wohl etwas falsch erklärt.

Ich besitze nicht den Sourcecode von Spiel X! Sondern ledeglich die Adresse der Funktion. Diese habe ich über Cheat Engine ausfindig gemacht.

Ich habe Spiel X. Dort gibt es die Funktion Y. Mit der Funktion Y bewegt sich der Spieler fort. Die Richtung wird über einen Paramter festgelegt. 

Nun möchte ich einen "Bot"/Externes Programm schreiben mit dem ich die Funktion Y vom Spiel X aufrufen kann. Das ganze soll ohne DLL Injection geschehen :) Ich hoffe es ist nun verständlicher. Bei dem Spiel handelt es sich in diesem fall um Anno 1602.

Grüße

0

Was möchtest Du wissen?