Xamarin Apps

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

बुनियादी जानकारी

Xamarin एक ओपन-सोर्स प्लेटफ़ॉर्म है जो डेवलपर्स के लिए .NET और C# फ्रेमवर्क का उपयोग करके iOS, Android, और Windows के लिए ऐप्स बनाने के लिए डिज़ाइन किया गया है। यह प्लेटफ़ॉर्म आधुनिक एप्लिकेशन कुशलता से विकसित करने के लिए कई टूल्स और एक्सटेंशन तक पहुँच प्रदान करता है।

Xamarin का आर्किटेक्चर

  • Android के लिए, Xamarin .NET bindings के माध्यम से Android और Java namespaces के साथ एकीकृत होता है, और Mono execution environment के भीतर Android Runtime (ART) के साथ चलता है। Managed Callable Wrappers (MCW) और Android Callable Wrappers (ACW) Mono और ART के बीच संचार को आसान बनाते हैं, और दोनों Linux kernel पर आधारित हैं।
  • iOS पर, एप्लिकेशन Mono runtime के अंतर्गत चलते हैं, और पूरा Ahead of Time (AOT) compilation उपयोग करके C# .NET कोड को ARM assembly भाषा में परिवर्तित करते हैं। यह प्रक्रिया Objective-C Runtime के साथ एक UNIX-like kernel पर चलती है।

.NET Runtime और Mono Framework

.NET framework में application development के लिए assemblies, classes, और namespaces शामिल होते हैं, और .NET Runtime कोड के execution का प्रबंधन करता है। यह प्लेटफ़ॉर्म स्वतंत्रता और backward compatibility प्रदान करता है। Mono Framework .NET framework का एक ओपन-सोर्स संस्करण है, जिसे 2005 में .NET को Linux तक विस्तारित करने के लिए शुरू किया गया था; अब यह Microsoft द्वारा समर्थित है और Xamarin द्वारा नेतृत्व किया जाता है।

Xamarin Apps का रिवर्स इंजीनियरिंग

Xamarin Assemblies का डीकम्पाइलेशन

डीकम्पाइलेशन संकलित (compiled) कोड को वापस सोर्स कोड में बदल देता है। Windows में, Visual Studio की Modules विंडो डिकम्पाइलेशन के लिए मॉड्यूल पहचान सकती है, जिससे थर्ड-पार्टी कोड तक सीधे पहुँच और विश्लेषण के लिए सोर्स कोड निकालने की सुविधा मिलती है।

JIT बनाम AOT Compilation

  • Android Just-In-Time (JIT) और Ahead-Of-Time (AOT) compilation का समर्थन करता है, और execution speed के लिए Hybrid AOT मोड भी उपलब्ध है। Full AOT केवल Enterprise लाइसेंस के लिए उपलब्ध है।
  • iOS केवल AOT compilation का उपयोग करता है, क्योंकि Apple के dynamic code execution पर प्रतिबंध हैं।

APK/IPA से dll फ़ाइलें निकालना

APK/IPA में मौजूद assemblies तक पहुँचने के लिए, फ़ाइल को unzip करें और assemblies directory का पता लगाएं। Android के लिए, XamAsmUnZ और xamarin-decompress जैसे टूल dll फाइलों को अनकम्प्रेस कर सकते हैं।

python3 xamarin-decompress.py -o /path/to/decompressed/apk

कुछ मामलों में, APK को decompile करने के बाद unknown/assemblies/ फ़ोल्डर के अंदर .dll फाइलें दिखाई देती हैं, तब आप सीधे dnSpy का उपयोग करके उन .dlls का विश्लेषण कर सकते हैं। हालांकि, कभी-कभी unknown/assemblies/ फ़ोल्डर के अंदर assemblies.blob और assemblies.manifest फाइलें होती हैं। टूल pyxamstore Xamarin apps में assemblies.blob फाइल को अनपैक कर सकता है, जिससे आगे के विश्लेषण के लिए .NET assemblies तक पहुँच मिलती है:

pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack

.NET MAUI 9 / .NET for Android assembly स्टोर्स ELF .so के अंदर

हाल के Android MAUI 9 builds अब सीधे assemblies.blob उपलब्ध नहीं कराते। इसके बजाय, प्रत्येक ABI एक ELF container के साथ आता है, जैसे lib/arm64-v8a/libassemblies.arm64-v8a.blob.so। यह एक valid shared library है जिसमें एक custom payload सेक्शन होता है जो managed assembly स्टोर को रखता है।

त्वरित कार्यप्रवाह:

unzip app.apk -d app_unpacked
llvm-readelf --section-headers app_unpacked/lib/arm64-v8a/libassemblies.arm64-v8a.blob.so
llvm-objcopy --dump-section=payload=payload.bin \
app_unpacked/lib/arm64-v8a/libassemblies.arm64-v8a.blob.so
hexdump -c -n 4 payload.bin   # XABA

If llvm-readelf shows a payload section, dump it and verify the extracted blob starts with XABA (0x41424158). That payload is the assembly store documented by .NET for Android, not a single DLL.

जब llvm-readelf एक payload सेक्शन दिखाए, तो इसे डंप करें और सुनिश्चित करें कि निकाला गया blob XABA (0x41424158) से शुरू होता है। यह payload .NET for Android द्वारा दस्तावेज़ित assembly store है, एक single DLL नहीं।

The store layout is useful when you need to carve assemblies manually or validate an extractor:

  • Header: struct.unpack('<5I', ...) for magic, version, entry_count, index_entry_count, index_size
  • Descriptors: entry_count records of struct.unpack('<7I', ...) with data_offset / data_size and optional debug/config offsets
  • Index: skip index_size bytes
  • Names: uint32 length + UTF-8 bytes
  • Data: seek to each data_offset and write data_size bytes as <name>.dll

स्टोर लेआउट उपयोगी होता है जब आपको assemblies को मैन्युअली carve करने या किसी extractor को validate करने की ज़रूरत हो:

  • हेडर: struct.unpack('<5I', ...) जिसमें magic, version, entry_count, index_entry_count, index_size होते हैं
  • डिस्क्रिप्टर्स: entry_count रिकॉर्ड्स of struct.unpack('<7I', ...) जिनमें data_offset / data_size और वैकल्पिक debug/config offsets होते हैं
  • इंडेक्स: index_size बाइट्स को स्किप करें
  • नाम: uint32 length + UTF-8 बाइट्स
  • डाटा: हर data_offset पर seek करें और data_size बाइट्स को <name>.dll के रूप में लिखें

Some extracted entries still won’t open directly in dnSpy/ILSpy/dotPeek because they are additionally wrapped with XALZ. In that case:

  • Check the first 4 bytes of each extracted file for XALZ
  • Read the uncompressed size from bytes 8:12 as little-endian uint32
  • Decompress bytes 12: with lz4.block.decompress(...)

कुछ निकाले गए एंट्रीज़ सीधे dnSpy/ILSpy/dotPeek में नहीं खुलते क्योंकि वे अतिरिक्त रूप से XALZ से wrapped होते हैं। ऐसी स्थिति में:

  • प्रत्येक निकाले गए फ़ाइल के पहले 4 बाइट्स को XALZ के लिए देखें
  • bytes 8:12 से little-endian uint32 के रूप में uncompressed size पढ़ें
  • bytes 12: को lz4.block.decompress(...) से decompress करें

Minimal decompression logic:

न्यूनतम decompression लॉजिक:

import struct
import lz4.block

def decompress_xalz(data):
size = struct.unpack('<I', data[8:12])[0]
return lz4.block.decompress(data[12:], uncompressed_size=size)

यदि आप store को मैन्युअली पार्स नहीं करना चाहते हैं, तो pymauistore MAUI 9 APKs के लिए ELF payload extraction, XABA store parsing, और XALZ decompression को स्वचालित करता है।

कुछ पुराने Xamarin/MAUI builds संकुचित assemblies को XALZ फॉर्मेट में /assemblies.blob या /resources/assemblies के अंदर स्टोर करते हैं। आप उन्हें xamarout लाइब्रेरी के साथ जल्दी से decompress कर सकते हैं:

from xamarout import xalz
import os
for root, _, files in os.walk("."):
for f in files:
if open(os.path.join(root, f), 'rb').read(4) == b"XALZ":
xa = xalz.XamarinCompressedAssembly(os.path.join(root, f))
xa.write("decompressed/" + f)

iOS dll files decompilation के लिए आसानी से उपलब्ध होते हैं, जो एप्लिकेशन कोड के महत्वपूर्ण हिस्सों का खुलासा करते हैं, जो अक्सर विभिन्न प्लेटफ़ॉर्म के बीच एक सामान्य बेस साझा करते हैं।

AOT on iOS: managed IL native *.aotdata.* files में compiled होता है। सिर्फ DLL को Patching करने से logic नहीं बदलेगा; आपको native stubs को hook करना होगा (e.g., with Frida) क्योंकि IL bodies खाली placeholders होते हैं।

Static Analysis

Once the .dlls are obtained it’s possible to analyze the .Net code statically using tools such as dnSpy or ILSpy that will allow modifying the code of the app. यह application को tamper करके protections bypass करने के लिए बहुत उपयोगी हो सकता है।
ध्यान दें कि app को modify करने के बाद आपको उसे फिर से pack और फिर से sign करना होगा।

dnSpy अब archived है; maintained forks जैसे dnSpyEx .NET 8/MAUI assemblies के साथ काम करते रहते हैं और re-saving पर debug symbols को preserve करते हैं।

Dynamic Analysis

Dynamic analysis में SSL pinning की जाँच करना और Xamarin apps में .NET binary के runtime modifications के लिए Fridax जैसे tools का उपयोग करना शामिल है। Frida scripts root detection या SSL pinning को bypass करने के लिए उपलब्ध हैं, जिससे analysis capabilities बढ़ती हैं।

Other interesting Frida scripts:

Updated Frida-xamarin-unpin (Mono >=6) hooks System.Net.Http.HttpClient.SendAsync and swaps the handler to a permissive one, so it still works even when pinning is implemented in custom handlers. Run it after the app starts:

frida -U -l dist/xamarin-unpin.js com.target.app --no-pause

बंडल किए गए frida-mono-api के साथ managed methods को hook करने के लिए त्वरित टेम्पलेट:

const mono = require('frida-mono-api');
Mono.ensureInitialized();
Mono.enumerateLoadedImages().forEach(i => console.log(i.name));
const klass = Mono.classFromName("Namespace", "Class");
const m = Mono.methodFromName(klass, "Method", 2);
Mono.intercept(m, { onEnter(args){ console.log(args[1].toInt32()); } });

पुनः साइन करना

यह टूल Uber APK Signer एक ही key से कई APKs पर साइन करना सरल बनाता है, और किसी ऐप में बदलाव करने के बाद उसे पुनः साइन करने के लिए उपयोग किया जा सकता है।

संदर्भ

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें