Ein WinForm Projekt benutzt ein weiteres Projekt als Klassenbibliothek.
Das DLL-Projekt ist als verweis in dem WinForm Projekt hinzugefügt.
Die Build-Ausgabe aus dem projekt wird anschlißend Obfusciert (Gibts da ein Deutsches wort für?)
Habe ich nun Winform.exe und Obfuscierte DLL in einem verzeichnis und versuche die exe aufzurufen, kommt die Fehlermeldeung:
System.IO.FileLoadException: Die Datei oder Assembly "ExporterDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)
Dateiname: "ExporterDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
bei Exporter.Form1.Form1_Load(Object sender, EventArgs e)
Das würde jetzt bedeuten, das ich mein Winfom Projekt immer gegen die Obfucierte DLL kompilieren müsste um dieses Problem nicht zu bekommen.
Das ist aber nicht grad sehr benuterfreundlich 😕
Irgendwelche Ideen?
Mein Blog: http://www.frickelblog.de
Du kannst doch eigentlich bei jedem Obfuscator einstellen, welche Elemente verändert werden dürfen. Wenn die DLL öffentliche Methoden usw. hat, dann sollten die beibehalten werden.
Weeks of programming can save you hours of planning
Wenn er wegen der öffentlichen methoden meckern würde, dann denke ich, würd eine andere Fehlermeldung kommen wie z.B.: "Der Typ BlahBlubb konnte nicht gefunden werden".
Oder?
Mein Blog: http://www.frickelblog.de
Welchen Obfuskator verwendest du denn?
Signierst du irgendwelche Assemblies?
Babel Free als NANT-Task
Keine Signierung
Der Task sieht bei mir so aus:
<target name="Babel_Obfuscator_Free">
<babel inputfile="C:\Projekte\Exporter\DLL\bin\Debug\ExporterDLL.dll"
outputfile="C:\Projekte\Exporter\DLL\bin\Debug\ExporterDLL_babbel.dll"
virtualfunctions="false"
obfuscatetypes="false"
obfuscateevents="false"
obfuscatemethods="false"
obfuscateproperties="false"
obfuscatefields="false"
unicodenormalization="true"
flattennamespaces="false"
stringencryption="true"
controlflowobfuscation="true"
>
<!--
iliterations="5"
emitinvalidopcodes="enhanced"
suppressildasm="true"
-->
<rulesfiles refid="rules" />
</babel>
</target>
Wird dann danach mit einem Move-Task zum alten Datei-Namen umbenannt.
Mein Blog: http://www.frickelblog.de
Dann steht sicher noch irgendwo (z.B. im Manifest, siehe Exception) der Name "ExporterDLL_babbel.dll". Hast du schonmal versucht, gleich mit den richtgen Dateinamen zu erstellen?
Weeks of programming can save you hours of planning
hm.. auf so eine Idee muss man erstmal kommen...
Ich teste mal 😃
hahahahahaha...
Wie geil is das denn wieder?
ja, das wars dann wohl...
Ich weiss auch nicht warum ich da nicht drauf komme.
Zu viel Sonne... Dringender Urlaub nötig...
Aber.. DANKE! 😃
Mein Blog: http://www.frickelblog.de
FYI:
Nachfolgend mal meine Vorlage für den MSBuild-Task (einfach wie in Doku in die *.csproj integrieren). Wenn man als <BabelOutputFile>$(TargetPath)<BabelOutputFile>
angibt, wird automatisch die kompilierte Assembly mit der obfuskierten ersetzt.
Aber aufpassen mit Setup-Projekten, die packen die Assemblies aus dem obj-Ordner. Dort dann <BabelOutputFile>$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)</BabelOutputFile>
verwenden. Sonst hat man ein Setup mit nicht obfuskierten Assemblies!
<!-- Babel.NET Obfuscator -->
<Import Project="C:\Program Files\Babel\MSBuild\Babel.Build.targets" />
<Choose>
<When Condition="'$(Configuration)' == 'Debug'">
<PropertyGroup>
<EnableObfuscation>false</EnableObfuscation>
<GenerateDebug>true</GenerateDebug>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<EnableObfuscation>true</EnableObfuscation>
<ShowStatistics>false</ShowStatistics>
<BabelOutputFile>$(TargetPath)</BabelOutputFile>
<FlattenNamespaces>true</FlattenNamespaces>
<UnicodeNormalization>true</UnicodeNormalization>
<ObfuscateTypes>true</ObfuscateTypes>
<ObfuscateEvents>true</ObfuscateEvents>
<ObfuscateMethods>true</ObfuscateMethods>
<ObfuscateProperties>true</ObfuscateProperties>
<ObfuscateFields>true</ObfuscateFields>
<VirtualFunctions>true</VirtualFunctions>
<OverloadedRenaming>true</OverloadedRenaming>
<ControlFlowObfuscation>true</ControlFlowObfuscation>
<EmitInvalidOpcodes>false</EmitInvalidOpcodes>
<StringEncryption>true</StringEncryption>
<MsilEncryption>false</MsilEncryption>
<SuppressIldasm>true</SuppressIldasm>
<DeadCodeElimination>false</DeadCodeElimination>
</PropertyGroup>
</Otherwise>
</Choose>
Hat es eigentlich einen bestimmten Grund, warum du nur Kontrollflussobfuskierung machst?
Gruß,
dN!3L
Ja - den Grund, dass ich ausschließen wollte das es eben daran liegt das zu viel obfuskiert wird 😉
Aber ich kann auch generell keine Events, Methoden, Eigenschaften obfuskieren, weil die exe, die auf die public events/methoden/eigenschaften zugreift diese sonst nicht finden würde.
Also..
Ich schau mal eben nach...
ich hab jetzt eingestellt:
virtualfunctions="true"
obfuscatetypes="false"
obfuscateevents="false"
obfuscatemethods="false"
obfuscateproperties="false"
obfuscatefields="false"
unicodenormalization="true"
flattennamespaces="false"
stringencryption="true"
controlflowobfuscation="true"
iliterations="5"
emitinvalidopcodes="enhanced"
suppressildasm="true"
Gibt es eigentlich irgendwo eine Doku, was diese ganzen hübschen Schalter alle machen?
Ich hab mir damals nur den NAnt Task runter geladen - und ich glaube mich erinnern zu können, dass es dazu keine Doku gab außer ein Beispiel, wie man es einbindet.
Mein Blog: http://www.frickelblog.de
Gibt es eigentlich irgendwo eine Doku, was diese ganzen hübschen Schalter alle machen?
Jep. Guckst du auf die Download-Seite von Babel.NET. Dort gibt's die - meiner Meinung nach sehr gut gestaltete (nicht zu viel, nicht zu wenig) - Doku zum Download (http://www.babelfor.net/downloads/babel/UserGuide.pdf).
Aber ich kann auch generell keine Events, Methoden, Eigenschaften obfuskieren, weil die exe, die auf die public events/methoden/eigenschaften zugreift diese sonst nicht finden würde.
Im Prinzip richtig gedacht, aber: Babel.NET obfuskiert (standardmäßig) eh nur nicht öffentliche Sachen. Du kannst also ruhig alle Schalter aktivieren - solange irgendwas public ist, wird es nicht obfuskiert (und deine Assembly kann ganz normal referenziert werden). Im Gegenzug heißt das: Alles, was obfuskiert werden soll, private oder internal machen.
Gruß,
dN!3L