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:
- Äquivalente Formeln und konstante Transformationen:
Konstanten werden anders kodiert und verschleiert. - Veränderung des Kontrollflusses:
Etwa durch Hinzufügung von Jumps oder Switch-basierten State Machines wird versucht den Kontrollfluss der Applikation zu verschleiern. - Umbenennung:
Durch Umbenennung von Klassennamen, Methoden- und Variablennamen wird erschwert den Zweck eines Code-Teils zu erkennen.
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.