mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati
This commit is contained in:
parent
55eccfcffa
commit
cbd8be5fc4
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Forenzičke CheatSheets
|
||||
## Forensics CheatSheets
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
@ -24,8 +24,8 @@ sudo apt-get install -y yara
|
||||
```
|
||||
#### Pripremite pravila
|
||||
|
||||
Koristite ovaj skript da preuzmete i spojite sve yara malware rules sa github-a: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Kreirajte direktorijum _**rules**_ i izvršite skript. Ovo će kreirati fajl nazvan _**malware_rules.yar**_ koji sadrži sve yara rules za malware.
|
||||
Koristite ovaj skript da preuzmete i spojite sva yara malware pravila sa github-a: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Kreirajte direktorijum _**rules**_ i pokrenite skript. To će kreirati fajl pod nazivom _**malware_rules.yar**_ koji sadrži sva yara pravila za malware.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
@ -38,7 +38,7 @@ yara -w malware_rules.yar folder #Scan the whole folder
|
||||
```
|
||||
#### YaraGen: Provera za malware i kreiranje pravila
|
||||
|
||||
Možete koristiti alat [**YaraGen**](https://github.com/Neo23x0/yarGen) za generisanje yara rules iz binarnog fajla. Pogledajte ove tutorijale: [**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/)
|
||||
Možete koristiti alat [**YaraGen**](https://github.com/Neo23x0/yarGen) za generisanje yara rules iz binarne datoteke. Pogledajte ove tutorijale: [**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** otkriva potencijalno maliciozne **capabilities** u izvršnim fajlovima: PE, ELF, .NET. Dakle, pronaći će stvari kao što su Att\&ck tactics, ili sumnjive capabilities kao što su:
|
||||
**Capa** otkriva potencijalno zlonamerne **sposobnosti** u izvršnim fajlovima: PE, ELF, .NET. Dakle, pronaći će stvari kao što su Att\&ck tactics, ili sumnjive **sposobnosti** kao što su:
|
||||
|
||||
- provera OutputDebugString error
|
||||
- pokretanje kao service
|
||||
- provera OutputDebugString greške
|
||||
- pokretanje kao servis
|
||||
- kreiranje procesa
|
||||
|
||||
Get it int he [**Github repo**](https://github.com/mandiant/capa).
|
||||
Preuzmi ga iz [**Github repo**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC znači indikator kompromitovanja. IOC je skup **uslova koji identifikuju** neki potencijalno neželjeni softver ili potvrđeni **malware**. Blue Teams koriste ovaj tip definicije da **pretraže ovakve maliciozne fajlove** u svojim **sistemima** i **mrežama**.\
|
||||
Deljenje ovih definicija je veoma korisno: kada se malware identifikuje na računaru i kreira IOC za taj malware, drugi Blue Teams mogu ga brže identifikovati.
|
||||
IOC znači Indicator Of Compromise. IOC je skup **uslova koji identifikuju** neki potencijalno neželjeni softver ili potvrđeni **malware**. Blue Teams koriste ovu vrstu definicije da bi **pretražili ovu vrstu malicioznih fajlova** u svojim **sistemima** i **mrežama**.\
|
||||
Delijenje ovih definicija je veoma korisno, jer kada se malware identifikuje na računaru i za njega se kreira IOC, druge Blue Teams mogu koristiti taj IOC da brže identifikuju malware.
|
||||
|
||||
Alat za kreiranje ili izmenu IOC-ova je [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Možete koristiti alate kao što su [**Redline**](https://www.fireeye.com/services/freeware/redline.html) da **pretražite definisane IOCs na uređaju**.
|
||||
Alat za kreiranje ili modifikovanje IOC-ova je [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html).\
|
||||
Možete koristiti alate kao što je [**Redline**](https://www.fireeye.com/services/freeware/redline.html) da **pretražite definisane IOC-ove na uređaju**.
|
||||
|
||||
### Loki
|
||||
|
||||
@ -92,11 +92,11 @@ 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/) je malware skener za Linux, objavljen pod GNU GPLv2 licencom, koji je dizajniran oko pretnji sa kojima se susreću okruženja sa deljenim hostingom. Koristi threat data iz network edge intrusion detection systems da izvuče malware koji se aktivno koristi u napadima i generiše potpise za detekciju. Pored toga, threat data se takođe dobija iz korisničkih prijava putem LMD checkout feature i iz resursa malware zajednice.
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) je malware skener za Linux objavljen pod licencom GNU GPLv2, koji je dizajniran za pretnje sa kojima se susreću okruženja deljenog hostinga. Koristi podatke o pretnjama iz sistema za detekciju upada na mrežnoj ivici da bi izdvojio malware koji se aktivno koristi u napadima i generisao potpise za detekciju. Pored toga, podaci o pretnjama se takođe izvlače iz korisničkih prijava pomoću LMD checkout feature i iz resursa malware zajednice.
|
||||
|
||||
### rkhunter
|
||||
|
||||
Alati poput [**rkhunter**](http://rkhunter.sourceforge.net) mogu se koristiti za proveru datotečnog sistema zbog mogućih **rootkits** i **malware**.
|
||||
Alati poput [**rkhunter**](http://rkhunter.sourceforge.net) mogu se koristiti za proveru datotečnog sistema u potrazi za mogućim rootkits i malware.
|
||||
```bash
|
||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||
```
|
||||
@ -106,27 +106,27 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper)proverava neke osnovne stvari unutar executable-a (binary data, entropy, URLs and IPs, neke yara rules).
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper)checks some basic stuff inside the executable (binary data, entropy, URLs and IPs, some yara rules).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download) je alat koji omogućava pribavljanje informacija o Windows executables kao što su imports, exports, headers, ali takođe proverava virus total i pronalazi potencijalne Att\&ck techniques.
|
||||
[PEstudio](https://www.winitor.com/download) je alat koji omogućava dobijanje informacija o Windows executables kao što su imports, exports, headers, ali će takođe proveriti virus total i pronaći potencijalne Att\&ck tehnike.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) je alat za detekciju da li je fajl **encrypted** i takođe pronalazi **packers**.
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) je alat za detekciju da li je fajl encrypted i takođe pronalaženje packers.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)je Python skripta koja koristi razne **statistical methods** da detektuje **obfuscated** i **encrypted** sadržaje unutar text/script fajlova. Namena NeoPI-ja je da pomogne u **detection of hidden web shell code**.
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)je Python skript koji koristi različite statistical methods da bi detektovao obfuscated i encrypted sadržaj unutar text/script files. Namena NeoPI-ja je da pomogne pri detekciji hidden web shell code.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) se maksimalno trudi da detektuje **obfuscated**/**dodgy code** kao i fajlove koji koriste **PHP** funkcije često korišćene u **malwares**/webshells.
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) čini sve što može da detektuje obfuscated/dodgy code kao i fajlove koji koriste PHP funkcije često korišćene u malwares/webshells.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
Prilikom provere nekog **malware sample** you should always **check the signature** of the binary as the **developer** that signed it may be already **related** with **malware.**
|
||||
Prilikom provere nekog malware sample-a uvek treba proveriti signature binarnog fajla, jer developer koji ga je potpisao može već biti povezan sa malware-om.
|
||||
```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
|
||||
|
||||
Ako znate da je neka fascikla koja sadrži **files** web servera poslednji put ažurirana na određeni datum, **proverite** datume kada su svi **files** u **web server** kreirani i izmenjeni; ako je neki datum **sumnjiv**, proverite taj file.
|
||||
Ako znate da je neki direktorijum koji sadrži **fajlove** web servera bio **poslednji put ažuriran na neki datum**, **proverite** **datum** kada su svi **fajlovi** na **web serveru** kreirani i izmenjeni, i ako je neki datum **sumnjiv**, proverite taj fajl.
|
||||
|
||||
### Baselines
|
||||
|
||||
Ako **files** neke fascikle **ne bi trebali biti modifikovani**, možete izračunati **hash** **original files** fascikle i **uporediti** ih sa **current** verzijama. Sve što je izmenjeno biće **sumnjivo**.
|
||||
Ako fajlovi u direktorijumu **ne bi trebalo da budu izmenjeni**, možete izračunati **hash** **originalnih fajlova** direktorijuma i **uporediti** ih sa **trenutnim**. Sve što je izmenjeno biće **sumnjivo**.
|
||||
|
||||
### Statistical Analysis
|
||||
|
||||
Kada se informacije čuvaju u logs, možete **proveriti statistiku** — npr. koliko puta je svaki file web servera bio pristupan, jer web shell može biti među najčešće pristupanima.
|
||||
Kada se informacije čuvaju u logovima, možete **proveriti statistiku, npr. koliko puta je svaki fajl na web serveru bio pristupan — web shell može biti jedan od najčešće pristupanih**.
|
||||
|
||||
---
|
||||
|
||||
### Android in-app native telemetry (no root)
|
||||
|
||||
Na Android-u možete instrumentovati native kod unutar procesa ciljne aplikacije tako što ćete prethodno učitati malu logger biblioteku pre nego što se ostale JNI libs inicijalizuju. Ovo daje ranu vidljivost native ponašanja bez system-wide hook-ova ili root-a. Popularan pristup je SoTap: ubacite libsotap.so za odgovarajući ABI u APK i injektujte poziv System.loadLibrary("sotap") rano (npr. u static initializer ili Application.onCreate), zatim prikupite logs iz internog/eksternog puta ili pomoću Logcat kao fallback.
|
||||
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.
|
||||
|
||||
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:
|
||||
|
||||
---
|
||||
|
||||
## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)
|
||||
## Deobfuskovanje dinamičkog kontrolnog toka (JMP/CALL RAX Dispatchers)
|
||||
|
||||
Savremene malware familije intenzivno zloupotrebljavaju Control-Flow Graph (CFG) obfuskaciju: umesto direktnog jump/call oni izračunavaju destinaciju u run-time-u i izvršavaju `jmp rax` ili `call rax`. Mali *dispatcher* (tipično nine instructions) postavlja finalnu metu u zavisnosti od CPU `ZF`/`CF` zastavica, potpuno razbijajući statičko obnavljanje CFG-a.
|
||||
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.
|
||||
|
||||
Tehniku – prikazanu od strane SLOW#TEMPEST loader-a – može se pobediti trostepenim workflow-om koji se oslanja samo na IDAPython i 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. Locate every indirect jump / call
|
||||
### 1. Pronađite svaki indirektni jump / call
|
||||
```python
|
||||
import idautils, 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. Emuliraj ga dva puta koristeći Unicorn
|
||||
### 3. Emulirajte ga dva puta koristeći Unicorn
|
||||
```python
|
||||
from unicorn import *
|
||||
from unicorn.x86_const import *
|
||||
@ -211,9 +211,9 @@ mu.reg_write(UC_X86_REG_RAX, 0)
|
||||
mu.emu_start(BASE, BASE+len(code))
|
||||
return mu.reg_read(UC_X86_REG_RAX)
|
||||
```
|
||||
Pokrenite `run(code,0,0)` i `run(code,1,1)` da biste dobili ciljeve grana *false* i *true*.
|
||||
Pokrenite `run(code,0,0)` i `run(code,1,1)` да бисте добили *false* и *true* циљеве грана.
|
||||
|
||||
### 4. Vratite nazad direktni jump / call
|
||||
### 4. Вратите (patch back) директни jump / call
|
||||
```python
|
||||
import struct, ida_bytes
|
||||
|
||||
@ -222,26 +222,26 @@ 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))
|
||||
```
|
||||
Nakon patching, naterajte IDA da ponovo analizira funkciju kako bi kompletan CFG i Hex-Rays izlaz bili vraćeni:
|
||||
Nakon patching-a, naterajte IDA da ponovo analizira funkciju kako bi se kompletan CFG i Hex-Rays izlaz obnovili:
|
||||
```python
|
||||
import ida_auto, idaapi
|
||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||
```
|
||||
### 5. Obeležite indirektne API pozive
|
||||
|
||||
Kada je poznata stvarna destinacija svakog `call rax`, možete reći IDA-i šta je to, tako da se tipovi parametara & imena promenljivih automatski rekonstrušu:
|
||||
Kada je stvarna destinacija svakog `call rax` poznata, možete reći IDA-u šta je to tako da se tipovi parametara i imena promenljivih automatski rekonstrušu:
|
||||
```python
|
||||
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||
```
|
||||
### Praktične prednosti
|
||||
|
||||
* Vraća pravi CFG → decompilation prelazi sa *10* linija na hiljade.
|
||||
* Vraća stvarni CFG → dekompilacija prelazi sa *10* linija na na hiljade.
|
||||
* Omogućava string-cross-reference & xrefs, čineći rekonstrukciju ponašanja trivijalnom.
|
||||
* Skripte su ponovo upotrebljive: ubacite ih u bilo koji loader koji je zaštićen istim trikom.
|
||||
* Scripts su ponovo upotrebljive: ubaci ih u bilo koji loader zaštićen istim trikom.
|
||||
|
||||
---
|
||||
|
||||
## Izvori
|
||||
## References
|
||||
|
||||
- [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)
|
||||
|
@ -1,50 +1,50 @@
|
||||
# Reverzno inženjerstvo nativnih biblioteka
|
||||
# Reverzovanje native biblioteka
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
**Za više informacija pogledajte:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Android aplikacije mogu koristiti native biblioteke, obično napisane u C ili C++, za zadatke koji zahtevaju visok performans. Maliciozni autori takođe zloupotrebljavaju ove biblioteke jer su ELF shared object fajlovi i dalje teži za dekompajliranje od DEX/OAT bajt-koda.
|
||||
Ova stranica se fokusira na *praktične* tokove rada i *skorašnja* poboljšanja alata (2023–2025) koja olakšavaju reverzno inženjerstvo Android `.so` fajlova.
|
||||
Android aplikacije mogu koristiti native biblioteke, obično napisane u C ili C++, za zadatke koji zahtevaju visoke performanse. Autori malware-a takođe zloupotrebljavaju ove biblioteke jer su ELF shared objects i dalje teže dekompajlirati nego DEX/OAT bajtkod.
|
||||
Ova stranica se fokusira na *praktične* radne tokove i *najnovija* poboljšanja alata (2023–2025) koja olakšavaju reverzovanje Android `.so` fajlova.
|
||||
|
||||
---
|
||||
|
||||
### Brzi workflow trijaže za upravo izvučeni `libfoo.so`
|
||||
### Brzi trijažni workflow za sveže izvučenu `libfoo.so`
|
||||
|
||||
1. **Extract the library**
|
||||
1. **Ekstrahujte biblioteku**
|
||||
```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. **Identifikujte arhitekturu i zaštite**
|
||||
```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. **Navedite eksportovane simbole i JNI vezivanja**
|
||||
```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.
|
||||
Novije verzije Ghidra-e su uvele AArch64 dekompajler koji prepoznaje PAC/BTI stubove i MTE tagove, značajno poboljšavajući analizu biblioteka izgrađenih sa Android 14 NDK-om.
|
||||
5. **Decide on static vs dynamic reversing:** stripped, obfuscated code često zahteva *instrumentation* (Frida, ptrace/gdbserver, LLDB).
|
||||
4. **Učitajte u dekompajler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) i pokrenite auto-analizu.
|
||||
Novije Ghidra verzije uvele su AArch64 dekompajler koji prepoznaje PAC/BTI stubove i MTE tagove, značajno poboljšavajući analizu biblioteka izgrađenih pomoću Android 14 NDK-a.
|
||||
5. **Odlučite za statičko ili dinamičko reverzovanje:** stripped, obfuscated kod često zahteva *instrumentation* (Frida, ptrace/gdbserver, LLDB).
|
||||
|
||||
---
|
||||
|
||||
### Dinamička instrumentacija (Frida ≥ 16)
|
||||
|
||||
Frida serija 16 donela je nekoliko Android-specifičnih poboljšanja koja pomažu kada meta koristi moderne Clang/LLD optimizacije:
|
||||
Frida serija 16 donela je nekoliko Android-specifičnih poboljšanja koja pomažu kada cilj koristi moderne Clang/LLD optimizacije:
|
||||
|
||||
* `thumb-relocator` sada može *hook tiny ARM/Thumb functions* generisane agresivnim poravnanjem LLD-a (`--icf=all`).
|
||||
* `thumb-relocator` može sada *hook-ovati male ARM/Thumb funkcije* generisane agresivnim poravnanjem LLD-a (`--icf=all`).
|
||||
* Enumerisanje i ponovno vezivanje *ELF import slots* radi na Androidu, omogućavajući per-module `dlopen()`/`dlsym()` patching kada inline hooks budu odbijeni.
|
||||
* Java hooking je ispravljen za novi **ART quick-entrypoint** koji se koristi kada su aplikacije kompajlirane sa `--enable-optimizations` na Android 14.
|
||||
|
||||
Primer: enumerisanje svih funkcija registrovanih putem `RegisterNatives` i dump njihovih adresa tokom izvršavanja:
|
||||
Primer: nabrajanje svih funkcija registrovanih preko `RegisterNatives` i ispis njihovih adresa u runtime-u:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var Runtime = Java.use('java.lang.Runtime');
|
||||
@ -63,27 +63,27 @@ 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.
|
||||
|
||||
### Process-local JNI telemetry via preloaded .so (SoTap)
|
||||
### Telemetrija JNI-a lokalnog procesa putem prethodno učitanog .so (SoTap)
|
||||
|
||||
Kada je full-featured instrumentation previše ili je blokirana, i dalje možete dobiti vidljivost na nivou native tako što ćete preload-ovati mali logger unutar ciljnog procesa. SoTap je lagana Android native (.so) biblioteka koja beleži runtime ponašanje drugih JNI (.so) biblioteka unutar istog procesa aplikacije (nije potreban root).
|
||||
Kada je puna instrumentacija suvišna ili blokirana, i dalje možete dobiti uvid na native nivou tako što ćete prethodno učitati mali logger unutar ciljnog procesa. SoTap je lagana Android native (.so) biblioteka koja beleži runtime ponašanje drugih JNI (.so) biblioteka unutar istog app procesa (root nije potreban).
|
||||
|
||||
Key properties:
|
||||
- Inicijalizuje se rano i posmatra JNI/native interakcije unutar procesa koji ga učitava.
|
||||
- Čuva logove koristeći više putanja koje omogućavaju pisanje, sa automatskim prelaskom na Logcat kada je skladištenje ograničeno.
|
||||
- Prilagodljivo iz izvornog koda: izmenite sotap.c da proširite/podesite šta se loguje i ponovo izgradite po ABI.
|
||||
Ključna svojstva:
|
||||
- Inicijalizuje se rano i posmatra JNI/native interakcije unutar procesa koji je učitava.
|
||||
- Čuva logove koristeći više putanja za pisanje uz povratak na Logcat kada je skladište ograničeno.
|
||||
- Source-customizable: edit sotap.c to extend/adjust what gets logged and rebuild per ABI.
|
||||
|
||||
Setup (repack the APK):
|
||||
Podešavanje (repack the APK):
|
||||
1) Ubacite odgovarajući ABI build u APK tako da loader može da pronađe libsotap.so:
|
||||
- lib/arm64-v8a/libsotap.so (for arm64)
|
||||
- lib/armeabi-v7a/libsotap.so (for arm32)
|
||||
2) Obezbedite da SoTap bude učitan pre ostalih JNI libova. Inject-ujte poziv rano (npr. static initializer Application podklase ili onCreate) tako da se logger inicijalizuje prvi. Smali snippet example:
|
||||
2) Osigurajte da se SoTap učita pre ostalih JNI biblioteka. Inject a call early (e.g., Application subclass static initializer or onCreate) tako da je logger inicijalizovan prvi. Smali snippet example:
|
||||
```smali
|
||||
const-string v0, "sotap"
|
||||
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||
```
|
||||
3) Rebuild/sign/install, pokrenite aplikaciju, pa prikupite logove.
|
||||
3) Ponovno izgradite/potpišite/instalirajte, pokrenite app, pa prikupite logove.
|
||||
|
||||
Log paths (checked in order):
|
||||
Putanje logova (proveravaju se redom):
|
||||
```
|
||||
/data/user/0/%s/files/sotap.log
|
||||
/data/data/%s/files/sotap.log
|
||||
@ -93,44 +93,44 @@ Log paths (checked in order):
|
||||
```
|
||||
Beleške i rešavanje problema:
|
||||
- ABI poravnanje je obavezno. Neusklađenost će izazvati UnsatisfiedLinkError i logger se neće učitati.
|
||||
- Ograničenja skladištenja su česta na modernom Androidu; ako pisanje fajlova ne uspe, SoTap će i dalje emitovati preko Logcat.
|
||||
- Ponašanje/detaljnost je predviđena za prilagođavanje; ponovo izgradite iz izvora nakon uređivanja sotap.c.
|
||||
- Ograničenja prostora za skladištenje su česta na modernim Android uređajima; ako upis fajlova ne uspe, SoTap će i dalje emitovati preko Logcat.
|
||||
- Ponašanje/verbosnost je predviđeno da se prilagodi; ponovo izgradite iz izvornog koda nakon izmena u sotap.c.
|
||||
|
||||
Ovaj pristup je koristan za malware triage i JNI debugging gde je kritično posmatrati tokove poziva native koda od pokretanja procesa, ali root/system-wide hooks nisu dostupni.
|
||||
Ovakav pristup je koristan za malware triage i JNI debugging gde je ključno posmatrati tokove poziva native koda od starta procesa, a root/system-wide hookovi nisu dostupni.
|
||||
|
||||
---
|
||||
|
||||
### Nedavne ranjivosti vredne potrage u APK-ovima
|
||||
|
||||
| Year | CVE | Affected library | Notes |
|
||||
| Godina | CVE | Pogođena biblioteka | Napomene |
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow dostupan iz native koda koji dekodira WebP slike. Nekoliko Android aplikacija pakuje ranjive verzije. Kada vidite `libwebp.so` unutar APK-a, proverite njegovu verziju i pokušajte eksploatisati ili zakrpiti.| |
|
||||
|2024|Multiple|OpenSSL 3.x series|Nekoliko problema vezanih za memory-safety i padding-oracle. Mnogi Flutter & ReactNative bundle-i isporučuju sopstveni `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`.|
|
||||
|
||||
Kada uočite *third-party* `.so` fajlove unutar APK-a, uvek uporedite njihov hash sa upstream advisories. SCA (Software Composition Analysis) je retka na mobilnim platformama, tako da su zastarele ranjive verzije učestale.
|
||||
Kada primetite *trećih strana* `.so` fajlove unutar APK-a, uvek proverite njihov hash sa upstream advisories. SCA (Software Composition Analysis) je retka na mobilu, pa su zastarele i ranjive verzije raširene.
|
||||
|
||||
---
|
||||
|
||||
### Anti-Reversing & Hardening trends (Android 13-15)
|
||||
### Trendovi Anti-Reversinga i ojačavanja (Android 13-15)
|
||||
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 omogućava PAC/BTI u sistemskim bibliotekama na podržanom ARMv8.3+ hardveru. Decompileri sada prikazuju PAC‐relirane pseudo-instrukcije; za dinamičku analizu Frida ubacuje trampoline *posle* uklanjanja PAC, ali vaši prilagođeni trampolini treba da pozivaju `pacda`/`autibsp` gde je potrebno.
|
||||
* **MTE & Scudo hardened allocator:** memory-tagging je opcionalno, ali mnoge aplikacije koje vode računa o Play-Integrity se grade sa `-fsanitize=memtag`; koristite `setprop arm64.memtag.dump 1` plus `adb shell am start ...` da uhvatite tag faults.
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** komercijalni packeri (npr. Bangcle, SecNeo) sve više štite *native* kod, ne samo Java; očekujte lažan control-flow i enkriptovane string blobove u `.rodata`.
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 omogućava PAC/BTI u system libraries na podržanom ARMv8.3+ silikonu. Decompiler-i sada prikazuju PAC‐povezane pseudo-instrukcije; za dynamic analysis Frida injektuje trampoline *nakon* uklanjanja PAC, ali vaši custom trampolini treba da pozivaju `pacda`/`autibsp` gde je potrebno.
|
||||
* **MTE & Scudo hardened allocator:** memory-tagging je opciono, ali mnoge aplikacije svesne Play-Integrity grade se sa `-fsanitize=memtag`; koristite `setprop arm64.memtag.dump 1` plus `adb shell am start ...` da zabeležite tag faults.
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** komercijalni packeri (npr. Bangcle, SecNeo) sve češće štite *native* kod, ne samo Java; očekujte lažni control-flow i enkriptovane string blobove u `.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)
|
||||
- **Učenje ARM asemblera:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
||||
- **JNI & NDK dokumentacija:** [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/)
|
||||
- **Debugovanje native biblioteka:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
|
||||
### References
|
||||
### Reference
|
||||
|
||||
- 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)
|
||||
- NVD advisory za `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)
|
||||
- Kako raditi sa SoTap? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,25 +1,25 @@
|
||||
# Smali - Dekompiliranje/[Modifikovanje]/Kompajliranje
|
||||
# Smali - Dekompajliranje/[Modifikovanje]/Kompajliranje
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
Ponekad je interesantno izmeniti kod aplikacije kako biste pristupili skrivenim informacijama za vas (možda dobro obfuskovanim passwords ili flags). U tom slučaju može biti korisno dekompilirati apk, izmeniti kod i ponovo ga kompajlirati.
|
||||
Ponekad je zanimljivo izmeniti kod aplikacije kako biste pristupili skrivenim informacijama (možda dobro obfuskovanim lozinkama ili flagovima). Tada može biti korisno dekompajlirati apk, izmeniti kod i ponovo ga kompajlirati.
|
||||
|
||||
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
**Opcodes referenca:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
|
||||
## Brzi način
|
||||
|
||||
Korišćenjem **Visual Studio Code** i ekstenzije [APKLab](https://github.com/APKLab/APKLab), možete **automatski dekompilirati**, izmeniti, **ponovo kompajlirati**, potpisati i instalirati aplikaciju bez pokretanja bilo koje komande.
|
||||
Koristeći **Visual Studio Code** i ekstenziju [APKLab](https://github.com/APKLab/APKLab), možete **automatski dekompajlirati**, izmeniti, **ponovo kompajlirati**, potpisati i instalirati aplikaciju bez izvršavanja bilo kakve naredbe.
|
||||
|
||||
Još jedna **skripta** koja znatno olakšava ovaj zadatak je [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
Još jedna **skripta** koja uveliko olakšava ovaj zadatak je [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
|
||||
## Dekompajliranje APK-a
|
||||
|
||||
Korišćenjem APKTool možete pristupiti **smali code and resources**:
|
||||
Koristeći APKTool, možete pristupiti **smali code and resources**:
|
||||
```bash
|
||||
apktool d APP.apk
|
||||
```
|
||||
Ako vam **apktool** prijavi bilo kakvu grešku, pokušajte[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
Ako **apktool** gives you any error, try[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
Neke **zanimljive datoteke koje bi trebalo da pogledate su**:
|
||||
|
||||
@ -27,31 +27,31 @@ Neke **zanimljive datoteke koje bi trebalo da pogledate su**:
|
||||
- _AndroidManifest.xml_
|
||||
- Any file with extension _.sqlite_ or _.db_
|
||||
|
||||
Ako `apktool` ima **probleme sa dekodiranjem aplikacije** pogledajte [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ili pokušajte da koristite argument **`-r`** (Do not decode resources). Ako je problem bio u resource, a ne u source code, onda nećete imati problem (takođe nećete dekompajlirati resources).
|
||||
Ako `apktool` ima **problema pri dekodiranju aplikacije** pogledajte [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ili pokušajte koristiti argument **`-r`** (Ne dekodirajte resurse). Ako je problem bio u resursu, a ne u izvornom kodu, više nećete imati problem (takođe nećete dekompilovati resurse).
|
||||
|
||||
## Izmena smali koda
|
||||
## Menjanje smali koda
|
||||
|
||||
Možete **izmeniti** **instrukcije**, promeniti **vrednost** nekih promenljivih ili **dodati** nove instrukcije. Menjam Smali kod koristeći [**VS Code**](https://code.visualstudio.com), zatim instalirajte **smalise extension** i editor će vam reći ako je neka **instrukcija netačna**.\
|
||||
Neki **primeri** se mogu naći ovde:
|
||||
Možete **menjati** instrukcije, menjati **vrednost** nekih promenljivih ili **dodavati** nove instrukcije. Ja menjam smali kod koristeći [**VS Code**](https://code.visualstudio.com), zatim instalirajte **smalise extension** i editor će vam reći ako je neka **instrukcija netačna**.\
|
||||
Neke **primere** možete naći ovde:
|
||||
|
||||
- [Smali changes examples](smali-changes.md)
|
||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
Or you can [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||
Ili možete [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||
|
||||
## Rekompajlirajte APK
|
||||
|
||||
Nakon izmene koda možete **rekompajlirati** kod koristeći:
|
||||
Nakon izmena koda možete **rekompajlirati** kod koristeći:
|
||||
```bash
|
||||
apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
To će **compile** novi APK **u** _**dist**_ folderu.
|
||||
Ovo će **kompajlirati** novi APK **unutar** _**dist**_ foldera.
|
||||
|
||||
Ako **apktool** izbaci **error**, pokušajte [installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
Ako **apktool** izbaci **grešku**, pokušajte [instalirati **najnoviju verziju**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
### **Potpišite novi APK**
|
||||
|
||||
Zatim, potrebno je da **generišete ključ** (biće zatražena lozinka i neke informacije koje možete popuniti nasumično):
|
||||
Zatim, potrebno je da **generišete ključ** (bićete upitani za lozinku i neke informacije koje možete popuniti nasumično):
|
||||
```bash
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||
```
|
||||
@ -61,18 +61,18 @@ jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
||||
```
|
||||
### Optimizacija nove aplikacije
|
||||
|
||||
**zipalign** je alat za poravnavanje arhiva koji obezbeđuje važnu optimizaciju Android aplikacija (APK) datoteka. [Više informacija ovde](https://developer.android.com/studio/command-line/zipalign).
|
||||
**zipalign** je alat za poravnavanje arhiva koji pruža važnu optimizaciju Android APK fajlova. [More information here](https://developer.android.com/studio/command-line/zipalign).
|
||||
```bash
|
||||
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
||||
zipalign -v 4 infile.apk
|
||||
```
|
||||
### **Potpišite novi APK (opet?)**
|
||||
|
||||
Ako **više volite** da koristite [**apksigner**](https://developer.android.com/studio/command-line/) umesto jarsigner, **trebalo bi da potpišete apk** nakon primene **optimizacije pomoću** zipaling. ALI IMAJTE NA UMU DA MORATE **POTPISATI APLIKACIJU SAMO JEDNOM** SA jarsigner (pre zipalign) ILI SA aspsigner (posle zipaling).
|
||||
Ako **više volite** da koristite [**apksigner**](https://developer.android.com/studio/command-line/) umesto jarsigner, **trebalo bi da potpišete apk** nakon primene **optimizacije pomoću** zipaling. ALI OBRATITE PAŽNJU DA JE POTREBNO POTPISATI **APLIKACIJU SAMO JEDNOM** KORIŠĆENJEM jarsigner (pre zipalign) ILI KORIŠĆENJEM aspsigner (posle zipaling).
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
## Izmena Smali
|
||||
## Modifying Smali
|
||||
|
||||
Za sledeći Hello World Java kod:
|
||||
```java
|
||||
@ -80,7 +80,7 @@ public static void printHelloWorld() {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
```
|
||||
Smali kod bi izgledao ovako:
|
||||
Smali code bi bio:
|
||||
```java
|
||||
.method public static printHelloWorld()V
|
||||
.registers 2
|
||||
@ -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).
|
||||
Skup instrukcija Smali je dostupan [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
|
||||
### Light Changes
|
||||
### Male izmene
|
||||
|
||||
### Modify initial values of a variable inside a function
|
||||
### Izmenite početne vrednosti promenljive unutar funkcije
|
||||
|
||||
Neke promenljive su definisane na početku funkcije pomoću opcode _const_; možete izmeniti njihove vrednosti ili definisati nove:
|
||||
Neke promenljive su definisane na početku funkcije koristeći opcode _const_, možete izmeniti njihove vrednosti, ili možete definisati nove:
|
||||
```bash
|
||||
#Number
|
||||
const v9, 0xf4240
|
||||
@ -141,16 +141,16 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
|
||||
Preporuke:
|
||||
|
||||
- Ako ćete koristiti deklarisane promenljive unutar funkcije (deklarisane v0,v1,v2...) stavite ove linije između _.local <number>_ i deklaracija promenljivih (_const v0, 0x1_)
|
||||
- Ako želite da ubacite kod za logovanje u sred koda funkcije:
|
||||
- Dodajte 2 broju deklarisanih promenljivih: Ex: from _.locals 10_ to _.locals 12_
|
||||
- Nove promenljive treba da budu naredni brojevi posle već deklarisanih promenljivih (u ovom primeru treba da budu _v10_ i _v11_, zapamtite da se kreće od v0).
|
||||
- Izmenite kod funkcije za logovanje i koristite _v10_ i _v11_ umesto _v5_ i _v1_.
|
||||
- Ako želite da ubacite logging kod u sredinu koda funkcije:
|
||||
- Dodajte 2 broju deklarisanih promenljivih: npr: od _.locals 10_ do _.locals 12_
|
||||
- Nove promenljive treba da budu naredni brojevi postojećih deklarisanih promenljivih (u ovom primeru to treba da budu _v10_ i _v11_, zapamtite da se broji od v0).
|
||||
- Promenite kod logging funkcije i koristite _v10_ i _v11_ umesto _v5_ i _v1_.
|
||||
|
||||
### Prikazivanje toast poruke
|
||||
### Toasting
|
||||
|
||||
Zapamtite da dodate 3 broju _.locals_ na početku funkcije.
|
||||
|
||||
Ovaj kod je pripremljen da se ubaci u **sredinu funkcije** (**izmenite** broj **promenljivih** po potrebi). Uzeće **vrednost this.o**, **pretvoriti** je u **String** i zatim napraviti **toast** sa tom vrednošću.
|
||||
Ovaj kod je pripremljen da bude umetnut u **sredinu funkcije** (**promenite** broj **promenljivih** po potrebi). Uzeće **vrednost this.o**, **pretvoriće** je u **String** i zatim **prikazati** **toast** sa tom vrednošću.
|
||||
```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
|
||||
```
|
||||
### Učitavanje native biblioteke pri pokretanju (System.loadLibrary)
|
||||
### Loading a Native Library at Startup (System.loadLibrary)
|
||||
|
||||
Ponekad je potrebno prethodno učitati native biblioteku tako da se inicijalizuje pre drugih JNI libs (npr. da omogući process-local telemetry/logging). Možete ubaciti poziv System.loadLibrary() u statički inicijalizator ili rano u Application.onCreate(). Primer smali za statički inicijalizator klase (<clinit>):
|
||||
Ponekad treba prethodno učitati native biblioteku tako da se inicijalizuje pre drugih JNI libs (npr. da bi se omogućila process-local telemetry/logging). Možete ubaciti poziv System.loadLibrary() u static initializer ili rano u Application.onCreate(). Primer smali za 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
|
||||
```
|
||||
Alternativno, postavite iste dve instrukcije na početak vašeg Application.onCreate() da biste osigurali da se library učita što je ranije moguće:
|
||||
Alternativno, postavite ista dva uputstva na početak vašeg Application.onCreate() kako biste osigurali da se biblioteka učita što ranije:
|
||||
```smali
|
||||
.method public onCreate()V
|
||||
.locals 1
|
||||
@ -189,11 +189,11 @@ return-void
|
||||
.end method
|
||||
```
|
||||
Napomene:
|
||||
- Uverite se da odgovarajuća ABI varijanta biblioteke postoji pod lib/<abi>/ (npr., arm64-v8a/armeabi-v7a) kako biste izbegli UnsatisfiedLinkError.
|
||||
- Učitavanje vrlo rano (class static initializer) osigurava da native logger može da posmatra naknadnu JNI aktivnost.
|
||||
- Uverite se da odgovarajuća ABI varijanta biblioteke postoji pod lib/<abi>/ (npr. arm64-v8a/armeabi-v7a) kako biste izbegli UnsatisfiedLinkError.
|
||||
- Učitavanje veoma rano (class static initializer) garantuje da native logger može da posmatra naknadnu JNI aktivnost.
|
||||
|
||||
## Reference
|
||||
## References
|
||||
|
||||
- SoTap: Lagan logger ponašanja JNI (.so) unutar aplikacije – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
- SoTap: Lagan in-app JNI (.so) logger ponašanja – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user