From 237fbcf7fc8329c611b9efba61e464adb04a0227 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 10 Jul 2025 21:34:43 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati --- .../reversing-native-libraries.md | 115 +++++++++++++----- 1 file changed, 83 insertions(+), 32 deletions(-) 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 e80976634..9d1ec7756 100644 --- a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md +++ b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md @@ -4,41 +4,92 @@ **Για περισσότερες πληροφορίες δείτε:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) -Οι εφαρμογές Android μπορούν να χρησιμοποιούν εγγενείς βιβλιοθήκες, συνήθως γραμμένες σε C ή C++, για εργασίες που απαιτούν υψηλή απόδοση. Οι δημιουργοί κακόβουλου λογισμικού χρησιμοποιούν επίσης αυτές τις βιβλιοθήκες, καθώς είναι πιο δύσκολο να αναλυθούν σε αντίθεση με τον κωδικό DEX. Η ενότητα τονίζει τις δεξιότητες αντίστροφης μηχανικής προσαρμοσμένες για το Android, αντί να διδάσκει γλώσσες συναρμολόγησης. Παρέχονται εκδόσεις ARM και x86 των βιβλιοθηκών για συμβατότητα. +Οι εφαρμογές Android μπορούν να χρησιμοποιούν εγγενείς βιβλιοθήκες, συνήθως γραμμένες σε C ή C++, για εργασίες που απαιτούν υψηλή απόδοση. Οι δημιουργοί κακόβουλου λογισμικού εκμεταλλεύονται επίσης αυτές τις βιβλιοθήκες, καθώς τα ELF shared objects είναι ακόμα πιο δύσκολα να αποσυμπιεστούν από τον κώδικα DEX/OAT. Αυτή η σελίδα εστιάζει σε *πρακτικές* ροές εργασίας και *πρόσφατες* βελτιώσεις εργαλείων (2023-2025) που διευκολύνουν την ανάλυση των αρχείων Android `.so`. -### Κύρια Σημεία: +--- -- **Εγγενείς Βιβλιοθήκες σε Εφαρμογές Android:** -- Χρησιμοποιούνται για εργασίες που απαιτούν υψηλή απόδοση. -- Γραμμένες σε C ή C++, καθιστώντας την αντίστροφη μηχανική δύσκολη. -- Βρίσκονται σε μορφή `.so` (shared object), παρόμοια με τα εκτελέσιμα Linux. -- Οι δημιουργοί κακόβουλου λογισμικού προτιμούν τον εγγενή κώδικα για να κάνουν την ανάλυση πιο δύσκολη. -- **Java Native Interface (JNI) & Android NDK:** -- Το JNI επιτρέπει την υλοποίηση μεθόδων Java σε εγγενή κώδικα. -- Το NDK είναι ένα σύνολο εργαλείων ειδικά για το Android για τη συγγραφή εγγενή κώδικα. -- Το JNI και το NDK γεφυρώνουν τον κώδικα Java (ή Kotlin) με εγγενείς βιβλιοθήκες. -- **Φόρτωση και Εκτέλεση Βιβλιοθηκών:** -- Οι βιβλιοθήκες φορτώνονται στη μνήμη χρησιμοποιώντας `System.loadLibrary` ή `System.load`. -- Το JNI_OnLoad εκτελείται κατά τη φόρτωση της βιβλιοθήκης. -- Οι δηλωμένες από την Java εγγενείς μέθοδοι συνδέονται με εγγενείς συναρτήσεις, επιτρέποντας την εκτέλεση. -- **Σύνδεση Μεθόδων Java με Εγγενείς Συναρτήσεις:** -- **Δυναμική Σύνδεση:** Τα ονόματα συναρτήσεων στις εγγενείς βιβλιοθήκες ταιριάζουν με ένα συγκεκριμένο μοτίβο, επιτρέποντας την αυτόματη σύνδεση. -- **Στατική Σύνδεση:** Χρησιμοποιεί το `RegisterNatives` για σύνδεση, παρέχοντας ευελιξία στην ονοματολογία και τη δομή των συναρτήσεων. -- **Εργαλεία και Τεχνικές Αντίστροφης Μηχανικής:** -- Εργαλεία όπως το Ghidra και το IDA Pro βοηθούν στην ανάλυση εγγενών βιβλιοθηκών. -- Το `JNIEnv` είναι κρίσιμο για την κατανόηση των συναρτήσεων και των αλληλεπιδράσεων του JNI. -- Παρέχονται ασκήσεις για την πρακτική φόρτωσης βιβλιοθηκών, σύνδεσης μεθόδων και αναγνώρισης εγγενών συναρτήσεων. +### Γρήγορη ροή εργασίας για μια πρόσφατα αποσυμπιεσμένη `libfoo.so` -### Πόροι: +1. **Εξαγωγή της βιβλιοθήκης** +```bash +# Από μια εγκατεστημένη εφαρμογή +adb shell "run-as cat lib/arm64-v8a/libfoo.so" > libfoo.so +# Ή από το APK (zip) +unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/ +``` +2. **Καθορισμός αρχιτεκτονικής & προστασιών** +```bash +file libfoo.so # arm64 ή arm32 / x86 +readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, κ.λπ. +checksec --file libfoo.so # (peda/pwntools) +``` +3. **Καταγραφή εξαγόμενων συμβόλων & JNI bindings** +```bash +readelf -s libfoo.so | grep ' Java_' # δυναμικά συνδεδεμένο JNI +strings libfoo.so | grep -i "RegisterNatives" -n # στατικά καταχωρημένο JNI +``` +4. **Φόρτωση σε αποσυμπιεστή** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper ή Cutter/Rizin) και εκτέλεση αυτόματης ανάλυσης. Οι νεότερες εκδόσεις του Ghidra εισήγαγαν έναν αποσυμπιεστή AArch64 που αναγνωρίζει PAC/BTI stubs και MTE tags, βελτιώνοντας σημαντικά την ανάλυση βιβλιοθηκών που έχουν κατασκευαστεί με το Android 14 NDK. +5. **Απόφαση για στατική ή δυναμική ανάλυση:** ο κωδικός που έχει αφαιρεθεί ή παραποιηθεί συχνά χρειάζεται *εργαλεία παρακολούθησης* (Frida, ptrace/gdbserver, LLDB). -- **Μάθηση ARM Assembly:** -- Προτείνεται για μια πιο βαθιά κατανόηση της υποκείμενης αρχιτεκτονικής. -- [ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) από το Azeria Labs συνιστάται. -- **Τεκμηρίωση JNI & NDK:** -- [Oracle's JNI Specification](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) -- [Android's JNI Tips](https://developer.android.com/training/articles/perf-jni) -- [Getting Started with the NDK](https://developer.android.com/ndk/guides/) -- **Αποσφαλμάτωση Εγγενών Βιβλιοθηκών:** -- [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) +--- + +### Δυναμική Παρακολούθηση (Frida ≥ 16) + +Η σειρά 16 της Frida έφερε αρκετές βελτιώσεις ειδικά για Android που βοηθούν όταν ο στόχος χρησιμοποιεί σύγχρονες βελτιστοποιήσεις Clang/LLD: + +* Ο `thumb-relocator` μπορεί τώρα να *συνδέει μικρές ARM/Thumb συναρτήσεις* που παράγονται από την επιθετική ευθυγράμμιση του LLD (`--icf=all`). +* Η καταμέτρηση και η επανασύνδεση *ELF import slots* λειτουργεί στο Android, επιτρέποντας την επιδιόρθωση `dlopen()`/`dlsym()` ανά μονάδα όταν οι inline hooks απορρίπτονται. +* Η σύνδεση Java διορθώθηκε για το νέο **ART quick-entrypoint** που χρησιμοποιείται όταν οι εφαρμογές μεταγλωττίζονται με `--enable-optimizations` στο Android 14. + +Παράδειγμα: καταμέτρηση όλων των συναρτήσεων που έχουν καταχωρηθεί μέσω `RegisterNatives` και εξαγωγή των διευθύνσεών τους κατά την εκτέλεση: +```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 θα λειτουργήσει αμέσως σε συσκευές με ενεργοποιημένο PAC/BTI (Pixel 8/Android 14+) αρκεί να χρησιμοποιείτε frida-server 16.2 ή νεότερη έκδοση – παλαιότερες εκδόσεις απέτυχαν να εντοπίσουν το padding για inline hooks. citeturn5search2turn5search0 + +--- + +### Πρόσφατες ευπάθειες που αξίζει να αναζητήσετε σε APKs + +| Έτος | CVE | Επηρεαζόμενη βιβλιοθήκη | Σημειώσεις | +|------|-----|------------------|-------| +|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow που είναι προσβάσιμο από native code που αποκωδικοποιεί εικόνες WebP. Πολλές εφαρμογές Android περιλαμβάνουν ευάλωτες εκδόσεις. Όταν δείτε ένα `libwebp.so` μέσα σε ένα APK, ελέγξτε την έκδοσή του και προσπαθήστε να εκμεταλλευτείτε ή να διορθώσετε.| citeturn2search0| +|2024|Πολλαπλά|OpenSSL 3.x σειρά|Πολλά ζητήματα ασφάλειας μνήμης και padding-oracle. Πολλές συσκευασίες Flutter & ReactNative περιλαμβάνουν τη δική τους `libcrypto.so`.| + +Όταν εντοπίσετε *third-party* `.so` αρχεία μέσα σε ένα APK, ελέγξτε πάντα το hash τους σε σχέση με τις upstream συμβουλές. Η SCA (Software Composition Analysis) είναι σπάνια σε κινητές συσκευές, οπότε οι παλιές ευάλωτες εκδόσεις είναι διαδεδομένες. + +--- + +### Τάσεις Anti-Reversing & Hardening (Android 13-15) + +* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Το Android 14 ενεργοποιεί το PAC/BTI σε συστηματικές βιβλιοθήκες σε υποστηριζόμενο ARMv8.3+ silicon. Οι αποσυμπιεστές τώρα εμφανίζουν ψευδο-εντολές σχετικές με το PAC; για δυναμική ανάλυση, η Frida εισάγει trampolines *μετά* την αφαίρεση του PAC, αλλά τα προσαρμοσμένα trampolines σας θα πρέπει να καλούν `pacda`/`autibsp` όπου είναι απαραίτητο. +* **MTE & Scudo hardened allocator:** η σήμανση μνήμης είναι προαιρετική, αλλά πολλές εφαρμογές που γνωρίζουν το Play-Integrity κατασκευάζονται με `-fsanitize=memtag`; χρησιμοποιήστε `setprop arm64.memtag.dump 1` συν `adb shell am start ...` για να καταγράψετε σφάλματα σήμανσης. +* **LLVM Obfuscator (opaque predicates, control-flow flattening):** εμπορικοί πακερ (π.χ., Bangcle, SecNeo) προστατεύουν ολοένα και περισσότερο *native* κώδικα, όχι μόνο Java; αναμένετε ψευδείς ροές ελέγχου και κρυπτογραφημένα blobs συμβολοσειρών σε `.rodata`. + +--- + +### Πόροι + +- **Μάθηση ARM Assembly:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) +- **JNI & NDK Documentation:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/) +- **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) + +### Αναφορές + +- Frida 16.x change-log (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/) citeturn5search0 +- NVD advisory for `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0 {{#include ../../banners/hacktricks-training.md}}