en / de
Expertisen
Methoden
Dienstleistungen
Referenzen
Jobs & Karriere
Firma
Technologie-Trends TechCast WebCast TechBlog News Events Academy

Xamarin.Android Code Obfuscation

Xamarin Android Apps werden mit C# entwickelt. Beim Kompilieren wird der C# Code in die Intermediate Language übersetzt und mit der Android Mono-Runtime zusammengepackt. Ein solches Assembly lässt sich relative leicht mit einem Tool wie ILSpy dekompilieren. Dabei kann praktisch der ganze Source Code wiederhergestellt werden. Es lassen sich Klassen-, Methoden- und Variablennamen einsehen.
Möchte man ein solches Reverse Engineering erschweren, wird oftmals zur sogenanntem Code Obfuscation gegriffen.

Dabei werden verschiedenste Methoden eingesetzt, um die das Reverse Engineering zu erschweren. Zu den gängigsten Methoden gehören zum Beispiel:

 

Allerdings kann mit Code Obfuscation ein Reverse Engineering nicht verhindert werden sondern lediglich zeitaufwändiger gemacht werden.

Einbindung in den Build Prozess

Es gibt eine Vielzahl Code Obfuscating Tools. Egal was für eines das man verwendet, das Einbinden in den Build Prozess gestaltet sich in der Regel ähnlich. Für das folgende Beispiel wird das gratis Tool ConfuserEx verwendet.

Zuerst musst die Xamarin.Android Projektdatei angepasst und um folgenden Eintrag ergänzt werden:

<Target Name="Obfuscate" AfterTargets="_CopyIntermediateAssemblies" Condition="'$(Configuration)' == 'Release'">
   <Exec Command="AndroidObfuscation.bat '$(SolutionDir)'" WorkingDirectory="$(SolutionDir)\TipCalculator\Obfuscation" />
</Target>

Im Debug-Build möchte man in der Regel kein Code Obfuscating betreiben, da ansonsten das Debugging nicht möglich ist und Stack Traces unleserlich sind. Daher sollte man mit Hilfe einer Condition sicherstellen, dass nur im Release-Build ein Code Obfuscating betrieben wird.

Die im oberen Beispiel genanngte AndroidObfuscation.bat Datei kann z.B. wie folgt aussehen:

echo "starting source code obfuscation"
Confuser.CLI.exe TipCalculator.crproj
echo "finished obfuscating source code"

echo "copy TipCalculator.Droid.dll"
del "..\TipCalculator.Droid\obj\Release\assemblies\TipCalculator.Droid.dll"
copy "..\Confused\TipCalculator.Droid\obj\Release\assemblies\TipCalculator.Droid.dll" "..\TipCalculator.Droid\obj\Release\assemblies\TipCalculator.Droid.dll"
del  "..\Confused\TipCalculator.Droid\obj\Release\assemblies\TipCalculator.Droid.dll"

echo "finished copying obfuscated assemblies"

Diese führt ConfuserEx aus und ersetzt anschliessen die Assemblies.

Fazit

Es ist relativ einfach ein Code Obfuscating für eine Xamarin.Android App einzurichten und so zu konfigurieren, dass dies für jeden Release-Build ausgeführt wird.

Kommentare

6 Antworten zu “Xamarin.Android Code Obfuscation”

  1. Michael Rumpler sagt:

    Ich habe versucht, diese Anleitung in meiner Xamarin.Forms Solution zu verwenden, aber es will nicht so ganz funktionieren.

    Ein Verzeichnis obj\Release\assemblies gibt es nicht. Evtl. hat Xamarin hier den Build-Prozess geändert. Ich kopiere die obfuskierten .dll’s in bin\Release und obj\Release\linksrc. Die .pdb’s kommen nur in bin\Release. In obj\Release\linksrc sind keine .pdb Files, nur .dll.mdb’s. Da die aber anscheinend schon von den nicht obfuskierten .dll’s erzeugt wurden, passen die nicht zu den entsprechenden .dll’s und der Linker bringt einen Fehler (Failed to resolve assembly: ‹EwemRnerbBiDpOtVwGBWJHgDEOeT).

    Wenn ich versuche das .apk mit MSBuild anzulegen, dann sehe ich, dass nach dem Obfuscate task ein _ConvertPdbFiles läuft, doch das tut anscheinend nichts.
    _ConvertPdbFiles:
    Building target «_ConvertPdbFiles» partially, because some output files are out of date with respect to their input files.

    Wie funktioniert das mit der aktuellen Xamarin(.Forms) Version?

  2. Michael Rumpler sagt:

    _ConvertPdbFiles erzeugt schon neue .mdb’s aus den obfuskierten .dll’s und .pdb’s und sie werden danach auch im _CopyMdbFiles Task in obj\Release\linksrc kopiert. Das erklärt also nicht, wieso der Linker nach einer nicht exisierenden dll sucht.

  3. Reto sagt:

    Ich habe es auch mit dem obj\Release\linksrc Verzeichnis probiert und bekomme auch immer einen linker Fehler. Konnte jemand obfuscation mit ConfusorEx und der neusten Xamarin Version durchführen?

  4. Reto sagt:

    Vielleicht liegt es auch an den ConfusorEx settings und gewisse Rules sind einfach nicht Xamarin kompatibel.

  5. Reto sagt:

    Mit diesen Rules hat es bei mir funktioniert:

  6. Reto sagt:

    – Control Flow Protection
    – Anti IL Dasm Protection
    – Constants Protection
    – Reference Proxy Protection
    – Name Protection mit (argument name=»mode» value=»letters»)

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Newsletter - aktuelle Angebote, exklusive Tipps und spannende Neuigkeiten

 Jetzt anmelden
NACH OBEN
Zur Webcast Übersicht