Aus DLL eine Funktion der Anwendung aufrufen

Leider nicht sonst würde das ja alles kein Problem darstellen. Die Plugin API beinhaltet nur Funktionen die für das Scripten geeignet sind. Ich kann über diese meine Funktionen zwar auch umleiten aber das würde natürlich die Performance drücken.
 
Nun ich kann mittlerweile auch nicht mehr ganz folgen, von daher:

Also du hast irgendein Programm (.exe), zu welchem du ein Plugin/Addon in Form einer DLL schreiben möchtest.
Dazu ruft dieses Programm exportierte Funktionen deiner DLL auf, und ebenso stellt es eigene Funktionen für die DLL zur Verfügung, und von genau diesen Funktionen möchtest du jetzt wissen wie du sie aufrufen kannst ?

Wenn ich das so richtig begriffen habe, dann:

Muss das Programm (die .exe) ebenfalls jene Funktionen exportieren (ansonsten kommst du nicht ohne Assemblerkenntnisse weiter).
Was dir nun 2 Möglichkeiten verschafft:

1. Du greifst von deiner DLL aus genauso darauf zu wie umgekehrt:

C++:
typedef void (*functypedef)(int);

HMODULE hExe = GetModuleHandle(0);
functypedef hFunc = (functypedef)GetProcAddress(hExe, "name_der_funktion");

hFunc(123);

2. Dir wurde eine .lib Datei mit in die Wiege gelegt (oder .def, dann kannst du mittels VS Command Prompt "lib /DEF:datei.def" eine .lib erstellen).
Diese musst du dann deinem Projekt hinzufügen, damit dagegen gelinkt wird, entweder in den Projekteinstellungen, oder mittels:

#pragma comment(lib, "datei.lib")

Mit den entsprechenden Prototypen der Funktion(en) kannst du sie dann ganz normal wie gewohnt aufrufen.

Sollte dies auch kein Stückchen weiterhelfen, schlage ich vor du zeigst uns genau, was und womit du Probleme hast (ich rede von Code / Programmnamen, und nicht von weiteren vagen Problembeschreibungen), damit wir dir helfen können
 
Zuletzt bearbeitet:
Muss das Programm (die .exe) ebenfalls jene Funktionen exportieren (ansonsten kommst du nicht ohne Assemblerkenntnisse weiter).
Tut es aber nicht wie ich schon gesagt habe.

Also gibt es eine Plugin-API. Die Funktionen die du aufrufen möchtest sind aber nicht Teil dieser API, oder wie?
Leider nicht sonst würde das ja alles kein Problem darstellen.

Code:
int iVar = 1;
float teile(int a, int b) {
	return a / b;
}

int multipliziere(int a, int b) {
	return a * b;
}
void setzeVar(int a) {
	iVar = a;
}
int main(void) {
	while(1) {
		iVar = multipliziere(teile(223,3),iVar);
		Sleep(1000);
	}
}
Jetzt möchte ich setzeVar(); aus meiner DLL heraus aufrufen.
 
Ja dann wie gesagt, mir ist mit deinen Informationen kein anderer Weg bekannt als direkt über (inline)Assembler. Und natürlich muss du's erstmal schaffen, die Funktionen zu finden ;)
Da du die ganze Zeit keine Programmnamen oder überhaupt du nicht registriert bist, vermute ich nicht gerade die besten Absichten deinerseits, und werde dich daher nicht mit Links versorgen ...

Deine ganze Fragestellung kommt mir wie ein Euphemismus für Cracken vor ^^ Nach dem Motto "Hm wie komm ich möglicherweise, mit einer scheinbar harmlosen Problemstellung, an Informationen heran, die mir rote Hörner wachsen lassen"

MfG
 
Ja dann wie gesagt, mir ist mit deinen Informationen kein anderer Weg bekannt als direkt über (inline)Assembler.
Wenn man Funktionszeiger verwendet, kommt man auch ohne Assembler aus. Man muss nur die Signatur den Funktion (inkl. Aufrufkonvention) kennen.

Und natürlich muss du's erstmal schaffen, die Funktionen zu finden ;)
Das allerdings auf jeden Fall. Solange das Programm von sich aus die Adresse dieser Funktion nicht zur Verfügung stellt, brauchen wir überhaupt nicht weiter zu diskutieren.

Grüße,
Matthias
 
Das ist nicht wirklich so. Ich habe diverse bekannte Spiele zurückgespielt und bekomme selbst wohl kaum ein Programm in Assembler hin. Für solche Sachen braucht man nur Kenntnisse über den Basisaufbau eines Programmes nach dem Kompilieren, oder so gewisse syntaktische Konstrukte wie das Stackframe u.Ä. Aber auf jeden Fall ist inline-Assembler nicht nötig.
 
Klar kann man mit gewissen Spielereien mit Referenzen und Pointern sich den inlineAssembler in gewissen Fällen auch sparen.
Es geht ja nur darum, dass er herausfindet wo seine Funktion beginnt (und ggf. dessen Aufrufkonvention), er muss also das Programm debuggen ... woraufhin er dann Assembler können muss (da er den Sourcecode nicht hat), wo ich es für äußerst trivial hielt Sachen wie "den Basisaufbau eines Programmes nach dem Kompilieren" zu erwähnen ... Das Eine deckt doch das Andere ...

Und je nach Komplexität des Programms/des Gesuchtem kann es der Fall sein, dass er Backtracen übern Stack oder gar das Ausführen des Programms sich komplett schenken kann ...

Wenn jemand noch weiter OffTopic in die Assemblerstreitereien mit mir gehen möchte, dann bitte in PM ^^
 
Assemblerstreitereien? Das hat überhaupt nichts mit Streiterei zu tun, ich schreibe hier nur meine Erfahrungen auf. Und da kann ich ganz klar sagen: Assemblerkenntnisse sind nett, aber absolut optional. Die Assemblerkenntnisse bringt das statische Analystetool (bei mir IDA Pro) mit. Meine Aufgabe beschränkt sich darauf diese Sachen korrekt zu verknüpfen und für Reverse Engineering läuft praktisch alles über Ausgaben und Imports/Exports. Wie bereits erwähnt: Ich kann kein einziges Programm in Assembler schreiben, aber mit Reversen habe ich überhaupt keine Mühe ;).
 
Es sind in dem Sinne "Streitereien", weil wir nicht mehr auf die Problemstellung des Fragestellers eingehen, sondern einfach nur noch gegenseitig unsre Worte auf die Goldwaage legen in der Überzeugung wir würden mehr wissen als der Andere :p
 
Zurück