DLL Plugin Architektur - wie?
DLL Plugin Architektur - wie?
Ich schreibe zur Zeit an einer Game (Engine) Lib in PureBasic und ich muss mir langsam mal Gedanken machen, wie diese später benutzbar sein soll. Prinzipiell habe ich da 3 Ideen:
- Scriptsprache: einbau eines Scriptsprachen Interpreters
- als DLL: die Lib einfach als DLL kompilieren
- Exe mit DLL Plugin Interface: das soll so funktionieren, dass das Spiel an sich als DLL programmiert wird und die Engine als ausführbare Datei vorliegt
Nummer 1 wird fast nicht kommen, da ich es selber ätzend finde, wenn mich eine Lib nicht in der Sprache programmieren lässt, die ich will. Nummer 2 ist zwar sehr flexibel, allerdings schliesst die Lib unter anderem Netzwerk und Ressourcen Funktionen ein, die dann natürlich leicht gecracked werden können. Da würde mir die letzte Lösung eigentlich am besten gefallen, nur fehlt mir da auch nur der leiseste Ansatzpunkt. Die Engine soll praktisch aus einer DLL heraus steuerbar sein, aber ob sowas überhaupt geht (also prinzipiell sicherlich, nur in dem Außmaß) weiß ich nicht. Kennt sich jmd vllt schon mit sowas aus oder hat eine Idee?
- Scriptsprache: einbau eines Scriptsprachen Interpreters
- als DLL: die Lib einfach als DLL kompilieren
- Exe mit DLL Plugin Interface: das soll so funktionieren, dass das Spiel an sich als DLL programmiert wird und die Engine als ausführbare Datei vorliegt
Nummer 1 wird fast nicht kommen, da ich es selber ätzend finde, wenn mich eine Lib nicht in der Sprache programmieren lässt, die ich will. Nummer 2 ist zwar sehr flexibel, allerdings schliesst die Lib unter anderem Netzwerk und Ressourcen Funktionen ein, die dann natürlich leicht gecracked werden können. Da würde mir die letzte Lösung eigentlich am besten gefallen, nur fehlt mir da auch nur der leiseste Ansatzpunkt. Die Engine soll praktisch aus einer DLL heraus steuerbar sein, aber ob sowas überhaupt geht (also prinzipiell sicherlich, nur in dem Außmaß) weiß ich nicht. Kennt sich jmd vllt schon mit sowas aus oder hat eine Idee?
Ich frag mich gerade, was der Vorteil von deinem 3. Punkt sein soll. Eine
DLL ist ja eigentlich nichts anderes als eine EXE-Datei, nur mit dem
unterschied, das eine DLL nicht direkt ausgeführt werden kann. Wo soll
also das cracken schwerer oder leichter werden?
Deinen 1. Punkt kann ich erlich gesagt auch nicht ganz nachvollziehen.
Du meinst sicher so was wie bei GameMakern üblich, die liefern ja die
nötigen Engines und den rest kann man sich mit einer Scriptsprache
zusammen schustern, aber die Geschwindigkeit ist ja schon mal total
unbrauchbar. Dazu noch der ganze Aufwand, der noch betrieben werden
müsste, damit der Befehlsumfang auch brauchbar wird.
Ich weis ja nicht, was deine Game-Engine alles beinhaltet, aber wirklich
brauchbar wäre doch nur die DLL. Eine Scriptsprache könntest du
zusätzlich einführen, sofern sinnvoll, um deine Engine noch dynamischer
oder einfacher in der benutzung zu machen. Z.B. fals komplexere
Einstellungen nötig/ möglich sind, wo eine statische Prozedur nicht mehr
reicht.
MFG PMV
DLL ist ja eigentlich nichts anderes als eine EXE-Datei, nur mit dem
unterschied, das eine DLL nicht direkt ausgeführt werden kann. Wo soll
also das cracken schwerer oder leichter werden?
Deinen 1. Punkt kann ich erlich gesagt auch nicht ganz nachvollziehen.
Du meinst sicher so was wie bei GameMakern üblich, die liefern ja die
nötigen Engines und den rest kann man sich mit einer Scriptsprache
zusammen schustern, aber die Geschwindigkeit ist ja schon mal total
unbrauchbar. Dazu noch der ganze Aufwand, der noch betrieben werden
müsste, damit der Befehlsumfang auch brauchbar wird.
Ich weis ja nicht, was deine Game-Engine alles beinhaltet, aber wirklich
brauchbar wäre doch nur die DLL. Eine Scriptsprache könntest du
zusätzlich einführen, sofern sinnvoll, um deine Engine noch dynamischer
oder einfacher in der benutzung zu machen. Z.B. fals komplexere
Einstellungen nötig/ möglich sind, wo eine statische Prozedur nicht mehr
reicht.
MFG PMV
Scriptsprachen werden oft bei Game Engines benutzt, um die Logik hinter dem Spiel zu umschreiben. Das sind keine besonders zeitkritischen Sachen. Mir geht es hier um die Flexibilität (ich z.B. kann Lua nicht viel abgewinnen).
Und der Vorteil von Punkt 3 wäre, dass ich dem Anwender eine feste Schiene vorgeben könnte und er sich nicht darüber Gedanken machen muss, wann denn nun welche Funktion auszuführen ist. Die Quake 3 Engine wurde - gaube ich - so benutzt. Nur wie ich das bei meiner Lib anfangen will weiß ich nicht.
Und der Vorteil von Punkt 3 wäre, dass ich dem Anwender eine feste Schiene vorgeben könnte und er sich nicht darüber Gedanken machen muss, wann denn nun welche Funktion auszuführen ist. Die Quake 3 Engine wurde - gaube ich - so benutzt. Nur wie ich das bei meiner Lib anfangen will weiß ich nicht.
Es ist machbar. Man kann auch innerhalb von Exen ProcedureDlls erstellen (damit diese öffentlich gemacht werden).
Da aber die Adressen der Prozeduren nicht so einfach aus der dll heraus ermittelt werden können (soweit ich weiß) muß beim einbinden der dll das Programm der dll die Adressen der Prozeduren übergeben.
Über diese im Programm definierten Prozeduren kann die dll praktisch alles machen was auch das Program machen kann.
Das Risiko dabei ist natürlich, das auch Schädlinge dabei Zugriff auf diese Programmfunkionen erhalten können so daß es sich empfielt, Sicherungsmaßnahmen einzubauen, etwa in der Form, das beim Einbinden die dll auf Echtheit überprüft wird und die Adressen der Funkionen nur erhält, wenn die Prüfung bestanden wurde.
Da aber die Adressen der Prozeduren nicht so einfach aus der dll heraus ermittelt werden können (soweit ich weiß) muß beim einbinden der dll das Programm der dll die Adressen der Prozeduren übergeben.
Über diese im Programm definierten Prozeduren kann die dll praktisch alles machen was auch das Program machen kann.
Das Risiko dabei ist natürlich, das auch Schädlinge dabei Zugriff auf diese Programmfunkionen erhalten können so daß es sich empfielt, Sicherungsmaßnahmen einzubauen, etwa in der Form, das beim Einbinden die dll auf Echtheit überprüft wird und die Adressen der Funkionen nur erhält, wenn die Prüfung bestanden wurde.
Ob das den Aufwand wert ist? Muss ich mir überlegen, ich denke viele würden auch mit einer DLL und den zugehörigen Funktionen gut zu Recht kommen. Da die Lib quasi Freeware werden soll (evtl. will ich versuchen, per "Support-Abo" ein bisschen was daran zu verdienen) hab ich jetzt auch nichts dagegen, wenn Hinz und Kunz die DLL durch den PE Explorer jagen 

Naja, sagen wir mal da gibt es so eine FTP DLL.Ich frag mich gerade, was der Vorteil von deinem 3. Punkt sein soll. Eine
DLL ist ja eigentlich nichts anderes als eine EXE-Datei, nur mit dem
unterschied, das eine DLL nicht direkt ausgeführt werden kann. Wo soll
also das cracken schwerer oder leichter werden?
Sie beinhaltet eine Funktion namens "FTP_Connect(IP.s,Name.s,Password.s,..)".
Nun bräuchte da nur so ein kleiner Spinner vorbeizukommen und die DLL neuzuschreiben, bei der die Funktion die IP, den Namen und das Password etc. anzeigt. Schon hat man verschissen.
Eine gute Möglichkeit wäre hier, die MD5-Checksumme der DLL zu prüfen.
Und wenn die EXE diese Funktion hat ... ist es genau so schwer ... oder
einfach, wie man will
... und Prozeduren in EXEn müssen
eigentlich kein "ProzedureDLL" sein, es reicht "Prozedure" da hier im
gegensatz zu einer DLL die öffentlichen Prozeduren ja eh nicht über
Funktionen ausgelesen werden können und wo eine aufzurufende
Prozedur im speicher steht ist ja wurscht
...
Also ich kann mir Punkt 3 nicht wirklich vorstellen, wie das so umgesetzt
werden könnte, so dass es dennoch für alle Ideen genutzt werden könnte.
Aber wenn das wirklich funktioniert, und du hast als Zielgruppe eher die
Anfänger, dann wäre dies wohl die besste.
MFG PMV
einfach, wie man will

eigentlich kein "ProzedureDLL" sein, es reicht "Prozedure" da hier im
gegensatz zu einer DLL die öffentlichen Prozeduren ja eh nicht über
Funktionen ausgelesen werden können und wo eine aufzurufende
Prozedur im speicher steht ist ja wurscht

Also ich kann mir Punkt 3 nicht wirklich vorstellen, wie das so umgesetzt
werden könnte, so dass es dennoch für alle Ideen genutzt werden könnte.
Aber wenn das wirklich funktioniert, und du hast als Zielgruppe eher die
Anfänger, dann wäre dies wohl die besste.
MFG PMV
Lua einbinden geht sehr einfach :
Beispiel :
Ich finde Lua wirklich sehr gut, und vor allem einfach. Wenn du
allerdings das Thema Lua schon fuer dich abgeschlossen hast,
ignorier diesen Beitrag
www.edel.basicguru.net/bin/lua_test.7z
Beispiel :
Code: Alles auswählen
#LUA_GLOBALSINDEX = (-10002)
ImportC "lua512.lib"
luaL_newstate()
lua_pushcclosure(L,fn,n)
lua_setfield(L,i,n)
luaL_loadstring(L, s)
lua_pcall(L,a,r,e)
EndImport
ImportC "msvcrt40.lib" : EndImport
ProcedureC Test(L)
PrintN("Von Lua aufgerufen")
ProcedureReturn 0 ; Funktion gibt 0 argumente zurueck
EndProcedure
If OpenConsole()
; neue Lua Instanz
L = luaL_newstate()
;- Funktion lua bekannt machen
lua_pushcclosure(L, @test(),0)
lua_setfield(L, #LUA_GLOBALSINDEX,@"MeineFunktion")
;- Lua Script laden und starten
luaL_loadstring(L,@"MeineFunktion()")
lua_pcall(L, 0, -1, 0)
Input()
CloseConsole()
EndIf
allerdings das Thema Lua schon fuer dich abgeschlossen hast,
ignorier diesen Beitrag

www.edel.basicguru.net/bin/lua_test.7z
Zuletzt geändert von edel am 18.08.2007 04:57, insgesamt 1-mal geändert.