mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati
This commit is contained in:
parent
c035112e18
commit
237fbcf7fc
@ -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 <pkg> 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. citeturn5search2turn5search0
|
||||
|
||||
---
|
||||
|
||||
### Πρόσφατες ευπάθειες που αξίζει να αναζητήσετε σε APKs
|
||||
|
||||
| Έτος | CVE | Επηρεαζόμενη βιβλιοθήκη | Σημειώσεις |
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow που είναι προσβάσιμο από native code που αποκωδικοποιεί εικόνες WebP. Πολλές εφαρμογές Android περιλαμβάνουν ευάλωτες εκδόσεις. Όταν δείτε ένα `libwebp.so` μέσα σε ένα APK, ελέγξτε την έκδοσή του και προσπαθήστε να εκμεταλλευτείτε ή να διορθώσετε.| citeturn2search0|
|
||||
|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/) citeturn5search0
|
||||
- NVD advisory for `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user