Laden...

Problem durch Obfuscator: Die gefundene Manifestdefinition der Assembly...

Erstellt von Sclot vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.094 Views
S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren
Problem durch Obfuscator: Die gefundene Manifestdefinition der Assembly...

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?

5.658 Beiträge seit 2006
vor 13 Jahren

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

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

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?

2.891 Beiträge seit 2004
vor 13 Jahren

Welchen Obfuskator verwendest du denn?
Signierst du irgendwelche Assemblies?

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

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.

5.658 Beiträge seit 2006
vor 13 Jahren

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

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

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

2.891 Beiträge seit 2004
vor 13 Jahren

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

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

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.

2.891 Beiträge seit 2004
vor 13 Jahren

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