Seite 1 von 2

DLL Plugin Architektur - wie?

Verfasst: 16.08.2007 23:24
von Sebe
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?

Verfasst: 16.08.2007 23:53
von PMV
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

Verfasst: 17.08.2007 00:24
von Sebe
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.

Verfasst: 17.08.2007 01:01
von Ligatur
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.

Verfasst: 17.08.2007 01:35
von Sebe
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 :)

Verfasst: 17.08.2007 11:15
von X0r
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?
Naja, sagen wir mal da gibt es so eine FTP DLL.
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.

Verfasst: 17.08.2007 16:12
von PMV
Und wenn die EXE diese Funktion hat ... ist es genau so schwer ... oder
einfach, wie man will :wink: ... 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 :D ...

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

Verfasst: 17.08.2007 16:19
von edel
Lua ist sehr einfach zu erlernen und zu nutzen. Benoetigt ausserdem
keinen Kompiler oder sonstwas. Fuer ein einfaches Benutzen wohl die
beste Wahl.

Verfasst: 17.08.2007 16:45
von Sebe
Ich mag Lua nicht, deshalb scheidet es als Scriptsprache schon mal aus (ich müsste ja dann selber nen Wrapper für schreiben; das ist ja, als würde ich selber eine Rosenkohlsuppe kochen :freak: ).

Verfasst: 17.08.2007 17:16
von edel
Lua einbinden geht sehr einfach :


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
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