9.2 KiB
Xamarin 应用程序
从零开始学习 AWS 黑客攻击直到成为英雄 htARTE (HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想在 HackTricks 中看到您的公司广告 或 下载 HackTricks 的 PDF,请查看 订阅计划!
- 获取 官方 PEASS & HackTricks 商品
- 发现 PEASS 家族,我们独家的 NFTs 集合
- 加入 💬 Discord 群组 或 telegram 群组 或在 Twitter 🐦 上 关注 我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 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 运行时环境下运行,并使用完整的提前编译 (AOT) 将 C# .NET 代码编译为 ARM 汇编语言。
它与 Objective-C 运行时一起运行。运行时环境在类 UNIX 内核之上运行,并调用多个 API 到用户代码,这使得开发者可以访问底层的托管或本地系统。
下面给出的图表描述了这种架构:
什么是 .Net 运行时和 Mono 框架?
.Net 框架是一组程序集、类和命名空间,开发者可以使用它们来创建应用程序;.Net 运行时运行编译后的代码,这个过程称为托管代码执行。.NET 运行时提供了多个特性,确保平台独立性并与旧版框架版本兼容。
Mono 框架 于 2005 年开始作为 .NET 框架在 Linux(Ximian/SuSe/Novell)上的实现。在 Microsoft 的赞助和 Xamarin 的领导下,Mono 是基于 ECMA 标准的通用语言运行时和 C# 的 .NET 框架的开源实现。
Xamarin 应用程序的逆向工程技术
Xamarin 程序集的反编译
反编译是从编译代码生成源代码的过程。要获取有关当前在内存中的程序集和可执行文件的信息,Windows 是一个绝佳的地方。
要打开模块窗口,请选择调试 > 窗口 > 模块。一旦您检测到需要反编译的模块,请右键单击并选择“反编译源代码到符号文件”。这个操作创建了一个包含反编译源的符号文件,反过来,让您可以直接从您的源代码进入第三方代码。
Visual Studio 即使在没有符号的情况下也可以反编译托管代码,允许您查看代码,检查变量并设置断点。要将源代码提取到磁盘,请右键单击嵌入源的模块并单击“提取嵌入源。”这将导出源文件到杂项文件夹以供进一步分析。
Xamarin 应用程序的 JIT 与 AOT 编译
这两个选项用于将基于 C# 的 Xamarin 代码编译成应用程序,即即时编译和提前编译。编译方式影响应用程序代码在 apk 或 ipa 文件中的打包方式。让我们快速看一下它:
- Android:Xamarin 允许您使用 JIT 和 AOT 标志为 android 编译。还有一种方法可以在两者之间取得平衡,使用混合 AOT 模式获得最快的执行速度。请注意,完整的 AOT 模式仅适用于企业许可证。
- iOS:在 iOS 的情况下只有一种选择,提前编译。这是由于苹果的政策禁止在设备上执行动态生成的代码。
{% hint style="info" %}
如果您遇到一个完整的 AOT 编译应用程序,并且开发者为了减少构建大小而移除了 IL 程序集文件,那么逆向过程需要一个额外的步骤,从 lib 文件夹或 libmonodroid_bundle_app.so
文件中提取 dll 文件。如果它是一个混合 AOT 编译的应用程序,并且 IL 文件仍然保留在应用程序包中,我们可以使用它来逆向工程应用程序。
{% endhint %}
从 APK/IPA 获取 dll 文件
只需解压 apk/ipa 文件并复制程序集目录下的所有文件:
在 Android APKs 的情况下,这些 dll 文件是压缩的,不能直接用于反编译。幸运的是,有一些工具可以帮助我们解压这些 dll 文件,如 XamAsmUnZ 和 xamarin-decompress。
python3 xamarin-decompress.py -o /path/to/decompressed/apk
在assemblies目录中,您可能会看到assemblies.blob
和assemblies.manifest
文件,而不是dll文件。这是一个Xamarin AssemblyStore,是目前推荐用于在Android应用程序中打包dlls的方式。assemblies.manifest
是一个文本文件,描述了二进制文件assemblies.blob
的内容。要解包这些文件,您需要使用pyxamstore。
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
在iOS的情况下,IPA文件中的dll文件可以直接加载到反编译器中(无需解压任何内容)。
当我们反编译dll文件时,可以找到大部分应用程序代码。 同时请注意,基于Xamarin框架的应用程序在所有平台(如iOS和Android等)的构建中包含90%的通用代码。
从上面的截图中,我们可以看到apk中存在的dll文件列表,我们可以确认这是一个Xamarin应用程序。它包含了应用程序特定的dll文件以及运行应用程序所需的库文件,例如Xamarin.Essentails.dll
或Mono.Security.dll
。
{% hint style="success" %} 最后,您可以使用这些推荐工具来访问DLL中的C#代码。 {% endhint %}
动态分析
尝试检查应用程序是否有任何形式的SSL pinning。如果没有,使用Burp作为系统CA应该可以用于拦截请求。Frida与Java或ObjC运行时在这里不起作用,但幸运的是,有一个工具可以用于钩入方法。
Fridax允许您轻松修改运行时Xamarin应用程序内的.NET二进制文件。静态分析将帮助您识别应用程序中存在的不同方法,这些方法可以在使用Fridax进行动态分析时被钩入。以下是一些Frida脚本,可以帮助我们绕过root检测或SSL-pinning:
参考资料
- https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers
- https://thecobraden.com/posts/unpacking_xamarin_assembly_stores/
从零开始学习AWS黑客攻击直到成为专家,通过 htARTE (HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您希望在HackTricks中看到您的公司广告或下载HackTricks的PDF,请查看订阅计划!
- 获取官方PEASS & HackTricks商品
- 发现PEASS家族,我们独家的NFTs系列
- 加入 💬 Discord群组 或 telegram群组 或在 Twitter 🐦 上关注我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享您的黑客技巧。