13 KiB
Xamarinアプリ
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。これは、iOS、Android、およびWindows向けのモダンなアプリを.NETおよびC#フレームワークを使用して作成するための包括的なツールとアドオンにアクセスできるオープンソースプラットフォームです。
- 公式PEASS&HackTricks swagを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo および hacktricks-cloud repo に提出してください。
基本情報
Xamarinは、開発者が.NETおよびC#フレームワークを使用して、iOS、Android、およびWindows向けのモダンなアプリを作成するための包括的なツールとアドオンにアクセスできるオープンソースプラットフォームです。
Xamarin Androidアーキテクチャ

Xamarinは、Android.*およびJava.*の名前空間に対する.NETバインディングを提供します。Xamarin。
Androidアプリケーションは、Androidランタイム(ART)仮想マシンをサイドバイサイドで実行するMono実行環境で動作します。
Mono実行環境は、Managed Callable Wrappers(MCW)を介してこれらの名前空間に呼び出しを行い、Android Callable Wrappers(ACW)をARTに提供します。
これらの環境は、Linuxカーネルの上で実行され、ユーザーコードにさまざまなAPIを呼び出します。この仕組みにより、開発者は基礎となるシステムにアクセスできます。
Xamarin iOSプロジェクト
Xamarin.iOSアプリケーションは、Monoランタイム環境で実行され、C# .NETコードをARMアセンブリ言語にコンパイルするために完全なAhead of Time(AOT)コンパイルを使用します。
これはObjective-Cランタイムと共に実行されます。ランタイム環境はUNIXのようなカーネルの上で実行され、ユーザーコードにさまざまなAPIを呼び出します。これにより、開発者は基礎となる管理またはネイティブシステムにアクセスできます。
以下の図は、このアーキテクチャを示しています:

.NetランタイムとMonoフレームワークとは何ですか?
.Netフレームワークは、開発者がアプリケーションを作成するために使用できるアセンブリ、クラス、および名前空間のセットです。.Netランタイムはコンパイルされたコードを実行し、このプロセスはマネージドコードの実行と呼ばれます。.NETランタイムは、プラットフォームの独立性を確保し、古いフレームワークバージョンと互換性があります。
Monoフレームワークは、2005年にLinux(Ximian/SuSe/Novell)向けの.NET Frameworkの実装として開始されました。Microsoftのスポンサーを受け、Xamarinが主導するMonoは、Common Language RuntimeおよびC#のECMA標準に基づく.NETフレームワークのオープンソース実装です。
Xamarinアプリの逆向きエンジニアリング技術
Xamarinアセンブリの逆コンパイル
逆コンパイルは、コンパイルされたコードからソースコードを生成するプロセスです。メモリに現在存在するアセンブリと実行可能ファイルに関する情報を取得するために、Windowsは素晴らしい場所です。
モジュールウィンドウを開くには、デバッグ > ウィンドウ > モジュールを選択します。逆コンパイルが必要なモジュールを検出したら、右クリックして「ソースをシンボルファイルに逆コンパイル」を選択します。この操作により、ソースコードが含まれたシンボルファイルが作成され、ソースコードから直接サードパーティのコードに入ることができます。
Visual Studioは、シンボルがなくてもマネージドコードを逆コンパイルし、コードを表示したり、変数を検査したり、ブレークポイントを設定したりすることができます。ソースコードをディスクに抽出するには、埋め込まれたソースを持つモジュールで右クリックし、「埋め込まれたソースを抽出」をクリックします。これにより、ソースファイルがさらなる分析のためにMiscellaneous filesフォルダにエクスポートされます。
XamarinアプリのJITとAOTコンパイル
これらは、C#ベースのXamarinコードをアプリケーションにコンパイルするための2つのオプション、つまりJust in timeコンパイルとahead of timeコンパイルです。コンパイルの方法によって、アプリケーションコードがapkまたはipaファイル内でどのように出荷されるかが影響を受けます。以下で簡単に説明します:
- Android:Xamarinでは、AndroidのJITとAOTフラグの両方を使用してコンパイルすることができます。ハイブリッドAOTモードを使用して最も高速な実行を得る方法もあります。ただし、フルAOTモードはエンタープライズライセンスのみで利用可能です。
- iOS:iOSの場合、ahead-of-timeコンパイルのオプションは1つだけです。これは、Appleのポリシーにより、デバイス上で動的に生成されたコードの実行が禁止されているためです。
{% hint style="info" %}
フルAOTコンパイルされたアプリケーションに遭遇し、開発者がビルドサイズを減らすためにILアセンブリファイルを削除した場合、リバースエンジニアリングにはlibフォルダの.dll.soファイルまたはlibmonodroid_bundle_app.so
ファイルからdllファイルを抽出する追加の手順が必要です。ハイブリッドAOTコンパイルされたアプリで、ILファイ
APK/IPAからdllファイルを取得する
単にapk/ipaファイルを解凍し、assembliesディレクトリの下に存在するすべてのファイルをコピーします。

Androidの場合、これらのdllファイルは圧縮されており、直接脱コンパイルに使用することはできません。幸いなことに、XamAsmUnZやxamarin-decompressなどのツールを使用してこれらのdllファイルを解凍することができます。
python3 xamarin-decompress.py -o /path/to/decompressed/apk
アセンブリディレクトリには、dllファイルの代わりにassemblies.blob
とassemblies.manifest
が表示されることがあります。これはXamarin AssemblyStoreであり、Androidアプリケーションにdllをパックするための現在の推奨方法です。assemblies.manifest
は、バイナリファイルassemblies.blob
の内容を記述したテキストファイルです。これらを展開するには、pyxamstoreを使用する必要があります。
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
iOSの場合、IPAファイル内のdllファイルは直接デコンパイラに読み込むことができます(何も解凍する必要はありません)。
**dllファイルをデコンパイルすると、ほとんどのアプリケーションコードが見つかります。**また、Xamarin Frameworkベースのアプリは、iOSやAndroidなどのすべてのプラットフォームのビルドに共通のコードの90%を含んでいます。

上記のスクリーンショットは、apkに存在するdllファイルのリストですが、これがXamarinアプリであることを確認できます。Xamarin.Essentails.dll
やMono.Security.dll
など、アプリの実行に必要なアプリ固有のdllファイルとライブラリファイルが含まれています。
{% hint style="success" %} 最後に、これらの推奨ツールを使用して、DLLからC#コードにアクセスできます。 {% endhint %}
動的解析
アプリケーションにSSLピニングが設定されているかどうかを確認してみてください。設定されていない場合、システムのCAとして動作するBurpを使用してリクエストを傍受することができます。ここでは、Frida with JavaまたはObjCランタイムは機能しませんが、幸いなことに、メソッドにフックするために使用できるツールがあります。
Fridaxは、Xamarinアプリ内の.NETバイナリをランタイムで簡単に変更することができます。静的解析を使用して、アプリ内に存在するさまざまなメソッドを特定し、Fridaxを使用して後で動的解析のためにフックすることができます。以下は、ルート検出やSSLピニングのバイパスに役立ついくつかのFridaスクリプトです:
参考文献
- https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers
- https://thecobraden.com/posts/unpacking_xamarin_assembly_stores/
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSを入手したいですか?または、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksグッズを手に入れましょう。
- 💬 DiscordグループまたはTelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。