Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati

This commit is contained in:
Translator 2025-09-04 09:32:36 +00:00
parent 331f3a99cd
commit a77ce73869
3 changed files with 126 additions and 126 deletions

View File

@ -1,12 +1,12 @@
# Malware Analysis
# Ανάλυση Κακόβουλου Λογισμικού
{{#include ../../banners/hacktricks-training.md}}
## Forensics CheatSheets
## Cheatsheets Ψηφιακής Εγκληματολογίας
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
## Online Υπηρεσίες
## Διαδικτυακές Υπηρεσίες
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
- [HybridAnalysis](https://www.hybrid-analysis.com)
@ -14,7 +14,7 @@
- [Intezer](https://analyze.intezer.com)
- [Any.Run](https://any.run/)
## Εργαλεία Antivirus και Ανίχνευσης εκτός σύνδεσης
## Offline Antivirus και Εργαλεία Ανίχνευσης
### Yara
@ -24,8 +24,8 @@ sudo apt-get install -y yara
```
#### Προετοιμασία κανόνων
Χρησιμοποιήστε αυτό το script για να κατεβάσετε και να συγχωνεύσετε όλους τους yara κανόνες για malware από github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
Δημιουργήστε τον φάκελο _**rules**_ και εκτελέστε το script. Αυτό θα δημιουργήσει ένα αρχείο με το όνομα _**malware_rules.yar**_ το οποίο περιέχει όλους τους yara κανόνες για malware.
Χρησιμοποιήστε αυτό το script για να κατεβάσετε και να συγχωνεύσετε όλους τους yara malware rules από github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
Δημιουργήστε τον φάκελο _**rules**_ και εκτελέστε το. Αυτό θα δημιουργήσει ένα αρχείο με όνομα _**malware_rules.yar**_ που περιέχει όλους τους yara rules για malware.
```bash
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
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 folder #Scan the whole folder
```
#### YaraGen: Έλεγχος για malware και Δημιουργία yara rules
#### YaraGen: Ελέγξτε για malware και δημιουργήστε κανόνες
Μπορείτε να χρησιμοποιήσετε το εργαλείο [**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/)
Μπορείτε να χρησιμοποιήσετε το εργαλείο [**YaraGen**](https://github.com/Neo23x0/yarGen) για να δημιουργήσετε yara rules από ένα δυαδικό αρχείο. Δείτε αυτούς τους οδηγούς: [**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
python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m ../../mals/
@ -57,21 +57,21 @@ clamscan folderpath #Scan the whole folder
```
### [Capa](https://github.com/mandiant/capa)
**Capa** ανιχνεύει ενδεχομένως κακόβουλες **δυνατότητες** σε εκτελέσιμα: PE, ELF, .NET. Έτσι θα εντοπίσει πράγματα όπως Att\&ck tactics, ή ύποπτες δυνατότητες όπως:
**Capa** εντοπίζει πιθανώς κακόβουλες **capabilities** σε executables: PE, ELF, .NET. Έτσι θα βρει πράγματα όπως Att\&ck tactics, ή ύποπτες **capabilities** όπως:
- έλεγχος για σφάλμα OutputDebugString
- εκτέλεση ως υπηρεσία
- δημιουργία διεργασίας
- check for OutputDebugString error
- run as a service
- create process
Κατεβάστε το από το [**Github repo**](https://github.com/mandiant/capa).
Κατέβασέ το από το [**Github repo**](https://github.com/mandiant/capa).
### IOCs
IOC σημαίνει Indicator Of Compromise. Ένα IOC είναι ένα σύνολο **συνθηκών που εντοπίζουν** κάποιο πιθανώς ανεπιθύμητο λογισμικό ή επιβεβαιωμένο **malware**. Οι Blue Teams χρησιμοποιούν αυτόν τον τύπο ορισμού για να **αναζητούν αυτού του είδους τα κακόβουλα αρχεία** στα **systems** και τα **networks**.\
Η ανταλλαγή αυτών των ορισμών είναι πολύ χρήσιμη, καθώς όταν το malware εντοπιστεί σε έναν υπολογιστή και δημιουργηθεί ένα IOC για αυτό, άλλες Blue Teams μπορούν να το χρησιμοποιήσουν για να αναγνωρίσουν το malware πιο γρήγορα.
IOC σημαίνει Indicator Of Compromise. Ένα IOC είναι ένα σύνολο **κριτηρίων που προσδιορίζουν** κάποιο πιθανώς ανεπιθύμητο λογισμικό ή επιβεβαιωμένο **malware**. Οι Blue Teams χρησιμοποιούν αυτόν τον τύπο ορισμού για να **αναζητήσουν αυτό το είδος κακόβουλων αρχείων** στα **συστήματα** και τα **δίκτυά** τους.\
Η κοινοποίηση αυτών των ορισμών είναι πολύ χρήσιμη, αφού όταν ένα malware εντοπιστεί σε έναν υπολογιστή και δημιουργηθεί ένα IOC για αυτό, άλλες Blue Teams μπορούν να το χρησιμοποιήσουν για να αναγνωρίσουν το malware πιο γρήγορα.
Ένα εργαλείο για τη δημιουργία ή τροποποίηση IOCs είναι [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**Redline**](https://www.fireeye.com/services/freeware/redline.html) για να **αναζητήσετε καθορισμένα IOCs σε μια συσκευή**.
Ένα εργαλείο για να δημιουργείς ή να τροποποιείς IOCs είναι [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
Μπορείς να χρησιμοποιήσεις εργαλεία όπως [**Redline**](https://www.fireeye.com/services/freeware/redline.html) για να **search for defined IOCs in a device**.
### Loki
@ -92,7 +92,7 @@ Compares process connection endpoints with C2 IOCs (new since version v.10)
```
### Linux Malware Detect
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) είναι ένας malware σαρωτής για Linux που διανέμεται υπό την άδεια GNU GPLv2 και έχει σχεδιαστεί για τις απειλές που αντιμετωπίζονται σε περιβάλλοντα κοινής φιλοξενίας. Χρησιμοποιεί δεδομένα απειλών από συστήματα ανίχνευσης εισβολών στο άκρο του δικτύου για να εξάγει malware που χρησιμοποιείται ενεργά σε επιθέσεις και να δημιουργεί υπογραφές για την ανίχνευση. Επιπλέον, δεδομένα απειλών προέρχονται επίσης από υποβολές χρηστών μέσω της δυνατότητας LMD checkout και από πόρους της κοινότητας malware.
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) είναι ένας malware scanner για Linux που κυκλοφορεί υπό την άδεια GNU GPLv2 και έχει σχεδιαστεί για τις απειλές που αντιμετωπίζονται σε κοινόχρηστα περιβάλλοντα φιλοξενίας. Χρησιμοποιεί δεδομένα απειλών από network edge intrusion detection systems για να εξάγει malware που χρησιμοποιείται ενεργά σε επιθέσεις και να δημιουργεί signatures για τον εντοπισμό. Επιπλέον, δεδομένα απειλών προέρχονται επίσης από υποβολές χρηστών μέσω του LMD checkout feature και από πόρους της malware κοινότητας.
### rkhunter
@ -102,15 +102,15 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
```
### FLOSS
[**FLOSS**](https://github.com/mandiant/flare-floss) είναι ένα εργαλείο που θα προσπαθήσει να βρει obfuscated strings μέσα σε executables χρησιμοποιώντας διάφορες τεχνικές.
[**FLOSS**](https://github.com/mandiant/flare-floss) είναι ένα εργαλείο που θα προσπαθήσει να εντοπίσει obfuscated strings μέσα σε executables χρησιμοποιώντας διάφορες τεχνικές.
### PEpper
[PEpper ](https://github.com/Th3Hurrican3/PEpper) ελέγχει κάποια βασικά πράγματα μέσα στο executable (binary data, entropy, URLs and IPs, some yara rules).
[PEpper ](https://github.com/Th3Hurrican3/PEpper) ελέγχει κάποια βασικά πράγματα μέσα στο executable (binary data, entropy, URLs and IPs, κάποια yara rules).
### PEstudio
[PEstudio](https://www.winitor.com/download) είναι ένα εργαλείο που επιτρέπει την άντληση πληροφοριών από Windows executables όπως imports, exports, headers, αλλά θα ελέγχει επίσης το virus total και θα εντοπίζει πιθανές Att\&ck τεχνικές.
[PEstudio](https://www.winitor.com/download) είναι ένα εργαλείο που επιτρέπει την άντληση πληροφοριών για Windows executables όπως imports, exports, headers, αλλά επίσης θα ελέγξει virus total και θα εντοπίσει πιθανές Att\&ck τεχνικές.
### Detect It Easy(DiE)
@ -118,15 +118,15 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
### NeoPI
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) είναι ένα Python script που χρησιμοποιεί μια ποικιλία από **statistical methods** για να εντοπίσει **obfuscated** και **encrypted** περιεχόμενο μέσα σε text/script αρχεία. Ο σκοπός του NeoPI είναι να βοηθήσει στην **detection of hidden web shell code**.
[**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**](https://github.com/nbs-system/php-malware-finder) προσπαθεί όσο μπορεί να εντοπίσει **obfuscated**/**dodgy code** καθώς και αρχεία που χρησιμοποιούν **PHP** functions που συχνά χρησιμοποιούνται σε **malwares**/webshells.
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) κάνει ό,τι καλύτερο μπορεί για να εντοπίσει **obfuscated**/**dodgy code** καθώς και αρχεία που χρησιμοποιούν **PHP** functions που συχνά χρησιμοποιούνται σε **malwares**/webshells.
### Apple Binary Signatures
Κατά τον έλεγχο κάποιου **malware sample** θα πρέπει πάντα να **check the signature** του binary καθώς ο **developer** που το υπέγραψε μπορεί να είναι ήδη **related** με **malware.**
Όταν ελέγχετε κάποιο **malware sample** θα πρέπει πάντα να **check the signature** του binary, καθώς ο **developer** που το υπέγραψε μπορεί ήδη να είναι **related** με **malware.**
```bash
#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -141,21 +141,21 @@ spctl --assess --verbose /Applications/Safari.app
### File Stacking
Αν γνωρίζετε ότι κάποιος φάκελος που περιέχει τα **αρχεία** ενός web server ενημερώθηκε **τελευταία σε κάποια ημερομηνία**, **ελέγξτε** την **ημερομηνία** κατά την οποία όλα τα **αρχεία** στον **web server δημιουργήθηκαν και τροποποιήθηκαν** και αν κάποια ημερομηνία είναι **ύποπτη**, ελέγξτε εκείνο το αρχείο.
Αν ξέρετε ότι κάποιος φάκελος που περιέχει τα **files** ενός web server ενημερώθηκε **τελευταία φορά σε κάποια ημερομηνία**, **ελέγξτε** την **ημερομηνία** δημιουργίας και τροποποίησης όλων των **files** στον **web server** και αν κάποια ημερομηνία είναι **ύποπτη**, ελέγξτε εκείνο το αρχείο.
### Baselines
### Βάσεις Αναφοράς
Αν τα αρχεία ενός φακέλου **δεν έπρεπε να είχαν τροποποιηθεί**, μπορείτε να υπολογίσετε το **hash** των **αρχικών αρχείων** του φακέλου και να τα **συγκρίνετε** με τα **τρέχοντα**. Οτιδήποτε τροποποιημένο θα είναι **ύποπτο**.
Αν τα αρχεία ενός φακέλου **δεν έπρεπε να έχουν τροποποιηθεί**, μπορείτε να υπολογίσετε το **hash** των **αρχικών αρχείων** του φακέλου και να τα **συγκρίνετε** με τα **τρέχοντα**. Οτιδήποτε τροποποιημένο θα είναι **ύποπτο**.
### Statistical Analysis
### Στατιστική Ανάλυση
Όταν οι πληροφορίες αποθηκεύονται σε αρχεία καταγραφής μπορείτε να **ελέγξετε στατιστικά όπως πόσες φορές προσπελάστηκε κάθε αρχείο ενός web server καθώς ένα web shell μπορεί να είναι ένα από τα πιο**.
Όταν οι πληροφορίες αποθηκεύονται σε logs μπορείτε να **ελέγξετε στατιστικά** όπως πόσες φορές προσπελάστηκε κάθε αρχείο του web server, αφού ένα web shell μπορεί να είναι ένα από τα πιο προσπελασμένα.
---
### Android in-app native telemetry (no root)
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.
Σε Android, μπορείτε να instrument το native code μέσα στη διαδικασία του target app προφορτώνοντας μια μικρή βιβλιοθήκη logger πριν αρχικοποιηθούν άλλες JNI libs. Αυτό δίνει πρώιμη ορατότητα στη native συμπεριφορά χωρίς system-wide hooks ή root. Μια δημοφιλής προσέγγιση είναι το SoTap: βάλτε libsotap.so για το σωστό ABI μέσα στο APK και εισάγετε μια κλήση System.loadLibrary("sotap") νωρίς (π.χ., static initializer ή Application.onCreate), στη συνέχεια συλλέξτε logs από εσωτερικές/εξωτερικές διαδρομές ή fallback σε Logcat.
See the Android native reversing page for setup details and log paths:
@ -165,13 +165,13 @@ See the Android native reversing page for setup details and log paths:
---
## Αποκρυπτογράφηση Δυναμικής Ροής Ελέγχου (JMP/CALL RAX Dispatchers)
## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)
Σύγχρονες οικογένειες malware κάνουν εκτεταμένη χρήση της απόκρυψης του Control-Flow Graph (CFG): αντί για έναν άμεσο jump/call υπολογίζουν τον προορισμό κατά το χρόνο εκτέλεσης και εκτελούν `jmp rax` ή `call rax`. Ένας μικρός *dispatcher* (τυπικά εννέα εντολές) ορίζει τον τελικό στόχο ανάλογα με τις CPU `ZF`/`CF` σημαίες, καταστρέφοντας εντελώς τη στατική ανάκτηση του CFG.
Modern malware families heavily abuse Control-Flow Graph (CFG) obfuscation: instead of a direct jump/call they compute the destination at run-time and execute a `jmp rax` or `call rax`. A small *dispatcher* (typically nine instructions) sets the final target depending on the CPU `ZF`/`CF` flags, completely breaking static CFG recovery.
Η τεχνική showcased by the SLOW#TEMPEST loader can be defeated with a three-step workflow that only relies on IDAPython and the Unicorn CPU emulator.
The technique 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
### 1. Εντοπίστε κάθε έμμεσο jump / call
```python
import idautils, idc
@ -180,7 +180,7 @@ mnem = idc.print_insn_mnem(ea)
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
print(f"[+] Dispatcher found @ {ea:X}")
```
### 2. Εξαγωγή του dispatcher byte-code
### 2. Εξαγάγετε το dispatcher byte-code
```python
import idc
@ -195,7 +195,7 @@ size = jmp_ea + idc.get_item_size(jmp_ea) - start
code = idc.get_bytes(start, size)
open(f"{start:X}.bin", "wb").write(code)
```
### 3. Εξομοιώστε το δύο φορές με Unicorn
### 3. Εξομοιώστε το δύο φορές με το Unicorn
```python
from unicorn import *
from unicorn.x86_const import *
@ -211,7 +211,7 @@ mu.reg_write(UC_X86_REG_RAX, 0)
mu.emu_start(BASE, BASE+len(code))
return mu.reg_read(UC_X86_REG_RAX)
```
Τρέξτε `run(code,0,0)` και `run(code,1,1)` για να λάβετε τους στόχους διακλάδωσης *false* και *true*.
Εκτελέστε `run(code,0,0)` και `run(code,1,1)` για να αποκτήσετε τους στόχους των κλάδων *false* και *true*.
### 4. Επαναφορά με patch ενός άμεσου jump / call
```python
@ -222,22 +222,22 @@ op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
disp = target - (ea + 5) & 0xFFFFFFFF
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
```
Μετά το patching, αναγκάστε το IDA να επανα-αναλύσει τη συνάρτηση ώστε το πλήρες CFG και το Hex-Rays output να αποκατασταθούν:
Μετά το patching, αναγκάστε το IDA να αναλύσει ξανά τη συνάρτηση ώστε να αποκατασταθούν ο πλήρης CFG και η έξοδος του Hex-Rays:
```python
import ida_auto, idaapi
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
```
### 5. Επισημάνετε έμμεσες κλήσεις API
### 5. Επισήμανση έμμεσων κλήσεων API
Μόλις γίνει γνωστός ο πραγματικός προορισμός κάθε `call rax`, μπορείτε να πείτε στο IDA τι είναι ώστε οι τύποι παραμέτρων & τα ονόματα μεταβλητών να ανακτηθούν αυτόματα:
Αφού γίνει γνωστός ο πραγματικός προορισμός κάθε `call rax`, μπορείτε να πείτε στην IDA τι είναι, ώστε οι τύποι παραμέτρων & τα ονόματα μεταβλητών να ανακτηθούν αυτόματα:
```python
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
```
### Πρακτικά οφέλη
* Αποκαθιστά το πραγματικό CFG → η απομεταγλώττιση μετατρέπεται από *10* γραμμές σε χιλιάδες.
* Επιτρέπει string-cross-reference & xrefs, καθιστώντας την ανακατασκευή της συμπεριφοράς πολύ εύκολη.
* Τα Scripts είναι επαναχρησιμοποιήσιμα: τοποθετήστε τα σε οποιονδήποτε loader που προστατεύεται από το ίδιο τρικ.
* Επαναφέρει το πραγματικό CFG → η decompilation αυξάνεται από *10* γραμμές σε χιλιάδες.
* Ενεργοποιεί string-cross-reference & xrefs, καθιστώντας την ανακατασκευή της συμπεριφοράς πολύ απλή.
* Τα Scripts είναι επαναχρησιμοποιήσιμα: τοποθετήστε τα σε οποιονδήποτε loader που προστατεύεται από το ίδιο κόλπο.
---

View File

@ -1,50 +1,50 @@
# Reversing Native Libraries
# Αντίστροφη ανάλυση native βιβλιοθηκών
{{#include ../../banners/hacktricks-training.md}}
**For further information check:** [**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 εφαρμογές μπορούν να χρησιμοποιούν native libraries, συνήθως γραμμένες σε C ή C++, για εργασίες κρίσιμες στην απόδοση. Οι δημιουργοί malware επίσης καταχρώνται αυτές τις βιβλιοθήκες επειδή τα ELF shared objects εξακολουθούν να είναι πιο δύσκολα στην decompile σε σχέση με το DEX/OAT byte-code.
Αυτή η σελίδα εστιάζει σε *πρακτικές* ροές εργασίας και σε *πρόσφατες* βελτιώσεις εργαλείων (2023-2025) που καθιστούν την ανάλυση των Android `.so` αρχείων ευκολότερη.
Οι Android εφαρμογές μπορούν να χρησιμοποιούν native βιβλιοθήκες, συνήθως γραμμένες σε C ή C++, για εργασίες κρίσιμες ως προς την απόδοση. Οι δημιουργοί malware επίσης κακοποιούν αυτές τις βιβλιοθήκες επειδή τα ELF shared objects είναι ακόμα πιο δύσκολα στην αποσύνθεση από το DEX/OAT byte-code.
Αυτή η σελίδα επικεντρώνεται σε *πρακτικά* workflows και *πρόσφατες* βελτιώσεις εργαλείων (2023-2025) που κάνουν την αντίστροφη ανάλυση των Android `.so` αρχείων πιο εύκολη.
---
### Quick triage-workflow for a freshly pulled `libfoo.so`
### Γρήγορο workflow διαλογής για ένα πρόσφατα εξαγμένο `libfoo.so`
1. **Extract the library**
1. **Εξαγωγή της βιβλιοθήκης**
```bash
# From an installed application
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Or from the APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
```
2. **Identify architecture & protections**
2. **Καθορισμός αρχιτεκτονικής & προστασιών**
```bash
file libfoo.so # arm64 or arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so # (peda/pwntools)
```
3. **List exported symbols & JNI bindings**
3. **Καταγραφή εξαγόμενων συμβόλων & δεσμών JNI**
```bash
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
```
4. **Load in a decompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) and run auto-analysis.
Οι νεότερες εκδόσεις του 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).
4. **Φόρτωση σε decompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) και εκτέλεση αυτόματης ανάλυσης.
Οι νεότερες εκδόσεις Ghidra εισήγαγαν έναν AArch64 decompiler που αναγνωρίζει PAC/BTI stubs και MTE tags, βελτιώνοντας σημαντικά την ανάλυση βιβλιοθηκών που χτίστηκαν με το Android 14 NDK.
5. **Αποφασίστε για static vs dynamic reversing:** ο stripped, obfuscated κώδικας συχνά χρειάζεται *instrumentation* (Frida, ptrace/gdbserver, LLDB).
---
### Dynamic Instrumentation (Frida ≥ 16)
### Δυναμική instrumentation (Frida ≥ 16)
Η σειρά 16 του Frida έφερε αρκετές βελτιώσεις ειδικές για Android που βοηθούν όταν ο στόχος χρησιμοποιεί σύγχρονες βελτιστοποιήσεις Clang/LLD:
Η σειρά 16 του Frida έφερε αρκετές βελτιώσεις ειδικά για Android που βοηθούν όταν ο στόχος χρησιμοποιεί σύγχρονες βελτιστοποιήσεις Clang/LLD:
* `thumb-relocator` can now *hook tiny ARM/Thumb functions* generated by LLDs aggressive alignment (`--icf=all`).
* Enumerating and rebinding *ELF import slots* works on Android, enabling per-module `dlopen()`/`dlsym()` patching when inline hooks are rejected.
* Java hooking was fixed for the new **ART quick-entrypoint** used when apps are compiled with `--enable-optimizations` on Android 14.
* `thumb-relocator` πλέον μπορεί να hook tiny ARM/Thumb functions που παράγονται από την επιθετική στοίχιση του LLD (`--icf=all`).
* Η καταγραφή και επαναδέσμευση των *ELF import slots* λειτουργεί σε Android, επιτρέποντας per-module `dlopen()`/`dlsym()` patching όταν τα inline hooks απορρίπτονται.
* Το Java hooking διορθώθηκε για το νέο **ART quick-entrypoint** που χρησιμοποιείται όταν οι εφαρμογές μεταγλωττίζονται με `--enable-optimizations` στο Android 14.
Example: enumerating all functions registered through `RegisterNatives` and dumping their addresses at runtime:
Παράδειγμα: καταγραφή όλων των functions που εγγράφονται μέσω `RegisterNatives` και dump των διευθύνσεών τους κατά το runtime:
```javascript
Java.perform(function () {
var Runtime = Java.use('java.lang.Runtime');
@ -61,29 +61,29 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
});
});
```
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.
Frida θα λειτουργήσει χωρίς επιπλέον ρυθμίσεις σε συσκευές με ενεργοποιημένο PAC/BTI (Pixel 8/Android 14+) αρκεί να χρησιμοποιήσετε frida-server 16.2 ή νεότερη — οι παλαιότερες εκδόσεις απέτυχαν να εντοπίσουν padding για inline hooks.
### Τηλεμετρία JNI τοπική στη διαδικασία μέσω προφορτωμένου .so (SoTap)
### Τοπική τηλεμετρία JNI σε επίπεδο διεργασίας μέσω προφορτωμένης .so (SoTap)
Όταν η πλήρης instrumentation είναι υπερβολική ή μπλοκαρισμένη, μπορείτε ακόμα να αποκτήσετε ορατότητα σε native επίπεδο προφορτώνοντας έναν μικρό logger μέσα στη στοχευόμενη διαδικασία. SoTap είναι μια ελαφριά Android native (.so) βιβλιοθήκη που καταγράφει τη συμπεριφορά κατά το runtime άλλων JNI (.so) βιβλιοθηκών μέσα στην ίδια app process (no root required).
Όταν η πλήρης instrumentation με όλα τα χαρακτηριστικά είναι υπερβολική ή μπλοκάρεται, μπορείτε παρόλα αυτά να αποκτήσετε ορατότητα σε επίπεδο native προφορτώνοντας έναν μικρό logger μέσα στη στοχευόμενη διεργασία. Το SoTap είναι μια ελαφριά Android native (.so) βιβλιοθήκη που καταγράφει τη συμπεριφορά κατά το runtime άλλων JNI (.so) βιβλιοθηκών μέσα στην ίδια διεργασία εφαρμογής (no root required).
Κύρια χαρακτηριστικά:
- Εκκινεί νωρίς και παρατηρεί τις JNI/native αλληλεπιδράσεις μέσα στη διαδικασία που το φορτώνει.
- Διατηρεί τα logs χρησιμοποιώντας πολλαπλές εγγράψιμες διαδρομές με ομαλή επιστροφή στο Logcat όταν ο αποθηκευτικός χώρος είναι περιορισμένος.
- Source-customizable: επεξεργαστείτε το sotap.c για να επεκτείνετε/προσαρμόσετε τι καταγράφεται και κάντε rebuild ανά ABI.
Βασικά χαρακτηριστικά:
- Εκκινεί νωρίς και παρακολουθεί τις αλληλεπιδράσεις JNI/native μέσα στη διεργασία που το φορτώνει.
- Αποθηκεύει τα logs σε πολλαπλές εγγράψιμες τοποθεσίες με ομαλή εναλλαγή στο Logcat όταν ο αποθηκευτικός χώρος είναι περιορισμένος.
- Προσαρμόσιμο σε επίπεδο πηγαίου κώδικα: επεξεργαστείτε το sotap.c για να επεκτείνετε/προσαρμόσετε τι καταγράφεται και ανακατασκευάστε ανά ABI.
Ρύθμιση (repack the APK):
1) Τοποθετήστε το κατάλληλο ABI build μέσα στο APK ώστε ο loader να μπορεί να επιλύσει libsotap.so:
1) Drop the proper ABI build into the APK so the loader can resolve 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:
2) Ensure SoTap loads before other JNI libs. Inject a call early (e.g., Application subclass static initializer or onCreate) so the logger is initialized first. Smali snippet example:
```smali
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
```
3) Κάντε rebuild/sign/install, τρέξτε την εφαρμογή, και στη συνέχεια συλλέξτε τα logs.
3) Rebuild/sign/install, run the app, then collect logs.
Log paths (checked in order):
Διαδρομές καταγραφών (ελέγχονται με αυτή τη σειρά):
```
/data/user/0/%s/files/sotap.log
/data/data/%s/files/sotap.log
@ -92,40 +92,40 @@ Log paths (checked in order):
# If all fail: fallback to Logcat only
```
Σημειώσεις και αντιμετώπιση προβλημάτων:
- ABI alignment είναι υποχρεωτική. Μη αντιστοιχία θα προκαλέσει UnsatisfiedLinkError και ο logger δεν θα φορτωθεί.
- Περιορισμοί αποθηκευτικού χώρου είναι συνηθισμένοι σε σύγχρονα Android· αν οι εγγραφές αρχείων αποτύχουν, το SoTap θα εξακολουθήσει να εκπέμπει μέσω Logcat.
- Η συμπεριφορά/επίπεδο λεπτομέρειας προορίζεται για προσαρμογή· αναδημιουργήστε από τον πηγαίο κώδικα μετά την επεξεργασία του sotap.c.
- Η ευθυγράμμιση του ABI είναι υποχρεωτική. Μη ταύτιση θα προκαλέσει UnsatisfiedLinkError και ο logger δεν θα φορτωθεί.
- Οι περιορισμοί αποθήκευσης είναι συνηθισμένοι σε σύγχρονα Android· αν οι εγγραφές αρχείων αποτύχουν, το SoTap θα εξακολουθήσει να εκδίδει μέσω Logcat.
- Η συμπεριφορά/λεπτολογησία προορίζεται να προσαρμοστεί· αναδημιουργήστε από τον πηγαίο κώδικα μετά την επεξεργασία του sotap.c.
Αυτή η προσέγγιση είναι χρήσιμη για malware triage και JNI debugging όπου η παρατήρηση των native call flows από την εκκίνηση της διεργασίας είναι κρίσιμη αλλά root/system-wide hooks δεν είναι διαθέσιμα.
Αυτή η προσέγγιση είναι χρήσιμη για malware triage και JNI debugging όπου η παρακολούθηση των ροών κλήσεων native από την εκκίνηση της διεργασίας είναι κρίσιμη αλλά δεν υπάρχουν διαθέσιμα root/system-wide hooks.
---
### Πρόσφατες ευπάθειες που αξίζει να αναζητήσετε σε APKs
| Έτος | CVE | Επηρεαζόμενη βιβλιοθήκη | Σημειώσεις |
| Έτος | CVE | Επηρεασμένη βιβλιοθήκη | Σημειώσεις |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow προσβάσιμος από native code που αποκωδικοποιεί εικόνες WebP. Πολλές εφαρμογές Android συνοδεύουν ευπαθείς εκδόσεις. Όταν δείτε ένα `libwebp.so` μέσα σε ένα APK, ελέγξτε την έκδοσή του και δοκιμάστε εκμετάλλευση ή επιδιόρθωση.| |
|2024|Multiple|OpenSSL 3.x series|Πολλά ζητήματα memory-safety και padding-oracle. Πολλά Flutter & ReactNative bundles περιλαμβάνουν το δικό τους `libcrypto.so`.|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow reachable from native code that decodes WebP images. Several Android apps bundle vulnerable versions. When you see a `libwebp.so` inside an APK, check its version and attempt exploitation or patching.| |
|2024|Multiple|OpenSSL 3.x series|Several memory-safety and padding-oracle issues. Many Flutter & ReactNative bundles ship their own `libcrypto.so`.|
Όταν εντοπίσετε *third-party* `.so` αρχεία μέσα σε ένα APK, πάντα συγκρίνετε το hash τους με upstream advisories. Η SCA (Software Composition Analysis) είναι ασυνήθιστη στο mobile, οπότε παλιές ευπαθείς builds είναι διαδεδομένες.
Όταν εντοπίσετε *third-party* `.so` αρχεία μέσα σε ένα APK, πάντα αντιπαραβάλετε το hash τους με upstream advisories. SCA (Software Composition Analysis) είναι ασυνήθιστη στο mobile, οπότε παλιές ευάλωτες builds είναι διαδεδομένες.
---
### Anti-Reversing & Hardening τάσεις (Android 13-15)
### Anti-Reversing & Hardening trends (Android 13-15)
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Το Android 14 ενεργοποιεί PAC/BTI στις system libraries σε υποστηριζόμενο silicon ARMv8.3+. Οι decompilers τώρα εμφανίζουν PACrelated pseudo-instructions· για dynamic analysis το Frida εισάγει trampolines *after* stripping PAC, αλλά τα custom trampolines σας πρέπει να καλούν `pacda`/`autibsp` όπου χρειάζεται.
* **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):** commercial packers (e.g., Bangcle, SecNeo) όλο και περισσότερο προστατεύουν το *native* code, όχι μόνο Java· αναμένετε bogus control-flow και encrypted string blobs στο `.rodata`.
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 ενεργοποιεί PAC/BTI στις system libraries σε υποστηριζόμενο ARMv8.3+ silicon. Οι decompilers πλέον εμφανίζουν PACσχετικές pseudo-instructions· για dynamic analysis το Frida εγχέει trampolines *after* stripping PAC, αλλά τα custom trampolines σας θα πρέπει να καλούν `pacda`/`autibsp` όπου χρειάζεται.
* **MTE & Scudo hardened allocator:** Το memory-tagging είναι opt-in αλλά πολλές Play-Integrity aware apps κάνουν build με `-fsanitize=memtag`; χρησιμοποιήστε `setprop arm64.memtag.dump 1` μαζί με `adb shell am start ...` για να καταγράψετε tag faults.
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** commercial packers (e.g., Bangcle, SecNeo) increasingly protect *native* code, not only Java; expect bogus control-flow and encrypted string blobs in `.rodata`.
---
### Πόροι
### Resources
- **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/)
- **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
### Αναφορές
### References
- 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)

View File

@ -1,57 +1,57 @@
# Smali - Απομεταγλώττιση/[Τροποποίηση]/Μεταγλώττιση
# Smali - Decompiling/[Modifying]/Compiling
{{#include ../../banners/hacktricks-training.md}}
Μερικές φορές είναι ενδιαφέρον να τροποποιήσεις τον κώδικα της εφαρμογής για να αποκτήσεις πρόσβαση σε κρυφές πληροφορίες (ίσως καλά συγκεκαλυμμένα συνθηματικά ή flags). Τότε, μπορεί να είναι χρήσιμο να απομεταγλωττίσεις το apk, να τροποποιήσεις τον κώδικα και να το μεταγλωττίσεις ξανά.
Μερικές φορές είναι ενδιαφέρον να modify τον κώδικα της εφαρμογής για να αποκτήσετε κρυφές πληροφορίες (ίσως καλά obfuscated passwords ή flags). Τότε, μπορεί να είναι χρήσιμο να decompile το apk, να modify τον κώδικα και να recompile αυτό.
**Αναφορά Opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
**Opcodes reference:** [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), μπορείτε να **automatically decompile**, modify, **recompile**, sign & install την εφαρμογή χωρίς να εκτελέσετε καμία εντολή.
Ένα άλλο **script** που διευκολύνει πολύ αυτή την εργασία είναι [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
## Απομεταγλώττιση του APK
## Decompile the APK
Χρησιμοποιώντας το APKTool μπορείς να έχεις πρόσβαση στο **smali code and resources**:
Χρησιμοποιώντας APKTool μπορείτε να έχετε πρόσβαση στον **smali code and resources**:
```bash
apktool d APP.apk
```
Αν **apktool** σας δώσει κάποιο σφάλμα, δοκιμάστε[ installing the **latest version**](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_ (and all xmls inside res/values/*)
- _AndroidManifest.xml_
- Οποιοδήποτε αρχείο με κατάληξη _.sqlite_ ή _.db_
- Οποιοδήποτε αρχείο με επέκταση _.sqlite_ ή _.db_
Αν `apktool` έχει **προβλήματα στην αποκωδικοποίηση της εφαρμογής** ρίξτε μια ματιά στο [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ή δοκιμάστε να χρησιμοποιήσετε το όρισμα **`-r`** (μην αποκωδικοποιήσετε τα resources). Έτσι, αν το πρόβλημα βρισκόταν σε κάποιο resource και όχι στον πηγαίο κώδικα, δεν θα αντιμετωπίσετε το πρόβλημα (επίσης δεν θα αποσυμπιλοποιηθούν τα resources).
Αν το `apktool` έχει **προβλήματα στην αποκωδικοποίηση της εφαρμογής** ρίξτε μια ματιά στο [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ή δοκιμάστε να χρησιμοποιήσετε το όρισμα **`-r`** (μην αποκωδικοποιήσετε τα resources). Τότε, αν το πρόβλημα ήταν σε ένα resource και όχι στον πηγαίο κώδικα, δεν θα έχετε το πρόβλημα (επίσης δεν θα αποσυμπιλοποιήσετε τα resources).
## Αλλαγή κώδικα smali
Μπορείτε να **αλλάξετε** **εντολές**, να αλλάξετε την **τιμή** ορισμένων μεταβλητών ή να **προσθέσετε** νέες εντολές. Εγώ αλλάζω τον κώδικα Smali χρησιμοποιώντας το [**VS Code**](https://code.visualstudio.com), στη συνέχεια εγκαθιστάτε την **smalise extension** και ο επεξεργαστής θα σας πει αν κάποια **εντολή είναι λανθασμένη**.
Μπορείτε να **αλλάξετε** **εντολές**, να αλλάξετε την **τιμή** ορισμένων μεταβλητών ή να **προσθέσετε** νέες εντολές. Εγώ αλλάζω τον κώδικα Smali χρησιμοποιώντας [**VS Code**](https://code.visualstudio.com), στη συνέχεια εγκαθιστάτε το **smalise extension** και ο editor θα σας πει αν κάποια **εντολή είναι λανθασμένη**.\
Μερικά **παραδείγματα** μπορείτε να βρείτε εδώ:
- [Smali changes examples](smali-changes.md)
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
Ή μπορείτε να [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
Ή μπορείτε [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
## Recompile the APK
## Επανασυγκρότηση του APK
Μετά την τροποποίηση του κώδικα μπορείτε να **επανασυγγράψετε** τον κώδικα χρησιμοποιώντας:
Μετά την τροποποίηση του κώδικα μπορείτε να **επανασυμπιλοποιήσετε** τον κώδικα χρησιμοποιώντας:
```bash
apktool b . #In the folder generated when you decompiled the application
```
Θα **compile** το νέο APK **inside** τον _**dist**_ φάκελο.
Θα **compile** το νέο APK **inside** τον φάκελο _**dist**_.
Αν το **apktool** πετάξει **error**, δοκιμάστε [ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
Αν **apktool** εμφανίσει ένα **error**, δοκίμασε [ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
### **Υπογράψτε το νέο APK**
### **Sign the new APK**
Στη συνέχεια, πρέπει να **generate a key** (θα σας ζητηθεί ένα password και κάποιες πληροφορίες που μπορείτε να συμπληρώσετε τυχαία):
Έπειτα, χρειάζεται να **generate a key** (θα σου ζητηθεί να δώσεις password και κάποιες πληροφορίες που μπορείς να συμπληρώσεις τυχαία):
```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
```
@ -61,20 +61,20 @@ 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). [Περισσότερες πληροφορίες εδώ](https://developer.android.com/studio/command-line/zipalign).
```bash
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk
```
### **Υπογράψτε το νέο APK (ξανά;)**
### **Υπογράψτε το νέο APK (ξανά?)**
Αν **προτιμάτε** να χρησιμοποιήσετε [**apksigner**](https://developer.android.com/studio/command-line/) αντί για jarsigner, **πρέπει να υπογράψετε το APK** αφού εφαρμόσετε **τη βελτιστοποίηση με** zipalign. ΑΛΛΑ ΣΗΜΕΙΩΣΤΕ ΟΤΙ ΠΡΕΠΕΙ ΝΑ **ΥΠΟΓΡΑΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΗ ΜΟΝΟ ΜΙΑ ΦΟΡΑ** ΜΕ jarsigner (πριν το zipalign) Ή ΜΕ apksigner (μετά το zipalign).
Εάν **προτιμάτε** να χρησιμοποιήσετε [**apksigner**](https://developer.android.com/studio/command-line/) αντί για jarsigner, **θα πρέπει να υπογράψετε το apk** αφού εφαρμόσετε **τη βελτιστοποίηση με** zipaling. ΑΛΛΑ ΣΗΜΕΙΩΣΤΕ ΟΤΙ ΠΡΕΠΕΙ ΝΑ **ΥΠΟΓΡΑΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΗ ΜΟΝΟ ΜΙΑ ΦΟΡΑ** ΜΕ jarsigner (πριν το zipalign) Ή ΜΕ aspsigner (μετά το zipaling).
```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk
```
## Τροποποίηση Smali
Για τον ακόλουθο Java κώδικα Hello World:
Για τον παρακάτω Hello World Java κώδικα:
```java
public static void printHelloWorld() {
System.out.println("Hello World")
@ -90,13 +90,13 @@ invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
```
The Smali instruction set is available [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
Το σύνολο εντολών Smali είναι διαθέσιμο [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
### Ελαφρές Αλλαγές
### Ελαφρές αλλαγές
### Τροποποίηση αρχικών τιμών μιας μεταβλητής μέσα σε μια συνάρτηση
Ορισμένες μεταβλητές ορίζονται στην αρχή της συνάρτησης χρησιμοποιώντας το opcode _const_, μπορείτε να τροποποιήσετε τις τιμές τους, ή να ορίσετε νέες:
Κάποιες μεταβλητές ορίζονται στην αρχή της συνάρτησης χρησιμοποιώντας την opcode _const_, μπορείτε να τροποποιήσετε τις τιμές τους, ή να ορίσετε νέες:
```bash
#Number
const v9, 0xf4240
@ -104,7 +104,7 @@ const/4 v8, 0x1
#Strings
const-string v5, "wins"
```
### Βασικές Ενέργειες
### Βασικές Λειτουργίες
```bash
#Math
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
@ -140,17 +140,17 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
```
Recommendations:
- Αν πρόκειται να χρησιμοποιήσετε δηλωμένες μεταβλητές μέσα στη συνάρτηση (δηλωμένες v0,v1,v2...) τοποθετήστε αυτές τις γραμμές μεταξύ των _.local <number>_ και των δηλώσεων των μεταβλητών (_const v0, 0x1_)
- Αν θέλετε να βάλετε τον logging κώδικα στη μέση του κώδικα μιας συνάρτησης:
- Προσθέστε 2 στον αριθμό των δηλωμένων μεταβλητών: Ex: από _.locals 10_ to _.locals 12_
- Οι νέες μεταβλητές πρέπει να είναι οι επόμενοι αριθμοί μετά τις ήδη δηλωμένες μεταβλητές (σε αυτό το παράδειγμα θα είναι _v10_ και _v11_, θυμηθείτε ότι ξεκινά σε v0).
- Αλλάξτε τον κώδικα της logging συνάρτησης και χρησιμοποιήστε _v10_ και _v11_ αντί για _v5_ και _v1_.
- Αν πρόκειται να χρησιμοποιήσετε δηλωμένες μεταβλητές μέσα στη συνάρτηση (declared v0,v1,v2...) τοποθετήστε αυτές τις γραμμές ανάμεσα στο _.local <number>_ και στις δηλώσεις των μεταβλητών (_const v0, 0x1_)
- If you want to put the logging code in the middle of the code of a function:
- Προσθέστε 2 στον αριθμό των δηλωμένων μεταβλητών: Ex: from _.locals 10_ to _.locals 12_
- Οι νέες μεταβλητές πρέπει να είναι οι επόμενοι αριθμοί των ήδη δηλωμένων μεταβλητών (σε αυτό το παράδειγμα πρέπει να είναι _v10_ και _v11_, θυμηθείτε ότι ξεκινά σε v0).
- Αλλάξτε τον κώδικα της logging function και χρησιμοποιήστε _v10_ και _v11_ αντί για _v5_ και _v1_.
### Εμφάνιση toast
### Toasting
Θυμηθείτε να προσθέσετε 3 στον αριθμό των _.locals_ στην αρχή της συνάρτησης.
Να θυμάστε να προσθέσετε 3 στο νούμερο των _.locals_ στην αρχή της συνάρτησης.
Αυτός ο κώδικας είναι προετοιμασμένος για εισαγωγή στο **μέσο μιας συνάρτησης** (**αλλάξτε** τον αριθμό των **μεταβλητών** όπως χρειάζεται). Θα πάρει την **τιμή του this.o**, θα την **μετατρέψει** σε **String** και στη συνέχεια θα **κάνει** ένα **toast** με την τιμή του.
This code is prepared to be inserted in the **middle of a function** (**change** the number of the **variables** as necessary). It will take the **value of this.o**, **transform** it to **String** and them **make** a **toast** with its value.
```bash
const/4 v10, 0x1
const/4 v11, 0x1
@ -162,9 +162,9 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
move-result-object v12
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
```
### Φόρτωση μιας native βιβλιοθήκης κατά την εκκίνηση (System.loadLibrary)
### Φόρτωση Native Library κατά την Εκκίνηση (System.loadLibrary)
Μερικές φορές χρειάζεται να προφορτώσετε μια native βιβλιοθήκη ώστε να αρχικοποιηθεί πριν από άλλες JNI libs (π.χ. για να ενεργοποιηθεί telemetry/logging σε επίπεδο διεργασίας). Μπορείτε να εισάγετε μια κλήση σε System.loadLibrary() σε έναν static initializer ή νωρίς στο Application.onCreate(). Παράδειγμα smali για static class initializer (<clinit>):
Μερικές φορές χρειάζεται να προφορτώσετε μια native library ώστε να αρχικοποιηθεί πριν από άλλες JNI libs (π.χ., για να ενεργοποιηθεί process-local telemetry/logging). Μπορείτε να εισάγετε μια κλήση προς System.loadLibrary() σε έναν static initializer ή νωρίς στο Application.onCreate(). Παράδειγμα smali για static class initializer (<clinit>):
```smali
.class public Lcom/example/App;
.super Landroid/app/Application;
@ -176,7 +176,7 @@ invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
return-void
.end method
```
Εναλλακτικά, τοποθετήστε τις ίδιες δύο εντολές στην αρχή του Application.onCreate() για να εξασφαλίσετε ότι η βιβλιοθήκη φορτώνει όσο το δυνατόν νωρίτερα:
Εναλλακτικά, τοποθετήστε τις ίδιες δύο εντολές στην αρχή του Application.onCreate() σας για να διασφαλίσετε ότι η βιβλιοθήκη φορτώνει όσο το δυνατόν νωρίτερα:
```smali
.method public onCreate()V
.locals 1
@ -189,11 +189,11 @@ return-void
.end method
```
Σημειώσεις:
- Βεβαιωθείτε ότι η σωστή παραλλαγή ABI της βιβλιοθήκης υπάρχει κάτω από lib/<abi>/ (π.χ., arm64-v8a/armeabi-v7a) για να αποφύγετε το UnsatisfiedLinkError.
- Η φόρτωση πολύ νωρίς (class static initializer) εξασφαλίζει ότι ο native logger μπορεί να παρατηρήσει τη μετέπειτα δραστηριότητα JNI.
- Βεβαιωθείτε ότι η σωστή 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)
- SoTap: Ελαφρύ in-app logger συμπεριφοράς για JNI (.so) [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
{{#include ../../banners/hacktricks-training.md}}