Anfängerfragen zu einer .DLL Datei

CargoluxPilot748

Neues Mitglied
Hallo zusammen,

ich hätte mal einige Fragen zu .DLL Dateien.

1. Sind diese grundsätzlich in C++ geschrieben?

2. Können diese wirkliche Aufgaben enthalten, die bspw. besagen: "Ein Regentropfen läuft nun von einem Punkt a an den Punkt b die Autoscheibe hinunter" oder wird in der DLL lediglich eine Verlinkung auf das Programm erzeugt, das eben genau das macht?

3. Können DLL Dateien von Spielen immer komplett entschlüsselt/bearbeitet werden?

Sind leider alles Dinge, aus denen ich durch Google nicht schlau wurde.

Als kleine Anmerkung: Ich habe zuhause einen Flugsimulator mit dem ich öfter mal meine Procedures übe. Das Flugzeug besitzt ein virtuelles Cockpit sowie einen RainMaker, der Regentropfen auf die Scheibe projiziert. Diese bewegen sich abhängig von der Geschwindigkeit des Flugzeugs. Insgesamt gibt es dafür zwei "Ausführungen".

kt = Knoten (Geschwindigkeit)

0- ca. 60kt: Regen tropft ganz normal auf die Scheibe, 60- ca. 110kt: Hier schaltet ein Programm um und der Regen läuft nun über die Scheibe hinweg,
Ab ca. 110-120 kt verschwindet der Regeneffekt auf der Scheibe komplett. Sobald man wieder unter die ~110kt kommt, tauchen sie langsam wieder auf.

Ich hoffe, man versteht was ich meine.

Ich würde nun gerne wissen, ob ich diese Zeiten irgendwie beeinflussen/ändern kann. Dass ich die Geschwindigkeit bis zum Verschwinden des Effekts bspw. auf 180kt setzen kann.

Ich habe leider absolut keine Ahnung, ob so etwas in der .DLL Datei namens "RainMaker.dll" stehen könnte oder ob ich zum Ändern dieser Werte woanders schauen muss (bspw. in einer .ini-Datei o.ä.)

Danke im Voraus und viele Grüße
Dennis
 

Lowl3v3l

Aktives Mitglied
devCommunity-Experte
Etwas ausführlicher vielleicht:
zu 1.) DLL's sind nicht DLL's, es gibt zwei verschiedene Typen. Der erste ist nativer Code, der zum Beispiel in C++ geschrieben sein kann.
Der zweite Typ ist eine .Net Assembly, die dann logischerweise in einer .Net-Sprache geschrieben ist, und keinen nativen Code, sondern CIL beinhaltet(ein Zwischencode für die .Net-VM, der beim üblicherweise beim Ausführen durch einen Just-In-Time-Compiler übersetzt wird).
Ich nehme für das Folgende einfach mal an, du meinst DLL's des ersten Typs.
zu 2.) Mir ist unklar, was eine "wirkliche Aufgabe" ist, sie können jedenfalls beinahe beliebigen Code beinhalten( es gibt ein paar Technikalitäten dabei, die man darin nicht tun kann, die aber dein Compiler ohnehin nicht erzeugen wird, wenn du nicht wirklich überzeugend genau das tun willst)
zu 3.) DLL's sind i.A. nicht verschlüsselt(man KANN sowas mit einem Haufen Magie machen, aber das einzige wo ich sowas bisher gesehen habe ist Malware). Und bearbeitbar sind sie nicht automatisch, sie müssen nur für den dynamischen Linker(der die DLL in den Speicher lädt und die Verweise auf ihre Funktionen auflösen kann, wie genau das passiert ist etwas zu kompliziert an dieser Stelle) readable sein aus dem Kontext der Executable oder Library die darauf verlinkt, sonst könnte man ja nicht darauf zugreifen. Sie im Nachhinein zu bearbeiten ist extrem unüblich, das hat eher wieder Nischenanwendungen(außer du schreibst Malware).

Kann man eine DLL patchen um sowas zu ändern? Klar geht. Ist in der ITSec ziemlich üblich, aus diversen Gründen. Zum Beispiel, um Malware zur Ausführung zu bringen, Sicherheitslücken zu suchen oder Schutzmaßnahmen zu umgehen.
Kannst du das? Ich würde für nein votieren. Hättest du das nötige Wissen hättest du deine Fragen oben nicht gestellt. Ist auch kein Skill den man mal eben lernt(das Inkludiert Assembly, viel Spezialwissen zu Dateiformaten wie .DLL, Umgang mit Debuggern, etc. und dauert in der Regel 5+ Jahre) oder macht (Reverse Engineering, die Rekonstruktion des Programmablaufes aus dem Kompilat, ist eine unfassbar komplexe, zeitraubende und schwierige Arbeit, besonders bei nicht trivialen Programmen und gerade weil moderne Compiler mittlerweile so gut im optimieren sind).

MfG,
Lowl3v3l
 

CargoluxPilot748

Neues Mitglied
Etwas ausführlicher vielleicht:
zu 1.) DLL's sind nicht DLL's, es gibt zwei verschiedene Typen. Der erste ist nativer Code, der zum Beispiel in C++ geschrieben sein kann.
Der zweite Typ ist eine .Net Assembly, die dann logischerweise in einer .Net-Sprache geschrieben ist, und keinen nativen Code, sondern CIL beinhaltet(ein Zwischencode für die .Net-VM, der beim üblicherweise beim Ausführen durch einen Just-In-Time-Compiler übersetzt wird).
Ich nehme für das Folgende einfach mal an, du meinst DLL's des ersten Typs.
zu 2.) Mir ist unklar, was eine "wirkliche Aufgabe" ist, sie können jedenfalls beinahe beliebigen Code beinhalten( es gibt ein paar Technikalitäten dabei, die man darin nicht tun kann, die aber dein Compiler ohnehin nicht erzeugen wird, wenn du nicht wirklich überzeugend genau das tun willst)
zu 3.) DLL's sind i.A. nicht verschlüsselt(man KANN sowas mit einem Haufen Magie machen, aber das einzige wo ich sowas bisher gesehen habe ist Malware). Und bearbeitbar sind sie nicht automatisch, sie müssen nur für den dynamischen Linker(der die DLL in den Speicher lädt und die Verweise auf ihre Funktionen auflösen kann, wie genau das passiert ist etwas zu kompliziert an dieser Stelle) readable sein aus dem Kontext der Executable oder Library die darauf verlinkt, sonst könnte man ja nicht darauf zugreifen. Sie im Nachhinein zu bearbeiten ist extrem unüblich, das hat eher wieder Nischenanwendungen(außer du schreibst Malware).

Kann man eine DLL patchen um sowas zu ändern? Klar geht. Ist in der ITSec ziemlich üblich, aus diversen Gründen. Zum Beispiel, um Malware zur Ausführung zu bringen, Sicherheitslücken zu suchen oder Schutzmaßnahmen zu umgehen.
Kannst du das? Ich würde für nein votieren. Hättest du das nötige Wissen hättest du deine Fragen oben nicht gestellt. Ist auch kein Skill den man mal eben lernt(das Inkludiert Assembly, viel Spezialwissen zu Dateiformaten wie .DLL, Umgang mit Debuggern, etc. und dauert in der Regel 5+ Jahre) oder macht (Reverse Engineering, die Rekonstruktion des Programmablaufes aus dem Kompilat, ist eine unfassbar komplexe, zeitraubende und schwierige Arbeit, besonders bei nicht trivialen Programmen und gerade weil moderne Compiler mittlerweile so gut im optimieren sind).

MfG,
Lowl3v3l

Hallo Lowl3v3l,

vielen Dank für die aufschlussreiche Erklärung. Dachte mir schon, dass das Ganze nicht so einfach wird.
Dann lass ich das wohl sein. Kenne mich mit ein paar Programmiersprachen, wie bspw. Java einigermaßen aus und dachte, ich kann mal eben die Werte in der Datei verändern, um das Verschwinden der Raindrops zu beeinflussen.

Viele Grüße
Dennis
 

Mat

Aktives Mitglied
Das sind so Sachen, die eigentlich in einer config.ini oder so einstellbar sein sollten.

Meinst du vielleicht das Ding hier?
*nachträglich zensiert aus Lizenzgründen*

Ich weiß nicht, ob das die benötigte Library ist. Wenn ja, dann müsstest du daraus in Visual Studio eine DLL basteln können.
 
Zuletzt bearbeitet:

CargoluxPilot748

Neues Mitglied
Das sind so Sachen, die eigentlich in einer config.ini oder so einstellbar sein sollten.

Meinst du vielleicht das Ding hier?

URL GELÖSCHT

Ich weiß nicht, ob das die benötigte Library ist. Wenn ja, dann müsstest du daraus in Visual Studio eine DLL basteln können.

Hallo Mat,

witzig, genau das ist es. Die Dateien hab ich so noch gar nicht gesehen. Alles was ich gefunden hatte war eine Datei namens RainMaker.dll und ein paar DDS Dateien als entsprechende Texturen.

Ist das die DLL Datei entschlüsselt und in einzelne Dateien aufgeteilt ?

Vielen Dank schon mal und viele Grüße
Dennis
 
Zuletzt bearbeitet:

CargoluxPilot748

Neues Mitglied
Das sind so Sachen, die eigentlich in einer config.ini oder so einstellbar sein sollten.

Meinst du vielleicht das Ding hier?

URL GELÖSCHT
Ich weiß nicht, ob das die benötigte Library ist. Wenn ja, dann müsstest du daraus in Visual Studio eine DLL basteln können.
Zusätzlich wollte ich noch fragen, welches Visual Studio ich da nutzen muss bzw. wie ich da dran komme?

Bekomme da immer diesen Installer mit mehreren Auswahlmöglichkeiten, weiß allerdings nicht, was ich davon nehmen muss, um aus den besagten Dateien eine .DLL zu erstellen.

Danke und viele Grüße
Dennis
 
Zuletzt bearbeitet:

CargoluxPilot748

Neues Mitglied
Also ich saß eben nochmal dran. Leider ist nach dem öffnen des Projekts eine file namens "pmdg_base_plane" entladen und leer.

Wurde vmtl. gemacht, damit keine Leute wie ich kommen und darin rumfummeln. :D Gibt es da dennoch eine Möglichkeit?

Viele Grüße
Dennis
 

CargoluxPilot748

Neues Mitglied
Also Mat, das war schon mal eine riesige Hilfe.

Nach etwas Suchen habe ich dann wohl genau die IF-Schleifen gefunden, nach denen ich gesucht hatte.


Wir sehen hier, dass der Wert von "general_state.ias" (IAS =Indicated Airspeed - Geschwindigkeit die auf dem Fahrtmesser des Flugzeugs angezeigt wird) in den if-Schleifen die Geschwindigkeit vorgibt, wann der Regen ab und angeschaltet wird.

Ab "movingRain4Speed = false;" ist der Effekt komplett deaktiviert.

Nun stellt sich mir eben nur noch die Frage, wie ich diese ganzen Dateien über Visual Studio wieder in die .DLL verwandle, damit sie wieder ins Spiel implementiert werden können.

Hat evtl. jemand Ideen?

Herzlichen Dank und viele Grüße
Dennis
 

Mat

Aktives Mitglied
Du kannst auch Beiträge editieren :D

Na, dann ist ja gut, dass du schon weitergekommen bist.

Also ich saß eben nochmal dran. Leider ist nach dem öffnen des Projekts eine file namens "pmdg_base_plane" entladen und leer.

Wurde vmtl. gemacht, damit keine Leute wie ich kommen und darin rumfummeln. :D Gibt es da dennoch eine Möglichkeit?

Es ist möglich, dass da noch eine andere Bibliothek referenziert war. Vielleicht auch nur ein Platzhalter, wenn das ganze ein Decompiling-Produkt war.

Aber die Repo scheint jetzt gelöscht oder privat zu sein, deswegen kann ich nicht reingucken. Außerdem kann es sein, dass der Quellcode eine andere Version hat als deine DLL (also ein neuerer oder älterer Stand ist).

Kannst ja mal gucken, ob der Decompiler hier ähnlichen Code ausspuckt, wenn du die aktuelle DLL reinsteckst (falls er sie öffnen kann):

Wenn er sie nicht öffnen kann, dann versuch mal Ghidra. (lass dich nicht vom Assemblercode einschüchtern.. du kannst dir erkannte Funktionen einblenden lassen und wenn du sie im Hauptfenster öffnest, zeigt er dir an der Seite den daraus erzeugten Quellcode an).

Decompiler helfen dabei, Binärdateien zu verstehen und sie als lesbaren Code anzuzeigen. Der Code wird idR nie 1:1 dem echten Code entsprechen aber kann schon dabei helfen, ihn zu rekonstruieren.

Theoretisch könntest du, mit dem was du hast (Quellcode + Dekompillat der DLL), den notwendigen Code rekonstruieren, die DLL bauen und sie dann durch deine Version ersetzen (immer schön mit Sicherungskopien arbeiten).

Nun stellt sich mir eben nur noch die Frage, wie ich diese ganzen Dateien über Visual Studio wieder in die .DLL verwandle, damit sie wieder ins Spiel implementiert werden können.

Das Java-Äquivalent wäre, eine jar-Datei zu bauen. Wenn du das schon mal gemacht hast, wird dir das ein bisschen vertraut vorkommen. Während du bei Java die Javaversion (9,11,15) als Ziel angibst, gibst du bei diesem Projekt die Prozessorarchitektur an (32/64bit usw). Die Projektmappe müsste eigentlich schon eine Buildkonfiguration haben. Kannst ja mal gucken, welche Fehler kommen, wenn du versuchst zu bauen. Mach dir am besten vorher eine Sicherungskopie vom Code.

Kenne mich mit dem Ersetzen von DLLs nicht so gut aus. Aber bauen ist relativ einfach, weil die IDE einem die meiste Arbeit abnimmt. Erst bei Fehlenden Abhängigkeiten, Problemen und Fehlermeldungen wirds schon mal komplizierter. Kannst ja mal schauen, ob du eine Anleitung zum Erstellen von DLLs findest.
 

CargoluxPilot748

Neues Mitglied
Du kannst auch Beiträge editieren :D

Na, dann ist ja gut, dass du schon weitergekommen bist.



Es ist möglich, dass da noch eine andere Bibliothek referenziert war. Vielleicht auch nur ein Platzhalter, wenn das ganze ein Decompiling-Produkt war.

Aber die Repo scheint jetzt gelöscht oder privat zu sein, deswegen kann ich nicht reingucken. Außerdem kann es sein, dass der Quellcode eine andere Version hat als deine DLL (also ein neuerer oder älterer Stand ist).

Kannst ja mal gucken, ob der Decompiler hier ähnlichen Code ausspuckt, wenn du die aktuelle DLL reinsteckst (falls er sie öffnen kann):

Wenn er sie nicht öffnen kann, dann versuch mal Ghidra. (lass dich nicht vom Assemblercode einschüchtern.. du kannst dir erkannte Funktionen einblenden lassen und wenn du sie im Hauptfenster öffnest, zeigt er dir an der Seite den daraus erzeugten Quellcode an).

Decompiler helfen dabei, Binärdateien zu verstehen und sie als lesbaren Code anzuzeigen. Der Code wird idR nie 1:1 dem echten Code entsprechen aber kann schon dabei helfen, ihn zu rekonstruieren.

Theoretisch könntest du, mit dem was du hast (Quellcode + Dekompillat der DLL), den notwendigen Code rekonstruieren, die DLL bauen und sie dann durch deine Version ersetzen (immer schön mit Sicherungskopien arbeiten).



Das Java-Äquivalent wäre, eine jar-Datei zu bauen. Wenn du das schon mal gemacht hast, wird dir das ein bisschen vertraut vorkommen. Während du bei Java die Javaversion (9,11,15) als Ziel angibst, gibst du bei diesem Projekt die Prozessorarchitektur an (32/64bit usw). Die Projektmappe müsste eigentlich schon eine Buildkonfiguration haben. Kannst ja mal gucken, welche Fehler kommen, wenn du versuchst zu bauen. Mach dir am besten vorher eine Sicherungskopie vom Code.

Kenne mich mit dem Ersetzen von DLLs nicht so gut aus. Aber bauen ist relativ einfach, weil die IDE einem die meiste Arbeit abnimmt. Erst bei Fehlenden Abhängigkeiten, Problemen und Fehlermeldungen wirds schon mal komplizierter. Kannst ja mal schauen, ob du eine Anleitung zum Erstellen von DLLs findest.

Hallo Mat,

Dotpeek hatte ich bereits getestet, aber kann mit dem Code nichts anfangen. Was bedeutet es denn, wenn ein Projekt "entladen" ist? So steht es in Visual Studio.

Dass die Dateien nun vom Ersteller gelöscht wurde liegt an mir.... ich hatte ein Kommentar unter seinen Files verfasst und gefragt, wie ich das entladene Objekt ersetzen kann. Unmittelbar danach hab ich die Seite aktualisiert und alle Files waren offline. Anschließend bekam ich eine Private message im Forum von PMDG (das ist der Hersteller des Flugzeug Addons, bei dem auch der RainMaker implementiert wurde), in der gefragt wurde, ob es sein kann, dass ich "CargoluxPilot" von Github sei, was ich bestätigte. Anschließend wollte die Person X gerne mit mir sprechen.

Haben wir dann auch gemacht. Ein netter Herr aus Südafrika war mit perfektem Englisch an der anderen Leitung und bat mich höflich, dass ich die Dateien, die eigentlich nicht öffentlich sein sollten, nicht weiter verbreite. Er hat wohl versehentlich interne Dateien, die auf privat gestellt waren öffentlich gestellt.

Hat mir auch sofort angeboten, dass ich das nächste große Addon kostenlos von ihm bekomme, weil er dadurch seinen Job verlieren könnte (ist kein kleines Unternehmen. Im Bereich Flugsimulation mit das bekannteste).

Dann haben wir noch etwas getratscht und ich hab ihn nochmal nach der fehlenden Datei gefragt, die er mir verständlicherweise nicht geben konnte. Aber er würde sich der Sache mal annehmen, die Werte meinen Wünschen nach ändern und fragen, ob er mir die überarbeitete Datei zukommen lassen darf.

Zusätzlich hatte ich noch die Möglichkeit mich als Beta-Tester zu bewerben und warte nun auf Rückmeldung von ihm.

Alles in allem ein spannender Tag. :D Vielleicht lass ich das zunächst besser sein. Zumal ich eh keine Ahnung habe, wie man die entladene Datei wiederherstellen soll. Hört sich für mich so an, als würde sie komplett fehlen und müsste neu aufgebaut werden. Das ist mir persönlich wohl leider zu zeitaufwendig, weil ich dafür einfach zu wenig auskenne.


Danke für die Lösungsansätze und viele Grüße
Dennis
 

Mat

Aktives Mitglied
Dotpeek hatte ich bereits getestet, aber kann mit dem Code nichts anfangen. Was bedeutet es denn, wenn ein Projekt "entladen" ist? So steht es in Visual Studio.
Dann ist es entweder nicht .NET oder anderweitig verschleiert.

Aber er würde sich der Sache mal annehmen, die Werte meinen Wünschen nach ändern und fragen, ob er mir die überarbeitete Datei zukommen lassen darf.

Zusätzlich hatte ich noch die Möglichkeit mich als Beta-Tester zu bewerben und warte nun auf Rückmeldung von ihm

Na, dann hat sich das Problem ja gelöst und du hattest nebenher noch ein kleines Abenteuer. ;)

Ich habe den Verweis auf das Repo aus meinem Kommentar genommen. Kannst es ja auch noch aus deinen Zitaten entfernen.
Das sollte es erschweren, den Code später nachträglich noch in irgendeinem Internet-Cache finden zu können ^^
 

CargoluxPilot748

Neues Mitglied
Dann ist es entweder nicht .NET oder anderweitig verschleiert.



Na, dann hat sich das Problem ja gelöst und du hattest nebenher noch ein kleines Abenteuer. ;)

Ich habe den Verweis auf das Repo aus meinem Kommentar genommen. Kannst es ja auch noch aus deinen Zitaten entfernen.
Das sollte es erschweren, den Code später nachträglich noch in irgendeinem Internet-Cache finden zu können ^^
Alles klar. Ich denke, dann lass ich das lieber, bevor ich da noch ewig viel Zeit rein stecke.

Gute Idee, hab ich gemacht.

Dennoch danke für Deine hilfreichen Tipps. Hat mir zum Verständnis von .DLL und weiteren Dingen immerhin schon mal viel weitergeholfen. Somit war das alles nicht ganz umsonst. :)

Viele Grüße
Dennis
 
Oben Unten