# Xamarin 应用程序
☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
* 你在一家**网络安全公司**工作吗?你想在 HackTricks 中看到你的**公司广告**吗?或者你想获得**PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家 NFT 收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
## **基本信息**
Xamarin 是一个开源平台,为开发人员提供了一系列工具和附加组件,使他们能够使用 .NET 和 C# 框架**创建现代的 iOS、Android 和 Windows 应用程序**。
### Xamarin Android 架构
Xamarin 提供了对 Android.\* 和 Java.\* 命名空间的 .NET 绑定。Xamarin Android 应用程序在 Mono 执行环境下运行,Android 运行时(ART)虚拟机并行运行。
Mono 执行环境通过托管可调用包装器(MCW)调用这些命名空间,并为 ART 提供 Android 可调用包装器(ACW)。
这两个环境都运行在 Linux 内核之上,并调用各种 API 以访问用户代码。这种安排允许开发人员访问底层系统。
### Xamarin iOS 项目
Xamarin.iOS 应用程序在 Mono 运行时环境下运行,并使用全面的 Ahead of Time(AOT)编译将 C# .NET 代码编译为 ARM 汇编语言。
它与 Objective-C 运行时一起运行。运行时环境运行在类 UNIX 内核之上,并调用多个 API 以访问用户代码,使开发人员能够访问底层的托管或本机系统。
下图显示了这种架构:
### 什么是 .Net Runtime 和 Mono Framework?
**.Net 框架是一组程序集、类和命名空间**,开发人员可以使用它们来创建应用程序;.Net Runtime 运行编译后的代码,这个过程称为托管代码执行。.NET Runtime 提供了几个功能,确保平台独立性,并与旧版本的框架兼容。
**Mono Framework** 是在 2005 年由 Ximian/SuSe/Novell 开始的 .NET Framework 的 Linux 实现。由 Microsoft 赞助并由 Xamarin 领导,Mono 是基于 ECMA 对 Common Language Runtime 和 C# 的标准的 .NET Framework 的开源实现。
## 用于 Xamarin 应用程序的逆向工程技术
### 对 Xamarin 程序集的反编译
反编译是从编译代码生成源代码的过程。要获取有关当前内存中的程序集和可执行文件的信息,Windows 是一个很好的选择。
要打开模块窗口,请选择调试 > 窗口 > 模块。一旦检测到需要反编译的模块,右键单击并选择“反编译源代码到符号文件”。此操作**构建一个包含反编译源代码的符号文件**,从而允许您直接从源代码进入第三方代码。
**Visual Studio** 反编译托管代码,即使没有符号,也可以查看代码、检查变量并设置断点。要将源代码提取到磁盘上,请右键单击带有嵌入源代码的模块,然后单击“提取嵌入的源代码”。这将把源文件导出到一个杂项文件夹以供进一步分析。
### Xamarin 应用程序的 JIT 编译与 AOT 编译
这两种选项用于将基于 C# 的 Xamarin 代码编译为应用程序,即**即时编译和预先编译**。编译方式会影响应用程序代码在 apk 或 ipa 文件中的分发方式。让我们快速看一下下面的情况:
- **Android**:Xamarin 允许您使用**JIT 和 AOT 标志同时进行编译**。还有一种方法可以在两者之间进行切换,以获得最高的执行速度,即混合 AOT 模式。请注意,完全 AOT 模式仅适用于企业许可证。
- **iOS**:在 iOS 的情况下,只有一种选择,即**预先编译**。这是由于苹果的政策禁止在设备上执行动态生成的代码。
{% hint style="info" %}
如果遇到完全 AOT 编译的应用程序,并且开发人员已删除 IL Assembly 文件以减小构建大小,则反向工程需要额外的步骤,即从 lib 文件夹或 `libmonodroid_bundle_app.so` 文件中提取 .dll.so 文件中的 dll 文件。如果是混合 AOT 编译的应用程序,并且 IL 文件仍然保留在应用程序包中,我们可以使用它来进行逆向工程分析。
{% endhint %}
## 从APK/IPA获取dll文件
只需**解压apk/ipa**文件并复制所有位于assemblies目录下的文件:
对于Android **APKs,这些dll文件是压缩的**,不能直接用于反编译。幸运的是,我们可以使用一些工具来**解压这些dll文件**,如[XamAsmUnZ](https://github.com/cihansol/XamAsmUnZ)和[xamarin-decompress](https://github.com/NickstaDB/xamarin-decompress)。
```
python3 xamarin-decompress.py -o /path/to/decompressed/apk
```
在程序集目录中,你可能会看到`assemblies.blob`和`assemblies.manifest`而不是dll文件。这是一个Xamarin AssemblyStore,也是在Android应用程序中打包dll文件的当前推荐方法。`assemblies.manifest`是一个文本文件,描述了二进制文件`assemblies.blob`的内容。要解包这些文件,你需要使用[pyxamstore](https://github.com/jakev/pyxamstore)。
```
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
```
在iOS的情况下,**IPA文件中的dll文件可以直接加载**到反编译器中(无需解压缩)。
**当我们反编译dll文件时,大部分应用程序代码都可以找到**。此外,基于Xamarin Framework的应用程序在所有平台(如iOS和Android等)的构建中都包含90%的公共代码。
从上面列出的apk中存在的dll文件的截图中,我们可以确认这是一个Xamarin应用程序。它包含特定于应用程序的dll文件以及运行应用程序所需的库文件,例如`Xamarin.Essentails.dll`或`Mono.Security.dll`。
{% hint style="success" %}
最后,您可以使用[**这些推荐的工具**](../reversing/reversing-tools-basic-methods/#net-decompiler)来访问DLL中的**C#代码**。
{% endhint %}
## 动态分析
尝试检查应用程序是否有任何类型的SSL pinning。如果没有,使用Burp作为系统的CA应该可以拦截请求。**Frida与Java或ObjC运行时在这里无法工作**,但幸运的是,有一个工具可以用于钩入方法。
[**Fridax**](https://github.com/NorthwaveSecurity/fridax)允许您在Xamarin应用程序的运行时轻松**修改.NET二进制文件**。静态分析将帮助您识别应用程序中存在的不同方法,稍后可以使用Fridax钩入这些方法进行动态分析。以下是一些Frida脚本,可以帮助我们绕过root检测或SSL pinning:
* [**xamarin-antiroot**](https://codeshare.frida.re/@Gand3lf/xamarin-antiroot/)
* [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
* [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
## 参考资料
* [https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers](https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers)
* [https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/](https://thecobraden.com/posts/unpacking\_xamarin\_assembly\_stores/)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**