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)
|
**Για περισσότερες πληροφορίες δείτε:** [**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:**
|
### Γρήγορη ροή εργασίας για μια πρόσφατα αποσυμπιεσμένη `libfoo.so`
|
||||||
- Χρησιμοποιούνται για εργασίες που απαιτούν υψηλή απόδοση.
|
|
||||||
- Γραμμένες σε 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.
|
|
||||||
- Παρέχονται ασκήσεις για την πρακτική φόρτωσης βιβλιοθηκών, σύνδεσης μεθόδων και αναγνώρισης εγγενών συναρτήσεων.
|
|
||||||
|
|
||||||
### Πόροι:
|
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 συνιστάται.
|
### Δυναμική Παρακολούθηση (Frida ≥ 16)
|
||||||
- **Τεκμηρίωση JNI & NDK:**
|
|
||||||
- [Oracle's JNI Specification](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
Η σειρά 16 της Frida έφερε αρκετές βελτιώσεις ειδικά για Android που βοηθούν όταν ο στόχος χρησιμοποιεί σύγχρονες βελτιστοποιήσεις Clang/LLD:
|
||||||
- [Android's JNI Tips](https://developer.android.com/training/articles/perf-jni)
|
|
||||||
- [Getting Started with the NDK](https://developer.android.com/ndk/guides/)
|
* Ο `thumb-relocator` μπορεί τώρα να *συνδέει μικρές ARM/Thumb συναρτήσεις* που παράγονται από την επιθετική ευθυγράμμιση του LLD (`--icf=all`).
|
||||||
- **Αποσφαλμάτωση Εγγενών Βιβλιοθηκών:**
|
* Η καταμέτρηση και η επανασύνδεση *ELF import slots* λειτουργεί στο Android, επιτρέποντας την επιδιόρθωση `dlopen()`/`dlsym()` ανά μονάδα όταν οι inline hooks απορρίπτονται.
|
||||||
- [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
* Η σύνδεση 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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user