diff --git a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md index 2d4171f75..15366500d 100644 --- a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md +++ b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md @@ -1,44 +1,96 @@ -# Kurekebisha Maktaba za Asili +# Reversing Native Libraries {{#include ../../banners/hacktricks-training.md}} **Kwa maelezo zaidi angalia:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) -Programu za Android zinaweza kutumia maktaba za asili, ambazo kwa kawaida zimeandikwa kwa C au C++, kwa kazi zinazohitaji utendaji mzito. Waumbaji wa programu za hasara pia hutumia maktaba hizi, kwani ni ngumu zaidi kuzirekebisha kuliko DEX bytecode. Sehemu hii inasisitiza ujuzi wa kurekebisha unaolengwa kwa Android, badala ya kufundisha lugha za mkusanyiko. Toleo za ARM na x86 za maktaba zinapatikana kwa ajili ya ulinganifu. +Programu za Android zinaweza kutumia maktaba za asili, ambazo kwa kawaida zimeandikwa kwa C au C++, kwa kazi zinazohitaji utendaji wa juu. Waumbaji wa programu za hasara pia wanatumia vibaya maktaba hizi kwa sababu vitu vya ELF vinavyoshirikiwa bado ni vigumu zaidi kutafsiri kuliko nambari ya byte ya DEX/OAT. Ukurasa huu unalenga kwenye *mifumo ya kazi* ya *vitendo* na *mboresho* ya zana za hivi karibuni (2023-2025) ambazo zinafanya kurudi nyuma kwa faili za Android `.so` kuwa rahisi. -### Vidokezo Muhimu: +--- -- **Maktaba za Asili katika Programu za Android:** -- Zinatumika kwa kazi zinazohitaji utendaji mzito. -- Zimeandikwa kwa C au C++, na kufanya kurekebisha kuwa ngumu. -- Zinapatikana katika muundo wa `.so` (kipande kilichoshirikiwa), sawa na binaries za Linux. -- Waumbaji wa programu za hasara wanapendelea msimbo wa asili ili kufanya uchambuzi kuwa mgumu. -- **Java Native Interface (JNI) & Android NDK:** -- JNI inaruhusu mbinu za Java kutekelezwa katika msimbo wa asili. -- NDK ni seti maalum ya zana za Android za kuandika msimbo wa asili. -- JNI na NDK huunganisha msimbo wa Java (au Kotlin) na maktaba za asili. -- **Kuweka na Kutekeleza Maktaba:** -- Maktaba zinawekwa kwenye kumbukumbu kwa kutumia `System.loadLibrary` au `System.load`. -- JNI_OnLoad inatekelezwa wakati wa kuweka maktaba. -- Mbinu za asili zilizotangazwa na Java huunganisha na kazi za asili, kuruhusu utekelezaji. -- **Kuunganisha Mbinu za Java na Kazi za Asili:** -- **Kuunganisha Kitaalamu:** Majina ya kazi katika maktaba za asili yanalingana na muundo maalum, kuruhusu kuunganisha kiotomatiki. -- **Kuunganisha Kikatiba:** Inatumia `RegisterNatives` kwa kuunganisha, ikitoa kubadilika katika majina na muundo wa kazi. -- **Zana na Mbinu za Kurekebisha:** -- Zana kama Ghidra na IDA Pro husaidia kuchambua maktaba za asili. -- `JNIEnv` ni muhimu kwa kuelewa kazi na mwingiliano wa JNI. -- Mazoezi yanatolewa ili kufanyia mazoezi kuweka maktaba, kuunganisha mbinu, na kutambua kazi za asili. +### Mchakato wa haraka wa triage kwa `libfoo.so` iliyovutwa hivi karibuni -### Rasilimali: +1. **Toa maktaba** +```bash +# Kutoka kwa programu iliyosakinishwa +adb shell "run-as cat lib/arm64-v8a/libfoo.so" > libfoo.so +# Au kutoka kwa APK (zip) +unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/ +``` +2. **Tambua usanifu & ulinzi** +```bash +file libfoo.so # arm64 au arm32 / x86 +readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, nk. +checksec --file libfoo.so # (peda/pwntools) +``` +3. **Orodhesha alama zilizotolewa & viunganishi vya JNI** +```bash +readelf -s libfoo.so | grep ' Java_' # JNI iliyo na kiungo cha dinamik +strings libfoo.so | grep -i "RegisterNatives" -n # JNI iliyoandikishwa kwa statiki +``` +4. **Pakia kwenye decompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper au Cutter/Rizin) na uendeshe uchambuzi wa kiotomatiki. +Toleo jipya la Ghidra limeleta decompiler ya AArch64 inayotambua PAC/BTI stubs na MTE tags, ikiboresha sana uchambuzi wa maktaba zilizojengwa na Android 14 NDK. +5. **Amua kati ya kurudi nyuma kwa statiki na dinamik:** nambari iliyondolewa, iliyofichwa mara nyingi inahitaji *kufanya kazi* (Frida, ptrace/gdbserver, LLDB). -- **Kujifunza Mkusanyiko wa ARM:** -- Inapendekezwa kwa kuelewa kwa kina muundo wa msingi. -- [Msingi wa Mkusanyiko wa ARM](https://azeria-labs.com/writing-arm-assembly-part-1/) kutoka Azeria Labs inapendekezwa. -- **Hati za JNI & NDK:** -- [Maelezo ya JNI ya Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) -- [Vidokezo vya JNI vya Android](https://developer.android.com/training/articles/perf-jni) -- [Kuanza na NDK](https://developer.android.com/ndk/guides/) -- **Kukarabati Maktaba za Asili:** -- [Kukarabati Maktaba za Asili za Android kwa Kutumia JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) +--- + +### Ufunguo wa Dinamik (Frida ≥ 16) + +Mfululizo wa 16 wa Frida ulileta maboresho kadhaa maalum kwa Android ambayo yanasaidia wakati lengo linatumia uboreshaji wa kisasa wa Clang/LLD: + +* `thumb-relocator` sasa inaweza *kuunganisha kazi ndogo za ARM/Thumb* zinazozalishwa na usawa mkali wa LLD (`--icf=all`). +* Kuorodhesha na kuunganisha *vitu vya uagizaji vya ELF* inafanya kazi kwenye Android, ikiruhusu urekebishaji wa `dlopen()`/`dlsym()` kwa kila moduli wakati viunganishi vya ndani vinakataliwa. +* Kuunganisha Java kuliwekwa sawa kwa **ART quick-entrypoint** mpya inayotumika wakati programu zinapojengwa na `--enable-optimizations` kwenye Android 14. + +Mfano: kuorodhesha kazi zote zilizorekebishwa kupitia `RegisterNatives` na kutupa anwani zao wakati wa wakati wa kukimbia: +```javascript +Java.perform(function () { +var Runtime = Java.use('java.lang.Runtime'); +var register = Module.findExportByName(null, 'RegisterNatives'); +Interceptor.attach(register, { +onEnter(args) { +var envPtr = args[0]; +var clazz = Java.cast(args[1], Java.use('java.lang.Class')); +var methods = args[2]; +var count = args[3].toInt32(); +console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' methods'); +// iterate & dump (JNI nativeMethod struct: name, sig, fnPtr) +} +}); +}); +``` +Frida itafanya kazi moja kwa moja kwenye vifaa vya PAC/BTI (Pixel 8/Android 14+) mradi utumie frida-server 16.2 au baadaye – toleo la awali lilishindwa kupata padding kwa ajili ya hooks za ndani. citeturn5search2turn5search0 + +--- + +### Uthibitisho wa hivi karibuni unaofaa kutafutwa katika APKs + +| Mwaka | CVE | Maktaba iliyoathirika | Maelezo | +|------|-----|------------------|-------| +|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Overflow ya buffer ya heap inayoweza kufikiwa kutoka kwa msimbo wa asili unaodecode picha za WebP. Programu kadhaa za Android zinakusanya toleo zenye udhaifu. Unapokutana na `libwebp.so` ndani ya APK, angalia toleo lake na jaribu kutumia au kurekebisha.| citeturn2search0| +|2024|Mbalimbali|Mfululizo wa OpenSSL 3.x|Masuala kadhaa ya usalama wa kumbukumbu na padding-oracle. Mifuko mingi ya Flutter & ReactNative inasafirisha `libcrypto.so` zao wenyewe.| + +Unapokutana na *faili za .so* za upande wa tatu ndani ya APK, kila wakati thibitisha hash zao dhidi ya taarifa za juu. SCA (Software Composition Analysis) sio ya kawaida kwenye simu, hivyo toleo za zamani zenye udhaifu ni nyingi. + +--- + +### Mwelekeo wa Kupinga Kurejea & Kuimarisha (Android 13-15) + +* **Uthibitisho wa Pointer (PAC) & Utambulisho wa Lengo la Tawi (BTI):** Android 14 inaruhusu PAC/BTI katika maktaba za mfumo kwenye silicon inayounga mkono ARMv8.3+. Decompilers sasa zinaonyesha pseudo-maagizo yanayohusiana na PAC; kwa uchambuzi wa dynamic Frida inaingiza trampolines *baada ya* kuondoa PAC, lakini trampolines zako za kawaida zinapaswa kuita `pacda`/`autibsp` inapohitajika. +* **MTE & Scudo allocator iliyoimarishwa:** utagu wa kumbukumbu ni wa hiari lakini programu nyingi zinazojua Play-Integrity zinajengwa na `-fsanitize=memtag`; tumia `setprop arm64.memtag.dump 1` pamoja na `adb shell am start ...` ili kukamata makosa ya tag. +* **LLVM Obfuscator (predicates zisizo wazi, kupunguza mtiririko wa udhibiti):** pakers za kibiashara (mfano, Bangcle, SecNeo) zinaendelea kulinda *msimbo* wa asili, sio tu Java; tarajia mtiririko wa udhibiti wa uwongo na blobs za nyuzi zilizofichwa katika `.rodata`. + +--- + +### Rasilimali + +- **Kujifunza ARM Assembly:** [Azeria Labs – Misingi ya ARM Assembly](https://azeria-labs.com/writing-arm-assembly-part-1/) +- **Dokumentesheni ya JNI & NDK:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Vidokezo vya Android JNI](https://developer.android.com/training/articles/perf-jni) · [Miongozo ya NDK](https://developer.android.com/ndk/guides/) +- **Kukarabati Maktaba za Asili:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) + +### Marejeleo + +- Frida 16.x change-log (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/) citeturn5search0 +- NVD advisory kwa `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0 {{#include ../../banners/hacktricks-training.md}}