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/smali-changes.
This commit is contained in:
parent
e852931e9b
commit
765773b6ea
@ -1,12 +1,12 @@
|
|||||||
# Ανάλυση Κακόβουλου Λογισμικού
|
# Malware Analysis
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Φύλλα Συμβουλών Ψηφιακής Εγκληματολογίας
|
## Forensics CheatSheets
|
||||||
|
|
||||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||||
|
|
||||||
## Διαδικτυακές Υπηρεσίες
|
## Online Υπηρεσίες
|
||||||
|
|
||||||
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||||
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||||
@ -14,7 +14,7 @@
|
|||||||
- [Intezer](https://analyze.intezer.com)
|
- [Intezer](https://analyze.intezer.com)
|
||||||
- [Any.Run](https://any.run/)
|
- [Any.Run](https://any.run/)
|
||||||
|
|
||||||
## Εργαλεία Αντιϊικού και Ανίχνευσης Εκτός Διαδικτύου
|
## Εργαλεία Antivirus και Ανίχνευσης εκτός σύνδεσης
|
||||||
|
|
||||||
### Yara
|
### Yara
|
||||||
|
|
||||||
@ -22,10 +22,10 @@
|
|||||||
```bash
|
```bash
|
||||||
sudo apt-get install -y yara
|
sudo apt-get install -y yara
|
||||||
```
|
```
|
||||||
#### Ετοιμάστε κανόνες
|
#### Προετοιμασία κανόνων
|
||||||
|
|
||||||
Χρησιμοποιήστε αυτό το σενάριο για να κατεβάσετε και να συγχωνεύσετε όλους τους κανόνες yara malware από το github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
Χρησιμοποιήστε αυτό το script για να κατεβάσετε και να συγχωνεύσετε όλους τους yara κανόνες για malware από github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||||
Δημιουργήστε τον φάκελο _**rules**_ και εκτελέστε το. Αυτό θα δημιουργήσει ένα αρχείο με όνομα _**malware_rules.yar**_ που περιέχει όλους τους κανόνες yara για malware.
|
Δημιουργήστε τον φάκελο _**rules**_ και εκτελέστε το script. Αυτό θα δημιουργήσει ένα αρχείο με το όνομα _**malware_rules.yar**_ το οποίο περιέχει όλους τους yara κανόνες για malware.
|
||||||
```bash
|
```bash
|
||||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||||
mkdir rules
|
mkdir rules
|
||||||
@ -36,9 +36,9 @@ python malware_yara_rules.py
|
|||||||
yara -w malware_rules.yar image #Scan 1 file
|
yara -w malware_rules.yar image #Scan 1 file
|
||||||
yara -w malware_rules.yar folder #Scan the whole folder
|
yara -w malware_rules.yar folder #Scan the whole folder
|
||||||
```
|
```
|
||||||
#### YaraGen: Έλεγχος για κακόβουλο λογισμικό και Δημιουργία κανόνων
|
#### YaraGen: Έλεγχος για malware και Δημιουργία yara rules
|
||||||
|
|
||||||
Μπορείτε να χρησιμοποιήσετε το εργαλείο [**YaraGen**](https://github.com/Neo23x0/yarGen) για να δημιουργήσετε κανόνες yara από ένα δυαδικό αρχείο. Δείτε αυτά τα σεμινάρια: [**Μέρος 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Μέρος 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Μέρος 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
|
Μπορείτε να χρησιμοποιήσετε το εργαλείο [**YaraGen**](https://github.com/Neo23x0/yarGen) για να δημιουργήσετε yara rules από ένα binary. Δείτε αυτά τα tutorials: [**Part 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Part 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Part 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
|
||||||
```bash
|
```bash
|
||||||
python3 yarGen.py --update
|
python3 yarGen.py --update
|
||||||
python3.exe yarGen.py --excludegood -m ../../mals/
|
python3.exe yarGen.py --excludegood -m ../../mals/
|
||||||
@ -57,25 +57,25 @@ clamscan folderpath #Scan the whole folder
|
|||||||
```
|
```
|
||||||
### [Capa](https://github.com/mandiant/capa)
|
### [Capa](https://github.com/mandiant/capa)
|
||||||
|
|
||||||
**Capa** ανιχνεύει δυνητικά κακόβουλες **ικανότητες** σε εκτελέσιμα: PE, ELF, .NET. Έτσι θα βρει πράγματα όπως τακτικές Att\&ck ή ύποπτες ικανότητες όπως:
|
**Capa** ανιχνεύει ενδεχομένως κακόβουλες **δυνατότητες** σε εκτελέσιμα: PE, ELF, .NET. Έτσι θα εντοπίσει πράγματα όπως Att\&ck tactics, ή ύποπτες δυνατότητες όπως:
|
||||||
|
|
||||||
- έλεγχος για σφάλμα OutputDebugString
|
- έλεγχος για σφάλμα OutputDebugString
|
||||||
- εκτέλεση ως υπηρεσία
|
- εκτέλεση ως υπηρεσία
|
||||||
- δημιουργία διαδικασίας
|
- δημιουργία διεργασίας
|
||||||
|
|
||||||
Αποκτήστε το στο [**Github repo**](https://github.com/mandiant/capa).
|
Κατεβάστε το από το [**Github repo**](https://github.com/mandiant/capa).
|
||||||
|
|
||||||
### IOCs
|
### IOCs
|
||||||
|
|
||||||
IOC σημαίνει Δείκτης Συμβιβασμού. Ένα IOC είναι ένα σύνολο **συνθηκών που προσδιορίζουν** κάποιο δυνητικά ανεπιθύμητο λογισμικό ή επιβεβαιωμένο **κακόβουλο λογισμικό**. Οι Blue Teams χρησιμοποιούν αυτόν τον τύπο ορισμού για να **αναζητούν αυτόν τον τύπο κακόβουλων αρχείων** στα **συστήματα** και **δίκτυά** τους.\
|
IOC σημαίνει Indicator Of Compromise. Ένα IOC είναι ένα σύνολο **συνθηκών που εντοπίζουν** κάποιο πιθανώς ανεπιθύμητο λογισμικό ή επιβεβαιωμένο **malware**. Οι Blue Teams χρησιμοποιούν αυτόν τον τύπο ορισμού για να **αναζητούν αυτού του είδους τα κακόβουλα αρχεία** στα **systems** και τα **networks**.\
|
||||||
Η κοινή χρήση αυτών των ορισμών είναι πολύ χρήσιμη καθώς όταν ανιχνεύεται κακόβουλο λογισμικό σε έναν υπολογιστή και δημιουργείται ένα IOC για αυτό το κακόβουλο λογισμικό, άλλες Blue Teams μπορούν να το χρησιμοποιήσουν για να προσδιορίσουν το κακόβουλο λογισμικό πιο γρήγορα.
|
Η ανταλλαγή αυτών των ορισμών είναι πολύ χρήσιμη, καθώς όταν το malware εντοπιστεί σε έναν υπολογιστή και δημιουργηθεί ένα IOC για αυτό, άλλες Blue Teams μπορούν να το χρησιμοποιήσουν για να αναγνωρίσουν το malware πιο γρήγορα.
|
||||||
|
|
||||||
Ένα εργαλείο για τη δημιουργία ή την τροποποίηση IOCs είναι το [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
Ένα εργαλείο για τη δημιουργία ή τροποποίηση IOCs είναι [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||||
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως το [**Redline**](https://www.fireeye.com/services/freeware/redline.html) για να **αναζητήσετε καθορισμένα IOCs σε μια συσκευή**.
|
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**Redline**](https://www.fireeye.com/services/freeware/redline.html) για να **αναζητήσετε καθορισμένα IOCs σε μια συσκευή**.
|
||||||
|
|
||||||
### Loki
|
### Loki
|
||||||
|
|
||||||
[**Loki**](https://github.com/Neo23x0/Loki) είναι ένας σαρωτής για Απλούς Δείκτες Συμβιβασμού.\
|
[**Loki**](https://github.com/Neo23x0/Loki) είναι ένας scanner για Simple Indicators of Compromise.\
|
||||||
Η ανίχνευση βασίζεται σε τέσσερις μεθόδους ανίχνευσης:
|
Η ανίχνευση βασίζεται σε τέσσερις μεθόδους ανίχνευσης:
|
||||||
```
|
```
|
||||||
1. File Name IOC
|
1. File Name IOC
|
||||||
@ -92,41 +92,41 @@ Compares process connection endpoints with C2 IOCs (new since version v.10)
|
|||||||
```
|
```
|
||||||
### Linux Malware Detect
|
### Linux Malware Detect
|
||||||
|
|
||||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) είναι ένας σαρωτής κακόβουλου λογισμικού για Linux που κυκλοφορεί υπό την άδεια GNU GPLv2, σχεδιασμένος γύρω από τις απειλές που αντιμετωπίζονται σε κοινά φιλοξενούμενα περιβάλλοντα. Χρησιμοποιεί δεδομένα απειλών από συστήματα ανίχνευσης εισβολών στο δίκτυο για να εξάγει κακόβουλο λογισμικό που χρησιμοποιείται ενεργά σε επιθέσεις και δημιουργεί υπογραφές για ανίχνευση. Επιπλέον, τα δεδομένα απειλών προέρχονται επίσης από υποβολές χρηστών με τη δυνατότητα checkout του LMD και πόρους της κοινότητας κακόβουλου λογισμικού.
|
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) είναι ένας malware σαρωτής για Linux που διανέμεται υπό την άδεια GNU GPLv2 και έχει σχεδιαστεί για τις απειλές που αντιμετωπίζονται σε περιβάλλοντα κοινής φιλοξενίας. Χρησιμοποιεί δεδομένα απειλών από συστήματα ανίχνευσης εισβολών στο άκρο του δικτύου για να εξάγει malware που χρησιμοποιείται ενεργά σε επιθέσεις και να δημιουργεί υπογραφές για την ανίχνευση. Επιπλέον, δεδομένα απειλών προέρχονται επίσης από υποβολές χρηστών μέσω της δυνατότητας LMD checkout και από πόρους της κοινότητας malware.
|
||||||
|
|
||||||
### rkhunter
|
### rkhunter
|
||||||
|
|
||||||
Εργαλεία όπως το [**rkhunter**](http://rkhunter.sourceforge.net) μπορούν να χρησιμοποιηθούν για να ελέγξουν το σύστημα αρχείων για πιθανά **rootkits** και κακόβουλο λογισμικό.
|
Εργαλεία όπως [**rkhunter**](http://rkhunter.sourceforge.net) μπορούν να χρησιμοποιηθούν για να ελέγξουν το σύστημα αρχείων για πιθανά **rootkits** και malware.
|
||||||
```bash
|
```bash
|
||||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||||
```
|
```
|
||||||
### FLOSS
|
### FLOSS
|
||||||
|
|
||||||
[**FLOSS**](https://github.com/mandiant/flare-floss) είναι ένα εργαλείο που θα προσπαθήσει να βρει κρυμμένες συμβολοσειρές μέσα σε εκτελέσιμα αρχεία χρησιμοποιώντας διάφορες τεχνικές.
|
[**FLOSS**](https://github.com/mandiant/flare-floss) είναι ένα εργαλείο που θα προσπαθήσει να βρει obfuscated strings μέσα σε executables χρησιμοποιώντας διάφορες τεχνικές.
|
||||||
|
|
||||||
### PEpper
|
### PEpper
|
||||||
|
|
||||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper)ελέγχει κάποια βασικά στοιχεία μέσα στο εκτελέσιμο (δυαδικά δεδομένα, εντροπία, URLs και IPs, κάποιους κανόνες yara).
|
[PEpper ](https://github.com/Th3Hurrican3/PEpper) ελέγχει κάποια βασικά πράγματα μέσα στο executable (binary data, entropy, URLs and IPs, some yara rules).
|
||||||
|
|
||||||
### PEstudio
|
### PEstudio
|
||||||
|
|
||||||
[PEstudio](https://www.winitor.com/download) είναι ένα εργαλείο που επιτρέπει την απόκτηση πληροφοριών για εκτελέσιμα Windows όπως εισαγωγές, εξαγωγές, κεφαλίδες, αλλά θα ελέγξει επίσης το virus total και θα βρει πιθανές τεχνικές Att\&ck.
|
[PEstudio](https://www.winitor.com/download) είναι ένα εργαλείο που επιτρέπει την άντληση πληροφοριών από Windows executables όπως imports, exports, headers, αλλά θα ελέγχει επίσης το virus total και θα εντοπίζει πιθανές Att\&ck τεχνικές.
|
||||||
|
|
||||||
### Detect It Easy(DiE)
|
### Detect It Easy(DiE)
|
||||||
|
|
||||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) είναι ένα εργαλείο για να ανιχνεύει αν ένα αρχείο είναι **κρυπτογραφημένο** και επίσης να βρίσκει **πακετάρισμα**.
|
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) είναι ένα εργαλείο για να ανιχνεύσει αν ένα αρχείο είναι **encrypted** και επίσης να βρει **packers**.
|
||||||
|
|
||||||
### NeoPI
|
### NeoPI
|
||||||
|
|
||||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)είναι ένα σενάριο Python που χρησιμοποιεί μια ποικιλία **στατιστικών μεθόδων** για να ανιχνεύει **κρυμμένο** και **κρυπτογραφημένο** περιεχόμενο μέσα σε αρχεία κειμένου/σεναρίων. Ο προορισμός του NeoPI είναι να βοηθήσει στην **ανίχνευση κρυφού κώδικα web shell**.
|
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) είναι ένα Python script που χρησιμοποιεί μια ποικιλία από **statistical methods** για να εντοπίσει **obfuscated** και **encrypted** περιεχόμενο μέσα σε text/script αρχεία. Ο σκοπός του NeoPI είναι να βοηθήσει στην **detection of hidden web shell code**.
|
||||||
|
|
||||||
### **php-malware-finder**
|
### **php-malware-finder**
|
||||||
|
|
||||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) κάνει το καλύτερο δυνατό για να ανιχνεύσει **κρυμμένο**/**ύποπτο κώδικα** καθώς και αρχεία που χρησιμοποιούν συναρτήσεις **PHP** που συχνά χρησιμοποιούνται σε **malwares**/webshells.
|
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) προσπαθεί όσο μπορεί να εντοπίσει **obfuscated**/**dodgy code** καθώς και αρχεία που χρησιμοποιούν **PHP** functions που συχνά χρησιμοποιούνται σε **malwares**/webshells.
|
||||||
|
|
||||||
### Apple Binary Signatures
|
### Apple Binary Signatures
|
||||||
|
|
||||||
Όταν ελέγχετε κάποιο **δείγμα malware** θα πρέπει πάντα να **ελέγχετε την υπογραφή** του δυαδικού αρχείου καθώς ο **προγραμματιστής** που το υπέγραψε μπορεί ήδη να είναι **σχετικός** με **malware.**
|
Κατά τον έλεγχο κάποιου **malware sample** θα πρέπει πάντα να **check the signature** του binary καθώς ο **developer** που το υπέγραψε μπορεί να είναι ήδη **related** με **malware.**
|
||||||
```bash
|
```bash
|
||||||
#Get signer
|
#Get signer
|
||||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||||
@ -139,27 +139,39 @@ spctl --assess --verbose /Applications/Safari.app
|
|||||||
```
|
```
|
||||||
## Τεχνικές Ανίχνευσης
|
## Τεχνικές Ανίχνευσης
|
||||||
|
|
||||||
### Συσσώρευση Αρχείων
|
### File Stacking
|
||||||
|
|
||||||
Αν γνωρίζετε ότι κάποιο φάκελο που περιέχει τα **αρχεία** ενός web server **ενημερώθηκε τελευταία σε κάποια ημερομηνία**. **Ελέγξτε** την **ημερομηνία** που δημιουργήθηκαν και τροποποιήθηκαν όλα τα **αρχεία** στον **web server** και αν κάποια ημερομηνία είναι **ύποπτη**, ελέγξτε αυτό το αρχείο.
|
Αν γνωρίζετε ότι κάποιος φάκελος που περιέχει τα **αρχεία** ενός web server ενημερώθηκε **τελευταία σε κάποια ημερομηνία**, **ελέγξτε** την **ημερομηνία** κατά την οποία όλα τα **αρχεία** στον **web server δημιουργήθηκαν και τροποποιήθηκαν** και αν κάποια ημερομηνία είναι **ύποπτη**, ελέγξτε εκείνο το αρχείο.
|
||||||
|
|
||||||
### Βασικές Γραμμές
|
### Baselines
|
||||||
|
|
||||||
Αν τα αρχεία ενός φακέλου **δεν έπρεπε να έχουν τροποποιηθεί**, μπορείτε να υπολογίσετε το **hash** των **αρχικών αρχείων** του φακέλου και να **συγκρίνετε** τα με τα **τρέχοντα**. Οτιδήποτε τροποποιηθεί θα είναι **ύποπτο**.
|
Αν τα αρχεία ενός φακέλου **δεν έπρεπε να είχαν τροποποιηθεί**, μπορείτε να υπολογίσετε το **hash** των **αρχικών αρχείων** του φακέλου και να τα **συγκρίνετε** με τα **τρέχοντα**. Οτιδήποτε τροποποιημένο θα είναι **ύποπτο**.
|
||||||
|
|
||||||
### Στατιστική Ανάλυση
|
### Statistical Analysis
|
||||||
|
|
||||||
Όταν οι πληροφορίες αποθηκεύονται σε logs μπορείτε να **ελέγξετε στατιστικά όπως πόσες φορές κάθε αρχείο ενός web server προσπελάστηκε καθώς ένα web shell μπορεί να είναι ένα από τα πιο**.
|
Όταν οι πληροφορίες αποθηκεύονται σε αρχεία καταγραφής μπορείτε να **ελέγξετε στατιστικά όπως πόσες φορές προσπελάστηκε κάθε αρχείο ενός web server καθώς ένα web shell μπορεί να είναι ένα από τα πιο**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Αποκατάσταση Δυναμικού Έλεγχου Ροής (JMP/CALL RAX Dispatchers)
|
### Android in-app native telemetry (no root)
|
||||||
|
|
||||||
Οι σύγχρονες οικογένειες κακόβουλου λογισμικού εκμεταλλεύονται έντονα την απόκρυψη του Γραφήματος Ροής Ελέγχου (CFG): αντί για άμεσο άλμα/κλήση υπολογίζουν τον προορισμό κατά την εκτέλεση και εκτελούν ένα `jmp rax` ή `call rax`. Ένας μικρός *dispatcher* (συνήθως εννέα εντολές) καθορίζει τον τελικό στόχο ανάλογα με τις σημαίες `ZF`/`CF` της CPU, σπάζοντας εντελώς την στατική ανάκτηση CFG.
|
On Android, you can instrument native code inside the target app process by preloading a tiny logger library before other JNI libs initialize. This gives early visibility into native behavior without system-wide hooks or root. A popular approach is SoTap: drop libsotap.so for the right ABI into the APK and inject a System.loadLibrary("sotap") call early (e.g., static initializer or Application.onCreate), then collect logs from internal/external paths or Logcat fallback.
|
||||||
|
|
||||||
Η τεχνική – που παρουσιάζεται από τον φορτωτή SLOW#TEMPEST – μπορεί να καταπολεμηθεί με μια ροή εργασίας τριών βημάτων που βασίζεται μόνο στο IDAPython και τον εξομοιωτή CPU Unicorn.
|
See the Android native reversing page for setup details and log paths:
|
||||||
|
|
||||||
### 1. Εντοπίστε κάθε έμμεσο άλμα / κλήση
|
{{#ref}}
|
||||||
|
../../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Αποκρυπτογράφηση Δυναμικής Ροής Ελέγχου (JMP/CALL RAX Dispatchers)
|
||||||
|
|
||||||
|
Σύγχρονες οικογένειες malware κάνουν εκτεταμένη χρήση της απόκρυψης του Control-Flow Graph (CFG): αντί για έναν άμεσο jump/call υπολογίζουν τον προορισμό κατά το χρόνο εκτέλεσης και εκτελούν `jmp rax` ή `call rax`. Ένας μικρός *dispatcher* (τυπικά εννέα εντολές) ορίζει τον τελικό στόχο ανάλογα με τις CPU `ZF`/`CF` σημαίες, καταστρέφοντας εντελώς τη στατική ανάκτηση του CFG.
|
||||||
|
|
||||||
|
Η τεχνική – showcased by the SLOW#TEMPEST loader – can be defeated with a three-step workflow that only relies on IDAPython and the Unicorn CPU emulator.
|
||||||
|
|
||||||
|
### 1. Εντοπίστε κάθε indirect jump / call
|
||||||
```python
|
```python
|
||||||
import idautils, idc
|
import idautils, idc
|
||||||
|
|
||||||
@ -168,7 +180,7 @@ mnem = idc.print_insn_mnem(ea)
|
|||||||
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
|
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
|
||||||
print(f"[+] Dispatcher found @ {ea:X}")
|
print(f"[+] Dispatcher found @ {ea:X}")
|
||||||
```
|
```
|
||||||
### 2. Εξαγωγή του byte-code του dispatcher
|
### 2. Εξαγωγή του dispatcher byte-code
|
||||||
```python
|
```python
|
||||||
import idc
|
import idc
|
||||||
|
|
||||||
@ -199,9 +211,9 @@ mu.reg_write(UC_X86_REG_RAX, 0)
|
|||||||
mu.emu_start(BASE, BASE+len(code))
|
mu.emu_start(BASE, BASE+len(code))
|
||||||
return mu.reg_read(UC_X86_REG_RAX)
|
return mu.reg_read(UC_X86_REG_RAX)
|
||||||
```
|
```
|
||||||
Εκτελέστε `run(code,0,0)` και `run(code,1,1)` για να αποκτήσετε τους στόχους του *ψευδούς* και *αληθινού* κλάδου.
|
Τρέξτε `run(code,0,0)` και `run(code,1,1)` για να λάβετε τους στόχους διακλάδωσης *false* και *true*.
|
||||||
|
|
||||||
### 4. Επαναφορά άμεσου άλματος / κλήσης
|
### 4. Επαναφορά με patch ενός άμεσου jump / call
|
||||||
```python
|
```python
|
||||||
import struct, ida_bytes
|
import struct, ida_bytes
|
||||||
|
|
||||||
@ -210,27 +222,28 @@ op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
|
|||||||
disp = target - (ea + 5) & 0xFFFFFFFF
|
disp = target - (ea + 5) & 0xFFFFFFFF
|
||||||
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
|
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
|
||||||
```
|
```
|
||||||
Μετά την επιδιόρθωση, αναγκάστε το IDA να αναλύσει ξανά τη συνάρτηση ώστε να αποκατασταθούν το πλήρες CFG και η έξοδος Hex-Rays:
|
Μετά το patching, αναγκάστε το IDA να επανα-αναλύσει τη συνάρτηση ώστε το πλήρες CFG και το Hex-Rays output να αποκατασταθούν:
|
||||||
```python
|
```python
|
||||||
import ida_auto, idaapi
|
import ida_auto, idaapi
|
||||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||||
```
|
```
|
||||||
### 5. Επισήμανση έμμεσων κλήσεων API
|
### 5. Επισημάνετε έμμεσες κλήσεις API
|
||||||
|
|
||||||
Μόλις είναι γνωστός ο πραγματικός προορισμός κάθε `call rax`, μπορείτε να πείτε στο IDA τι είναι, ώστε οι τύποι παραμέτρων και τα ονόματα μεταβλητών να ανακτηθούν αυτόματα:
|
Μόλις γίνει γνωστός ο πραγματικός προορισμός κάθε `call rax`, μπορείτε να πείτε στο IDA τι είναι ώστε οι τύποι παραμέτρων & τα ονόματα μεταβλητών να ανακτηθούν αυτόματα:
|
||||||
```python
|
```python
|
||||||
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||||
```
|
```
|
||||||
### Πρακτικά οφέλη
|
### Πρακτικά οφέλη
|
||||||
|
|
||||||
* Αποκαθιστά το πραγματικό CFG → η αποσυναρμολόγηση πηγαίνει από *10* γραμμές σε χιλιάδες.
|
* Αποκαθιστά το πραγματικό CFG → η απομεταγλώττιση μετατρέπεται από *10* γραμμές σε χιλιάδες.
|
||||||
* Διευκολύνει τη διασταύρωση συμβολοσειρών & xrefs, καθιστώντας την ανακατασκευή συμπεριφοράς απλή.
|
* Επιτρέπει string-cross-reference & xrefs, καθιστώντας την ανακατασκευή της συμπεριφοράς πολύ εύκολη.
|
||||||
* Τα σενάρια είναι επαναχρησιμοποιήσιμα: ρίξτε τα σε οποιονδήποτε φορτωτή προστατευμένο από το ίδιο κόλπο.
|
* Τα Scripts είναι επαναχρησιμοποιήσιμα: τοποθετήστε τα σε οποιονδήποτε loader που προστατεύεται από το ίδιο τρικ.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Αναφορές
|
## Αναφορές
|
||||||
|
|
||||||
- [Unit42 – Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
|
- [Unit42 – Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
|
||||||
|
- SoTap: Lightweight in-app JNI (.so) behavior logger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,47 +1,50 @@
|
|||||||
# Ανάλυση Εγγενών Βιβλιοθηκών
|
# Reversing Native Libraries
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**Για περισσότερες πληροφορίες δείτε:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
|
||||||
|
|
||||||
Οι εφαρμογές Android μπορούν να χρησιμοποιούν εγγενείς βιβλιοθήκες, συνήθως γραμμένες σε C ή C++, για εργασίες που απαιτούν υψηλή απόδοση. Οι δημιουργοί κακόβουλου λογισμικού εκμεταλλεύονται επίσης αυτές τις βιβλιοθήκες, καθώς τα ELF shared objects είναι ακόμα πιο δύσκολα να αποσυμπιεστούν από τον κώδικα DEX/OAT. Αυτή η σελίδα εστιάζει σε *πρακτικές* ροές εργασίας και *πρόσφατες* βελτιώσεις εργαλείων (2023-2025) που διευκολύνουν την ανάλυση των αρχείων Android `.so`.
|
**For further information check:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||||
|
|
||||||
|
Οι Android εφαρμογές μπορούν να χρησιμοποιούν native libraries, συνήθως γραμμένες σε C ή C++, για εργασίες κρίσιμες στην απόδοση. Οι δημιουργοί malware επίσης καταχρώνται αυτές τις βιβλιοθήκες επειδή τα ELF shared objects εξακολουθούν να είναι πιο δύσκολα στην decompile σε σχέση με το DEX/OAT byte-code.
|
||||||
|
Αυτή η σελίδα εστιάζει σε *πρακτικές* ροές εργασίας και σε *πρόσφατες* βελτιώσεις εργαλείων (2023-2025) που καθιστούν την ανάλυση των Android `.so` αρχείων ευκολότερη.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Γρήγορη ροή εργασίας για μια πρόσφατα αποσυμπιεσμένη `libfoo.so`
|
### Quick triage-workflow for a freshly pulled `libfoo.so`
|
||||||
|
|
||||||
1. **Εξαγωγή της βιβλιοθήκης**
|
1. **Extract the library**
|
||||||
```bash
|
```bash
|
||||||
# Από μια εγκατεστημένη εφαρμογή
|
# From an installed application
|
||||||
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
||||||
# Ή από το APK (zip)
|
# Or from the APK (zip)
|
||||||
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
|
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
|
||||||
```
|
```
|
||||||
2. **Καθορισμός αρχιτεκτονικής & προστασιών**
|
2. **Identify architecture & protections**
|
||||||
```bash
|
```bash
|
||||||
file libfoo.so # arm64 ή arm32 / x86
|
file libfoo.so # arm64 or arm32 / x86
|
||||||
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, κ.λπ.
|
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
|
||||||
checksec --file libfoo.so # (peda/pwntools)
|
checksec --file libfoo.so # (peda/pwntools)
|
||||||
```
|
```
|
||||||
3. **Καταγραφή εξαγόμενων συμβόλων & JNI bindings**
|
3. **List exported symbols & JNI bindings**
|
||||||
```bash
|
```bash
|
||||||
readelf -s libfoo.so | grep ' Java_' # δυναμικά συνδεδεμένο JNI
|
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
|
||||||
strings libfoo.so | grep -i "RegisterNatives" -n # στατικά καταχωρημένο JNI
|
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
|
||||||
```
|
```
|
||||||
4. **Φόρτωση σε αποσυμπιεστή** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper ή Cutter/Rizin) και εκτέλεση αυτόματης ανάλυσης. Οι νεότερες εκδόσεις του Ghidra εισήγαγαν έναν αποσυμπιεστή AArch64 που αναγνωρίζει PAC/BTI stubs και MTE tags, βελτιώνοντας σημαντικά την ανάλυση βιβλιοθηκών που έχουν κατασκευαστεί με το Android 14 NDK.
|
4. **Load in a decompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) and run auto-analysis.
|
||||||
5. **Απόφαση για στατική ή δυναμική ανάλυση:** ο κωδικός που έχει αφαιρεθεί ή παραποιηθεί συχνά χρειάζεται *εργαλεία παρακολούθησης* (Frida, ptrace/gdbserver, LLDB).
|
Οι νεότερες εκδόσεις του Ghidra εισήγαγαν έναν AArch64 decompiler που αναγνωρίζει PAC/BTI stubs και MTE tags, βελτιώνοντας σημαντικά την ανάλυση βιβλιοθηκών που χτίστηκαν με το Android 14 NDK.
|
||||||
|
5. **Decide on static vs dynamic reversing:** το stripped, obfuscated code συχνά χρειάζεται *instrumentation* (Frida, ptrace/gdbserver, LLDB).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Δυναμική Παρακολούθηση (Frida ≥ 16)
|
### Dynamic Instrumentation (Frida ≥ 16)
|
||||||
|
|
||||||
Η σειρά 16 της Frida έφερε αρκετές βελτιώσεις ειδικά για Android που βοηθούν όταν ο στόχος χρησιμοποιεί σύγχρονες βελτιστοποιήσεις Clang/LLD:
|
Η σειρά 16 του Frida έφερε αρκετές βελτιώσεις ειδικές για Android που βοηθούν όταν ο στόχος χρησιμοποιεί σύγχρονες βελτιστοποιήσεις Clang/LLD:
|
||||||
|
|
||||||
* Ο `thumb-relocator` μπορεί τώρα να *συνδέει μικρές ARM/Thumb συναρτήσεις* που παράγονται από την επιθετική ευθυγράμμιση του LLD (`--icf=all`).
|
* `thumb-relocator` can now *hook tiny ARM/Thumb functions* generated by LLD’s aggressive alignment (`--icf=all`).
|
||||||
* Η καταμέτρηση και η επανασύνδεση *ELF import slots* λειτουργεί στο Android, επιτρέποντας την επιδιόρθωση `dlopen()`/`dlsym()` ανά μονάδα όταν οι inline hooks απορρίπτονται.
|
* Enumerating and rebinding *ELF import slots* works on Android, enabling per-module `dlopen()`/`dlsym()` patching when inline hooks are rejected.
|
||||||
* Η σύνδεση Java διορθώθηκε για το νέο **ART quick-entrypoint** που χρησιμοποιείται όταν οι εφαρμογές μεταγλωττίζονται με `--enable-optimizations` στο Android 14.
|
* Java hooking was fixed for the new **ART quick-entrypoint** used when apps are compiled with `--enable-optimizations` on Android 14.
|
||||||
|
|
||||||
Παράδειγμα: καταμέτρηση όλων των συναρτήσεων που έχουν καταχωρηθεί μέσω `RegisterNatives` και εξαγωγή των διευθύνσεών τους κατά την εκτέλεση:
|
Example: enumerating all functions registered through `RegisterNatives` and dumping their addresses at runtime:
|
||||||
```javascript
|
```javascript
|
||||||
Java.perform(function () {
|
Java.perform(function () {
|
||||||
var Runtime = Java.use('java.lang.Runtime');
|
var Runtime = Java.use('java.lang.Runtime');
|
||||||
@ -58,7 +61,42 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
Frida θα λειτουργήσει αμέσως σε συσκευές με ενεργοποιημένο PAC/BTI (Pixel 8/Android 14+) αρκεί να χρησιμοποιείτε frida-server 16.2 ή νεότερη έκδοση – παλαιότερες εκδόσεις απέτυχαν να εντοπίσουν το padding για inline hooks. citeturn5search2turn5search0
|
Frida will work out of the box on PAC/BTI-enabled devices (Pixel 8/Android 14+) as long as you use frida-server 16.2 or later – earlier versions failed to locate padding for inline hooks.
|
||||||
|
|
||||||
|
### Τηλεμετρία JNI τοπική στη διαδικασία μέσω προφορτωμένου .so (SoTap)
|
||||||
|
|
||||||
|
Όταν η πλήρης instrumentation είναι υπερβολική ή μπλοκαρισμένη, μπορείτε ακόμα να αποκτήσετε ορατότητα σε native επίπεδο προφορτώνοντας έναν μικρό logger μέσα στη στοχευόμενη διαδικασία. SoTap είναι μια ελαφριά Android native (.so) βιβλιοθήκη που καταγράφει τη συμπεριφορά κατά το runtime άλλων JNI (.so) βιβλιοθηκών μέσα στην ίδια app process (no root required).
|
||||||
|
|
||||||
|
Κύρια χαρακτηριστικά:
|
||||||
|
- Εκκινεί νωρίς και παρατηρεί τις JNI/native αλληλεπιδράσεις μέσα στη διαδικασία που το φορτώνει.
|
||||||
|
- Διατηρεί τα logs χρησιμοποιώντας πολλαπλές εγγράψιμες διαδρομές με ομαλή επιστροφή στο Logcat όταν ο αποθηκευτικός χώρος είναι περιορισμένος.
|
||||||
|
- Source-customizable: επεξεργαστείτε το sotap.c για να επεκτείνετε/προσαρμόσετε τι καταγράφεται και κάντε rebuild ανά ABI.
|
||||||
|
|
||||||
|
Ρύθμιση (repack the APK):
|
||||||
|
1) Τοποθετήστε το κατάλληλο ABI build μέσα στο APK ώστε ο loader να μπορεί να επιλύσει libsotap.so:
|
||||||
|
- lib/arm64-v8a/libsotap.so (for arm64)
|
||||||
|
- lib/armeabi-v7a/libsotap.so (for arm32)
|
||||||
|
2) Βεβαιωθείτε ότι το SoTap φορτώνεται πριν από άλλες JNI libs. Εισάγετε μια κλήση νωρίς (π.χ., Application subclass static initializer ή onCreate) ώστε ο logger να αρχικοποιηθεί πρώτος. Smali snippet example:
|
||||||
|
```smali
|
||||||
|
const-string v0, "sotap"
|
||||||
|
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||||
|
```
|
||||||
|
3) Κάντε rebuild/sign/install, τρέξτε την εφαρμογή, και στη συνέχεια συλλέξτε τα logs.
|
||||||
|
|
||||||
|
Log paths (checked in order):
|
||||||
|
```
|
||||||
|
/data/user/0/%s/files/sotap.log
|
||||||
|
/data/data/%s/files/sotap.log
|
||||||
|
/sdcard/Android/data/%s/files/sotap.log
|
||||||
|
/sdcard/Download/sotap-%s.log
|
||||||
|
# If all fail: fallback to Logcat only
|
||||||
|
```
|
||||||
|
Σημειώσεις και αντιμετώπιση προβλημάτων:
|
||||||
|
- ABI alignment είναι υποχρεωτική. Μη αντιστοιχία θα προκαλέσει UnsatisfiedLinkError και ο logger δεν θα φορτωθεί.
|
||||||
|
- Περιορισμοί αποθηκευτικού χώρου είναι συνηθισμένοι σε σύγχρονα Android· αν οι εγγραφές αρχείων αποτύχουν, το SoTap θα εξακολουθήσει να εκπέμπει μέσω Logcat.
|
||||||
|
- Η συμπεριφορά/επίπεδο λεπτομέρειας προορίζεται για προσαρμογή· αναδημιουργήστε από τον πηγαίο κώδικα μετά την επεξεργασία του sotap.c.
|
||||||
|
|
||||||
|
Αυτή η προσέγγιση είναι χρήσιμη για malware triage και JNI debugging όπου η παρατήρηση των native call flows από την εκκίνηση της διεργασίας είναι κρίσιμη αλλά root/system-wide hooks δεν είναι διαθέσιμα.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -66,30 +104,33 @@ Frida θα λειτουργήσει αμέσως σε συσκευές με εν
|
|||||||
|
|
||||||
| Έτος | CVE | Επηρεαζόμενη βιβλιοθήκη | Σημειώσεις |
|
| Έτος | CVE | Επηρεαζόμενη βιβλιοθήκη | Σημειώσεις |
|
||||||
|------|-----|------------------|-------|
|
|------|-----|------------------|-------|
|
||||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow που είναι προσβάσιμο από native code που αποκωδικοποιεί εικόνες WebP. Πολλές εφαρμογές Android περιλαμβάνουν ευάλωτες εκδόσεις. Όταν δείτε ένα `libwebp.so` μέσα σε ένα APK, ελέγξτε την έκδοσή του και προσπαθήστε να εκμεταλλευτείτε ή να διορθώσετε.| citeturn2search0|
|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow προσβάσιμος από native code που αποκωδικοποιεί εικόνες WebP. Πολλές εφαρμογές Android συνοδεύουν ευπαθείς εκδόσεις. Όταν δείτε ένα `libwebp.so` μέσα σε ένα APK, ελέγξτε την έκδοσή του και δοκιμάστε εκμετάλλευση ή επιδιόρθωση.| |
|
||||||
|2024|Πολλαπλά|OpenSSL 3.x σειρά|Πολλά ζητήματα ασφάλειας μνήμης και padding-oracle. Πολλές συσκευασίες Flutter & ReactNative περιλαμβάνουν τη δική τους `libcrypto.so`.|
|
|2024|Multiple|OpenSSL 3.x series|Πολλά ζητήματα memory-safety και padding-oracle. Πολλά Flutter & ReactNative bundles περιλαμβάνουν το δικό τους `libcrypto.so`.|
|
||||||
|
|
||||||
Όταν εντοπίσετε *third-party* `.so` αρχεία μέσα σε ένα APK, ελέγξτε πάντα το hash τους σε σχέση με τις upstream συμβουλές. Η SCA (Software Composition Analysis) είναι σπάνια σε κινητές συσκευές, οπότε οι παλιές ευάλωτες εκδόσεις είναι διαδεδομένες.
|
Όταν εντοπίσετε *third-party* `.so` αρχεία μέσα σε ένα APK, πάντα συγκρίνετε το hash τους με upstream advisories. Η SCA (Software Composition Analysis) είναι ασυνήθιστη στο mobile, οπότε παλιές ευπαθείς builds είναι διαδεδομένες.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Τάσεις Anti-Reversing & Hardening (Android 13-15)
|
### 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` όπου είναι απαραίτητο.
|
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Το Android 14 ενεργοποιεί PAC/BTI στις system libraries σε υποστηριζόμενο silicon ARMv8.3+. Οι decompilers τώρα εμφανίζουν PAC‐related pseudo-instructions· για dynamic analysis το Frida εισάγει trampolines *after* stripping PAC, αλλά τα custom trampolines σας πρέπει να καλούν `pacda`/`autibsp` όπου χρειάζεται.
|
||||||
* **MTE & Scudo hardened allocator:** η σήμανση μνήμης είναι προαιρετική, αλλά πολλές εφαρμογές που γνωρίζουν το Play-Integrity κατασκευάζονται με `-fsanitize=memtag`; χρησιμοποιήστε `setprop arm64.memtag.dump 1` συν `adb shell am start ...` για να καταγράψετε σφάλματα σήμανσης.
|
* **MTE & Scudo hardened allocator:** memory-tagging είναι opt-in αλλά πολλές Play-Integrity aware εφαρμογές χτίζονται με `-fsanitize=memtag`; χρησιμοποιήστε `setprop arm64.memtag.dump 1` plus `adb shell am start ...` για να συλλάβετε tag faults.
|
||||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** εμπορικοί πακερ (π.χ., Bangcle, SecNeo) προστατεύουν ολοένα και περισσότερο *native* κώδικα, όχι μόνο Java; αναμένετε ψευδείς ροές ελέγχου και κρυπτογραφημένα blobs συμβολοσειρών σε `.rodata`.
|
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** commercial packers (e.g., Bangcle, SecNeo) όλο και περισσότερο προστατεύουν το *native* code, όχι μόνο Java· αναμένετε bogus control-flow και encrypted string blobs στο `.rodata`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Πόροι
|
### Πόροι
|
||||||
|
|
||||||
- **Μάθηση ARM Assembly:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
- **Learning 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/)
|
- **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)
|
- **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
|
- Frida 16.x change-log (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/)
|
||||||
- NVD advisory for `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
|
- NVD advisory for `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
|
||||||
|
- SoTap: Lightweight in-app JNI (.so) behavior logger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||||
|
- SoTap Releases – [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases)
|
||||||
|
- How to work with SoTap? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,56 +1,57 @@
|
|||||||
# Smali - Decompiling/\[Modifying]/Compiling
|
# Smali - Απομεταγλώττιση/[Τροποποίηση]/Μεταγλώττιση
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Μερικές φορές είναι ενδιαφέρον να τροποποιήσετε τον κώδικα της εφαρμογής για να αποκτήσετε πρόσβαση σε κρυφές πληροφορίες (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Τότε, θα μπορούσε να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να τον ξανασυμπιέσετε.
|
|
||||||
|
|
||||||
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
Μερικές φορές είναι ενδιαφέρον να τροποποιήσεις τον κώδικα της εφαρμογής για να αποκτήσεις πρόσβαση σε κρυφές πληροφορίες (ίσως καλά συγκεκαλυμμένα συνθηματικά ή flags). Τότε, μπορεί να είναι χρήσιμο να απομεταγλωττίσεις το apk, να τροποποιήσεις τον κώδικα και να το μεταγλωττίσεις ξανά.
|
||||||
|
|
||||||
## Fast Way
|
**Αναφορά Opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||||
|
|
||||||
Χρησιμοποιώντας το **Visual Studio Code** και την επέκταση [APKLab](https://github.com/APKLab/APKLab), μπορείτε να **αποσυμπιέσετε αυτόματα**, να τροποποιήσετε, **να ξανασυμπιέσετε**, να υπογράψετε και να εγκαταστήσετε την εφαρμογή χωρίς να εκτελέσετε καμία εντολή.
|
## Γρήγορος Τρόπος
|
||||||
|
|
||||||
|
Χρησιμοποιώντας το **Visual Studio Code** και το πρόσθετο [APKLab](https://github.com/APKLab/APKLab), μπορείς να **απομεταγλωττίσεις αυτόματα**, τροποποιήσεις, **μεταγλωττίσεις ξανά**, υπογράψεις και εγκαταστήσεις την εφαρμογή χωρίς να εκτελέσεις καμία εντολή.
|
||||||
|
|
||||||
Ένα άλλο **script** που διευκολύνει πολύ αυτή την εργασία είναι [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
Ένα άλλο **script** που διευκολύνει πολύ αυτή την εργασία είναι [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||||
|
|
||||||
## Decompile the APK
|
## Απομεταγλώττιση του APK
|
||||||
|
|
||||||
Χρησιμοποιώντας το APKTool μπορείτε να αποκτήσετε πρόσβαση στον **κώδικα smali και τους πόρους**:
|
Χρησιμοποιώντας το APKTool μπορείς να έχεις πρόσβαση στο **smali code and resources**:
|
||||||
```bash
|
```bash
|
||||||
apktool d APP.apk
|
apktool d APP.apk
|
||||||
```
|
```
|
||||||
Αν το **apktool** σας δώσει κάποιο σφάλμα, προσπαθήστε να [εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
|
Αν **apktool** σας δώσει κάποιο σφάλμα, δοκιμάστε[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||||
|
|
||||||
Ορισμένα **ενδιαφέροντα αρχεία που θα πρέπει να εξετάσετε είναι**:
|
Μερικά **ενδιαφέροντα αρχεία που πρέπει να κοιτάξετε**:
|
||||||
|
|
||||||
- _res/values/strings.xml_ (και όλα τα xml μέσα στο res/values/\*)
|
- _res/values/strings.xml_ (και όλα τα xml μέσα στο res/values/*)
|
||||||
- _AndroidManifest.xml_
|
- _AndroidManifest.xml_
|
||||||
- Οποιοδήποτε αρχείο με κατάληξη _.sqlite_ ή _.db_
|
- Οποιοδήποτε αρχείο με κατάληξη _.sqlite_ ή _.db_
|
||||||
|
|
||||||
Αν το `apktool` έχει **προβλήματα στην αποκωδικοποίηση της εφαρμογής**, ρίξτε μια ματιά στο [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ή προσπαθήστε να χρησιμοποιήσετε το επιχείρημα **`-r`** (Μην αποκωδικοποιείτε τους πόρους). Στη συνέχεια, αν το πρόβλημα ήταν σε έναν πόρο και όχι στον πηγαίο κώδικα, δεν θα έχετε το πρόβλημα (δεν θα αποκωδικοποιήσετε επίσης τους πόρους).
|
Αν `apktool` έχει **προβλήματα στην αποκωδικοποίηση της εφαρμογής** ρίξτε μια ματιά στο [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ή δοκιμάστε να χρησιμοποιήσετε το όρισμα **`-r`** (μην αποκωδικοποιήσετε τα resources). Έτσι, αν το πρόβλημα βρισκόταν σε κάποιο resource και όχι στον πηγαίο κώδικα, δεν θα αντιμετωπίσετε το πρόβλημα (επίσης δεν θα αποσυμπιλοποιηθούν τα resources).
|
||||||
|
|
||||||
## Αλλαγή κώδικα smali
|
## Αλλαγή κώδικα smali
|
||||||
|
|
||||||
Μπορείτε να **αλλάξετε** **εντολές**, να αλλάξετε την **τιμή** ορισμένων μεταβλητών ή να **προσθέσετε** νέες εντολές. Αλλάζω τον κώδικα Smali χρησιμοποιώντας [**VS Code**](https://code.visualstudio.com), στη συνέχεια εγκαθιστάτε την **επέκταση smalise** και ο επεξεργαστής θα σας πει αν κάποια **εντολή είναι λανθασμένη**.\
|
Μπορείτε να **αλλάξετε** **εντολές**, να αλλάξετε την **τιμή** ορισμένων μεταβλητών ή να **προσθέσετε** νέες εντολές. Εγώ αλλάζω τον κώδικα Smali χρησιμοποιώντας το [**VS Code**](https://code.visualstudio.com), στη συνέχεια εγκαθιστάτε την **smalise extension** και ο επεξεργαστής θα σας πει αν κάποια **εντολή είναι λανθασμένη**.
|
||||||
Ορισμένα **παραδείγματα** μπορούν να βρεθούν εδώ:
|
Μερικά **παραδείγματα** μπορείτε να βρείτε εδώ:
|
||||||
|
|
||||||
- [Παραδείγματα αλλαγών Smali](smali-changes.md)
|
- [Smali changes examples](smali-changes.md)
|
||||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||||
|
|
||||||
Ή μπορείτε να [**ελέγξετε παρακάτω μερικές εξηγήσεις αλλαγών Smali**](smali-changes.md#modifying-smali).
|
Ή μπορείτε να [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||||
|
|
||||||
## Ανακατασκευή του APK
|
## Recompile the APK
|
||||||
|
|
||||||
Αφού τροποποιήσετε τον κώδικα, μπορείτε να **ανακατασκευάσετε** τον κώδικα χρησιμοποιώντας:
|
Μετά την τροποποίηση του κώδικα μπορείτε να **επανασυγγράψετε** τον κώδικα χρησιμοποιώντας:
|
||||||
```bash
|
```bash
|
||||||
apktool b . #In the folder generated when you decompiled the application
|
apktool b . #In the folder generated when you decompiled the application
|
||||||
```
|
```
|
||||||
Θα **συγκεντρώσει** το νέο APK **μέσα** στον _**φάκελο dist**_.
|
Θα **compile** το νέο APK **inside** τον _**dist**_ φάκελο.
|
||||||
|
|
||||||
Αν το **apktool** ρίξει ένα **σφάλμα**, δοκιμάστε[ να εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
|
Αν το **apktool** πετάξει **error**, δοκιμάστε [ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||||
|
|
||||||
### **Υπογράψτε το νέο APK**
|
### **Υπογράψτε το νέο APK**
|
||||||
|
|
||||||
Στη συνέχεια, πρέπει να **δημιουργήσετε ένα κλειδί** (θα σας ζητηθεί ένας κωδικός πρόσβασης και κάποιες πληροφορίες που μπορείτε να συμπληρώσετε τυχαία):
|
Στη συνέχεια, πρέπει να **generate a key** (θα σας ζητηθεί ένα password και κάποιες πληροφορίες που μπορείτε να συμπληρώσετε τυχαία):
|
||||||
```bash
|
```bash
|
||||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||||
```
|
```
|
||||||
@ -60,26 +61,26 @@ jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
|||||||
```
|
```
|
||||||
### Βελτιστοποίηση νέας εφαρμογής
|
### Βελτιστοποίηση νέας εφαρμογής
|
||||||
|
|
||||||
**zipalign** είναι ένα εργαλείο ευθυγράμμισης αρχείων που παρέχει σημαντική βελτιστοποίηση στα αρχεία εφαρμογών Android (APK). [More information here](https://developer.android.com/studio/command-line/zipalign).
|
**zipalign** είναι ένα εργαλείο ευθυγράμμισης αρχείων που παρέχει σημαντική βελτιστοποίηση για αρχεία εφαρμογής Android (APK). [More information here](https://developer.android.com/studio/command-line/zipalign).
|
||||||
```bash
|
```bash
|
||||||
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
||||||
zipalign -v 4 infile.apk
|
zipalign -v 4 infile.apk
|
||||||
```
|
```
|
||||||
### **Υπογράψτε το νέο APK (ξανά;)**
|
### **Υπογράψτε το νέο APK (ξανά;)**
|
||||||
|
|
||||||
Αν **προτιμάτε** να χρησιμοποιήσετε [**apksigner**](https://developer.android.com/studio/command-line/) αντί για jarsigner, **πρέπει να υπογράψετε το apk** μετά την εφαρμογή **της βελτιστοποίησης με** zipalign. ΑΛΛΑ ΠΡΟΣΟΧΗ ΟΤΙ ΠΡΕΠΕΙ ΝΑ **ΥΠΟΓΡΑΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΗ ΜΙΑ ΦΟΡΑ ΜΟΝΟ** ΜΕ jarsigner (πριν το zipalign) Ή ΜΕ aspsigner (μετά το zipalign).
|
Αν **προτιμάτε** να χρησιμοποιήσετε [**apksigner**](https://developer.android.com/studio/command-line/) αντί για jarsigner, **πρέπει να υπογράψετε το APK** αφού εφαρμόσετε **τη βελτιστοποίηση με** zipalign. ΑΛΛΑ ΣΗΜΕΙΩΣΤΕ ΟΤΙ ΠΡΕΠΕΙ ΝΑ **ΥΠΟΓΡΑΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΗ ΜΟΝΟ ΜΙΑ ΦΟΡΑ** ΜΕ jarsigner (πριν το zipalign) Ή ΜΕ apksigner (μετά το zipalign).
|
||||||
```bash
|
```bash
|
||||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||||
```
|
```
|
||||||
## Τροποποίηση Smali
|
## Τροποποίηση Smali
|
||||||
|
|
||||||
Για τον παρακάτω κώδικα Hello World Java:
|
Για τον ακόλουθο Java κώδικα Hello World:
|
||||||
```java
|
```java
|
||||||
public static void printHelloWorld() {
|
public static void printHelloWorld() {
|
||||||
System.out.println("Hello World")
|
System.out.println("Hello World")
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Ο κώδικας Smali θα είναι:
|
Ο κώδικας Smali θα ήταν:
|
||||||
```java
|
```java
|
||||||
.method public static printHelloWorld()V
|
.method public static printHelloWorld()V
|
||||||
.registers 2
|
.registers 2
|
||||||
@ -89,13 +90,13 @@ invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
|
|||||||
return-void
|
return-void
|
||||||
.end method
|
.end method
|
||||||
```
|
```
|
||||||
Το σύνολο εντολών Smali είναι διαθέσιμο [εδώ](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
The Smali instruction set is available [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||||
|
|
||||||
### Ελαφρές Αλλαγές
|
### Ελαφρές Αλλαγές
|
||||||
|
|
||||||
### Τροποποίηση αρχικών τιμών μιας μεταβλητής μέσα σε μια συνάρτηση
|
### Τροποποίηση αρχικών τιμών μιας μεταβλητής μέσα σε μια συνάρτηση
|
||||||
|
|
||||||
Ορισμένες μεταβλητές ορίζονται στην αρχή της συνάρτησης χρησιμοποιώντας την εντολή _const_, μπορείτε να τροποποιήσετε τις τιμές τους ή να ορίσετε νέες:
|
Ορισμένες μεταβλητές ορίζονται στην αρχή της συνάρτησης χρησιμοποιώντας το opcode _const_, μπορείτε να τροποποιήσετε τις τιμές τους, ή να ορίσετε νέες:
|
||||||
```bash
|
```bash
|
||||||
#Number
|
#Number
|
||||||
const v9, 0xf4240
|
const v9, 0xf4240
|
||||||
@ -103,7 +104,7 @@ const/4 v8, 0x1
|
|||||||
#Strings
|
#Strings
|
||||||
const-string v5, "wins"
|
const-string v5, "wins"
|
||||||
```
|
```
|
||||||
### Βασικές Λειτουργίες
|
### Βασικές Ενέργειες
|
||||||
```bash
|
```bash
|
||||||
#Math
|
#Math
|
||||||
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
|
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
|
||||||
@ -137,19 +138,19 @@ move-result-object v1 #Move to v1
|
|||||||
const-string v5, "wins" #Save "win" inside v5
|
const-string v5, "wins" #Save "win" inside v5
|
||||||
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
|
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
|
||||||
```
|
```
|
||||||
Συστάσεις:
|
Recommendations:
|
||||||
|
|
||||||
- Αν πρόκειται να χρησιμοποιήσετε δηλωμένες μεταβλητές μέσα στη συνάρτηση (δηλωμένες v0,v1,v2...) τοποθετήστε αυτές τις γραμμές μεταξύ του _.local \<number>_ και των δηλώσεων των μεταβλητών (_const v0, 0x1_)
|
- Αν πρόκειται να χρησιμοποιήσετε δηλωμένες μεταβλητές μέσα στη συνάρτηση (δηλωμένες v0,v1,v2...) τοποθετήστε αυτές τις γραμμές μεταξύ των _.local <number>_ και των δηλώσεων των μεταβλητών (_const v0, 0x1_)
|
||||||
- Αν θέλετε να τοποθετήσετε τον κώδικα καταγραφής στη μέση του κώδικα μιας συνάρτησης:
|
- Αν θέλετε να βάλετε τον logging κώδικα στη μέση του κώδικα μιας συνάρτησης:
|
||||||
- Προσθέστε 2 στον αριθμό των δηλωμένων μεταβλητών: Π.χ.: από _.locals 10_ σε _.locals 12_
|
- Προσθέστε 2 στον αριθμό των δηλωμένων μεταβλητών: Ex: από _.locals 10_ to _.locals 12_
|
||||||
- Οι νέες μεταβλητές θα πρέπει να είναι οι επόμενοι αριθμοί των ήδη δηλωμένων μεταβλητών (σε αυτό το παράδειγμα θα πρέπει να είναι _v10_ και _v11_, θυμηθείτε ότι ξεκινά από v0).
|
- Οι νέες μεταβλητές πρέπει να είναι οι επόμενοι αριθμοί μετά τις ήδη δηλωμένες μεταβλητές (σε αυτό το παράδειγμα θα είναι _v10_ και _v11_, θυμηθείτε ότι ξεκινά σε v0).
|
||||||
- Αλλάξτε τον κώδικα της συνάρτησης καταγραφής και χρησιμοποιήστε _v10_ και _v11_ αντί για _v5_ και _v1_.
|
- Αλλάξτε τον κώδικα της logging συνάρτησης και χρησιμοποιήστε _v10_ και _v11_ αντί για _v5_ και _v1_.
|
||||||
|
|
||||||
### Toasting
|
### Εμφάνιση toast
|
||||||
|
|
||||||
Θυμηθείτε να προσθέσετε 3 στον αριθμό των _.locals_ στην αρχή της συνάρτησης.
|
Θυμηθείτε να προσθέσετε 3 στον αριθμό των _.locals_ στην αρχή της συνάρτησης.
|
||||||
|
|
||||||
Αυτός ο κώδικας είναι έτοιμος να εισαχθεί στη **μέση μιας συνάρτησης** (**αλλάξτε** τον αριθμό των **μεταβλητών** όπως απαιτείται). Θα πάρει την **τιμή του this.o**, θα την **μετατρέψει** σε **String** και στη συνέχεια θα **δημιουργήσει** ένα **toast** με την τιμή του.
|
Αυτός ο κώδικας είναι προετοιμασμένος για εισαγωγή στο **μέσο μιας συνάρτησης** (**αλλάξτε** τον αριθμό των **μεταβλητών** όπως χρειάζεται). Θα πάρει την **τιμή του this.o**, θα την **μετατρέψει** σε **String** και στη συνέχεια θα **κάνει** ένα **toast** με την τιμή του.
|
||||||
```bash
|
```bash
|
||||||
const/4 v10, 0x1
|
const/4 v10, 0x1
|
||||||
const/4 v11, 0x1
|
const/4 v11, 0x1
|
||||||
@ -161,4 +162,38 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
|
|||||||
move-result-object v12
|
move-result-object v12
|
||||||
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
||||||
```
|
```
|
||||||
|
### Φόρτωση μιας native βιβλιοθήκης κατά την εκκίνηση (System.loadLibrary)
|
||||||
|
|
||||||
|
Μερικές φορές χρειάζεται να προφορτώσετε μια native βιβλιοθήκη ώστε να αρχικοποιηθεί πριν από άλλες JNI libs (π.χ. για να ενεργοποιηθεί telemetry/logging σε επίπεδο διεργασίας). Μπορείτε να εισάγετε μια κλήση σε System.loadLibrary() σε έναν static initializer ή νωρίς στο Application.onCreate(). Παράδειγμα smali για static class initializer (<clinit>):
|
||||||
|
```smali
|
||||||
|
.class public Lcom/example/App;
|
||||||
|
.super Landroid/app/Application;
|
||||||
|
|
||||||
|
.method static constructor <clinit>()V
|
||||||
|
.registers 1
|
||||||
|
const-string v0, "sotap" # library name without lib...so prefix
|
||||||
|
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||||
|
return-void
|
||||||
|
.end method
|
||||||
|
```
|
||||||
|
Εναλλακτικά, τοποθετήστε τις ίδιες δύο εντολές στην αρχή του Application.onCreate() για να εξασφαλίσετε ότι η βιβλιοθήκη φορτώνει όσο το δυνατόν νωρίτερα:
|
||||||
|
```smali
|
||||||
|
.method public onCreate()V
|
||||||
|
.locals 1
|
||||||
|
|
||||||
|
const-string v0, "sotap"
|
||||||
|
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||||
|
|
||||||
|
invoke-super {p0}, Landroid/app/Application;->onCreate()V
|
||||||
|
return-void
|
||||||
|
.end method
|
||||||
|
```
|
||||||
|
Σημειώσεις:
|
||||||
|
- Βεβαιωθείτε ότι η σωστή παραλλαγή ABI της βιβλιοθήκης υπάρχει κάτω από lib/<abi>/ (π.χ., arm64-v8a/armeabi-v7a) για να αποφύγετε το UnsatisfiedLinkError.
|
||||||
|
- Η φόρτωση πολύ νωρίς (class static initializer) εξασφαλίζει ότι ο native logger μπορεί να παρατηρήσει τη μετέπειτα δραστηριότητα JNI.
|
||||||
|
|
||||||
|
## Αναφορές
|
||||||
|
|
||||||
|
- SoTap: Ελαφρύς καταγραφέας συμπεριφοράς εντός εφαρμογής για JNI (.so) – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user