From 7da8bbe56afce1482f0f91e5fa98025621cbfc2e Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 4 Sep 2025 09:34:26 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/smali-changes. --- .../malware-analysis.md | 86 ++++++++---------- .../reversing-native-libraries.md | 88 +++++++++---------- .../android-app-pentesting/smali-changes.md | 70 +++++++-------- 3 files changed, 116 insertions(+), 128 deletions(-) diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md index 550b643d4..0bfa4dba4 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md @@ -1,8 +1,8 @@ -# Malware-analise +# Malware Analysis {{#include ../../banners/hacktricks-training.md}} -## Forensiese CheatSheets +## Forensics CheatSheets [https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/) @@ -14,7 +14,7 @@ - [Intezer](https://analyze.intezer.com) - [Any.Run](https://any.run/) -## Aflyn antivirus- en opsporingshulpmiddels +## Offline Antivirus- en Opsporingsinstrumente ### Yara @@ -24,8 +24,8 @@ sudo apt-get install -y yara ``` #### Berei reëls voor -Gebruik hierdie script om al die yara-reëls vir malware van github af te laai en saam te voeg: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -Skep die _**rules**_ gids en voer dit uit. Dit sal 'n lêer met die naam _**malware_rules.yar**_ skep wat al die yara-reëls vir malware bevat. +Gebruik hierdie script om al die yara malware reëls van github af te laai en saam te voeg: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ +Skep die _**rules**_ directory en voer dit uit. Dit sal 'n lêer genaamd _**malware_rules.yar**_ skep wat al die yara reëls vir malware bevat. ```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: Kontroleer vir malware en skep reëls +#### YaraGen: Kontroleer vir malware en skep rules -Jy kan die gereedskap [**YaraGen**](https://github.com/Neo23x0/yarGen) gebruik om yara rules van 'n binaêr te genereer. Kyk na hierdie handleidings: [**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/) +Jy kan die tool [**YaraGen**](https://github.com/Neo23x0/yarGen) gebruik om yara rules uit 'n binary te genereer. Kyk na hierdie 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 python3 yarGen.py --update python3.exe yarGen.py --excludegood -m ../../mals/ @@ -57,26 +57,26 @@ clamscan folderpath #Scan the whole folder ``` ### [Capa](https://github.com/mandiant/capa) -**Capa** detecteer potensieel kwaadwillige **capabilities** in uitvoerbare lêers: PE, ELF, .NET. Dit sal dus dinge soos Att\&ck tactics vind, of verdagte capabilities soos: +**Capa** detecteer potensieel kwaadwillige **capabilities** in uitvoerbare lêers: PE, ELF, .NET. Dit sal dus dinge vind soos Att\&ck tactics, of verdagte capabilities soos: - check for OutputDebugString error - run as a service - create process -Get it int he [**Github repo**](https://github.com/mandiant/capa). +Kry dit in die [**Github repo**](https://github.com/mandiant/capa). ### IOCs -IOC means Indicator Of Compromise. 'n IOC is 'n stel **conditions that identify** sekere moontlik ongewenste sagteware of bevestigde **malware**. Blue Teams gebruik hierdie soort definisie om **soortgelyke kwaadaardige lêers in hul stelsels en netwerke te soek**.\ -Om hierdie definisies te deel is baie nuttig, want wanneer malware in 'n rekenaar geïdentifiseer word en 'n IOC vir daardie malware geskep word, kan ander Blue Teams dit gebruik om die malware vinniger te identifiseer. +IOC beteken Indicator Of Compromise. 'n IOC is 'n stel **voorwaardes wat identifiseer** sekere potensieel ongewensde sagteware of bevestigde **malware**. Blue Teams gebruik hierdie soort definisie om te **soek na hierdie soort kwaadwillige lêers** in hul **sisteme** en **netwerke**.\ +Om hierdie definisies te deel is baie nuttig, want wanneer **malware** in 'n rekenaar geïdentifiseer word en 'n IOC vir daardie **malware** geskep word, kan ander Blue Teams dit gebruik om die **malware** vinniger te identifiseer. -'n Gereedskap om IOCs te skep of te wysig is [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ -Jy kan gereedskap soos [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gebruik om **naar gedefinieerde IOCs op 'n toestel te soek**. +'n Instrument om IOCs te skep of te wysig is [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ +Jy kan gereedskap soos [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gebruik om **te soek na gedefinieerde IOCs in 'n toestel**. ### Loki -[**Loki**](https://github.com/Neo23x0/Loki) is 'n scanner vir Simple Indicators of Compromise.\ -Opsporing is gebaseer op vier opsporingsmetodes: +[**Loki**](https://github.com/Neo23x0/Loki) is 'n skandeerder vir Simple Indicators of Compromise.\ +Deteksie is gebaseer op vier deteksiemetodes: ``` 1. File Name IOC Regex match on full file path/name @@ -92,41 +92,41 @@ 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/) is 'n malware-skandeerder vir Linux, vrygestel onder die GNU GPLv2-lisensie, wat ontwerp is rondom die bedreigings wat in gedeelde gehuisveste omgewings voorkom. Dit gebruik bedreigingsdata van network edge intrusion detection systems om malware wat aktief in aanvalle gebruik word te onttrek en signatures vir deteksie te genereer. Daarbenewens word bedreigingsdata ook verkry uit gebruikersinskrywings via die LMD checkout-feature en uit malware-gemeenskapsbronne. +[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) is 'n malware-skandeerder vir Linux wat vrygestel is onder die GNU GPLv2-lisensie, en is ontwerp vir die bedreigings wat in gedeelde gehoste omgewings teëgekom word. Dit gebruik bedreigingsdata van netwerkrand indringingsopsporingsisteme om malware te onttrek wat aktief in aanvalle gebruik word, en genereer signatures vir opsporing. Daarbenewens word bedreigingsdata ook verkry uit gebruikersinskrywings via die LMD checkout-funksie en malware-communitybronne. ### rkhunter -Gereedskap soos [**rkhunter**](http://rkhunter.sourceforge.net) kan gebruik word om die lêerstelsel te kontroleer vir moontlike **rootkits** en malware. +Instrumente soos [**rkhunter**](http://rkhunter.sourceforge.net) kan gebruik word om die lêerstelsel te ondersoek vir moontlike **rootkits** en malware. ```bash sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress] ``` ### FLOSS -[**FLOSS**](https://github.com/mandiant/flare-floss) is 'n instrument wat probeer om geobfuskiseerde stringe binne uitvoerbare lêers te vind met verskeie tegnieke. +[**FLOSS**](https://github.com/mandiant/flare-floss) is 'n hulpmiddel wat probeer om geobfusceerde strings binne uitvoerbare lêers te vind deur verskillende tegnieke te gebruik. ### PEpper -[PEpper ](https://github.com/Th3Hurrican3/PEpper)kontroleer 'n paar basiese dinge in die uitvoerbare lêer (binaire data, entropie, URLs en IP-adresse, sommige yara-reëls). +[PEpper ](https://github.com/Th3Hurrican3/PEpper) kontroleer sommige basiese dinge in die uitvoerbare lêer (binary data, entropy, URLs and IPs, some yara rules). ### PEstudio -[PEstudio](https://www.winitor.com/download) is 'n instrument wat inligting oor Windows-uitvoerbare lêers verskaf, soos imports, exports en headers, en sal ook VirusTotal nagaan en potensiële Att\&ck-tegnieke vind. +[PEstudio](https://www.winitor.com/download) is 'n hulpmiddel wat inligting oor Windows executables verskaf, soos imports, exports, headers, maar sal ook virus total kontroleer en potensiële Att\&ck techniques vind. ### Detect It Easy(DiE) -[**DiE**](https://github.com/horsicq/Detect-It-Easy/) is 'n instrument om te bepaal of 'n lêer **versleuteld** is en om ook **packers** te vind. +[**DiE**](https://github.com/horsicq/Detect-It-Easy/) is 'n hulpmiddel om te bepaal of 'n lêer **geënkripteer** is en ook **packers** te vind. ### NeoPI -[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)is 'n Python-skrip wat 'n verskeidenheid **statistiese metodes** gebruik om **geobfuskiseerde** en **versleutelde** inhoud binne teks-/skriplêers te identifiseer. Die beoogde doel van NeoPI is om te help met die **identifisering van verborge web shell-kode**. +[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)is 'n Python-skrip wat 'n verskeidenheid van **statistiese metodes** gebruik om **geobfusceerde** en **geënkripteerde** inhoud binne teks-/script-lêers op te spoor. Die beoogde doel van NeoPI is om te help met die **opsporing van verborge web shell code**. ### **php-malware-finder** -[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) doen sy uiterste bes om **geobfuskiseerde**/**verdagte kode** te identifiseer, asook lêers wat **PHP**-funksies gebruik wat dikwels in **malware**/webshells aangetref word. +[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) doen sy bes om **geobfusceerde**/**skadelike code** op te spoor, sowel as lêers wat **PHP** funksies gebruik wat dikwels in **malwares**/webshells gebruik word. ### Apple Binary Signatures -Wanneer jy 'n **malware sample** nagaan, moet jy altyd die **handtekening** van die binêr **kontroleer**, aangesien die **ontwikkelaar** wat dit geteken het moontlik reeds **verwant** is aan **malware.** +Wanneer jy 'n **malware sample** nagaan, moet jy altyd die **handtekening** van die binêre lêer kontroleer, aangesien die **developer** wat dit gesigneer het dalk reeds met **malware** verwant is. ```bash #Get signer codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" @@ -137,25 +137,19 @@ codesign --verify --verbose /Applications/Safari.app #Check if the signature is valid spctl --assess --verbose /Applications/Safari.app ``` -## Detection Techniques +## Opsporingstegnieke ### File Stacking -If you know that some folder containing the **files** of a web server was **last updated on some date**. **Check** the **date** all the **files** in the **web server were created and modified** and if any date is **suspicious**, check that file. - -As jy weet dat 'n vouer wat die **lêers** van 'n **web server** bevat **laas bygewerk is op 'n bepaalde datum**, **kontroleer** die **datum** waarop al die **lêers** in die **web server** geskep en gewysig is; as enige datum **verdag** is, ondersoek daardie lêer. +As jy weet dat 'n gids wat die **files** van 'n **web server** bevat **laas opgedateer is op 'n sekere datum**. **Kontroleer** die **datum** waarop al die **files** in die **web server** geskep en gewysig is, en as enige datum **verdagtig** is, ondersoek daardie **file**. ### Baselines -If the files of a folder **shouldn't have been modified**, you can calculate the **hash** of the **original files** of the folder and **compare** them with the **current** ones. Anything modified will be **suspicious**. - -As die **lêers** van 'n vouer **nie gewysig moes gewees het nie**, kan jy die **hash** van die ** oorspronklike lêers ** van die vouer bereken en dit met die **huidige** vergelyk. Alles wat gewysig is, sal **verdag** wees. +As die **files** van 'n gids **nie veronderstel was om gewysig te word nie**, kan jy die **hash** van die **original files** van die gids bereken en dit **vergelyk** met die **current** een. Enige item wat verander is sal **verdagtig** wees. ### Statistical Analysis -When the information is saved in logs you can **check statistics like how many times each file of a web server was accessed as a web shell might be one of the most**. - -Wanneer die inligting in logs gestoor word, kan jy **statistieke nagaan**, byvoorbeeld hoe dikwels elke lêer van 'n web server geraadpleeg is — 'n web shell kan een van die mees-toeganklike wees. +Wanneer die inligting in logs gestoor word, kan jy **statistieke kontroleer, soos hoeveel keer elke file van 'n web server geraadpleeg is**, aangesien 'n **web shell** moontlik baie keer geraadpleeg word. --- @@ -163,8 +157,6 @@ Wanneer die inligting in logs gestoor word, kan jy **statistieke nagaan**, byvoo 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. -Op Android kan jy native code binne die teiken-app-proses instrumenteer deur 'n klein logger-biblioteek vooraf te laai voordat ander JNI-libs inisieer. Dit gee vroeë sigbaarheid in native gedrag sonder stelsel-wyde hooks of root. 'n Populêre benadering is SoTap: plaas libsotap.so vir die regte ABI in die APK en injekteer vroeg 'n System.loadLibrary("sotap") oproep (bv. static initializer of Application.onCreate), en versamel dan logs vanaf interne/eksterne paaie of Logcat as rugsteun. - See the Android native reversing page for setup details and log paths: {{#ref}} @@ -177,13 +169,9 @@ See the Android native reversing page for setup details and log paths: 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. -Moderne malware-families misbruik Control-Flow Graph (CFG)-obfuskering in sterk mate: in plaas van 'n direkte jump/call bereken hulle die bestemming tydens uitvoering en voer 'n `jmp rax` of `call rax` uit. 'n Klein *dispatcher* (tipies nege instruksies) stel die finale teiken afhangend van die CPU `ZF`/`CF` vlagte, wat statiese CFG-herwinning heeltemal breek. - 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. -Die tegniek — tentoongestel deur die SLOW#TEMPEST loader — kan gekeer word met 'n drie-stap werkvloei wat slegs staatmaak op IDAPython en die Unicorn CPU emulator. - -### 1. Locate every indirect jump / call +### 1. Lokaliseer elke indirect jump / call ```python import idautils, idc @@ -192,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. Haal die dispatcher byte-code uit +### 2. Ekstraheer die dispatcher byte-code ```python import idc @@ -223,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) ``` -Voer `run(code,0,0)` en `run(code,1,1)` uit om die *false* en *true* takbestemmings te kry. +Voer `run(code,0,0)` en `run(code,1,1)` uit om die *false* en *true* branch targets te bekom. -### 4. Patch terug 'n direkte jump / call +### 4. Patch back a direct jump / call ```python import struct, ida_bytes @@ -234,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(' cat lib/arm64-v8a/libfoo.so" > libfoo.so @@ -25,26 +25,26 @@ file libfoo.so # arm64 or arm32 / x86 readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc. checksec --file libfoo.so # (peda/pwntools) ``` -3. **Lys uitgevoerde simbole & JNI-bindinge** +3. **Lys geëksporteerde simbole & JNI-bindinge** ```bash readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI ``` -4. **Laai in 'n dekompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) en voer outo-analise uit. -Nuweer Ghidra-weergawes het 'n AArch64 decompiler ingesluit wat PAC/BTI stubs en MTE tags herken, wat die ontleding van biblioteke wat met die Android 14 NDK gebou is grootliks verbeter. -5. **Bepaal statiese vs dinamiese reversing:** stripped, obfuscated code often needs *instrumentation* (Frida, ptrace/gdbserver, LLDB). +4. **Laai in 'n dekompileerder** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) and run auto-analysis. +Nuweer Ghidra-weergawes het 'n AArch64-dekompileerder bekendgestel wat PAC/BTI-stubs en MTE-tags herken, wat die ontleding van biblioteke wat met die Android 14 NDK gebou is, aansienlik verbeter. +5. **Besluit oor statiese vs dinamiese omkeerontleding:** gestrippte, obfuskede kode benodig dikwels *instrumentasie* (Frida, ptrace/gdbserver, LLDB). --- -### Dynamic Instrumentation (Frida ≥ 16) +### Dinamiese instrumentasie (Frida ≥ 16) -Frida’s 16-reeks het verskeie Android-spesifieke verbeterings gebring wat help wanneer die teiken moderne Clang/LLD optimisations gebruik: +Frida se 16-reeks het verskeie Android-spesifieke verbeterings gebring wat help wanneer die teiken moderne Clang/LLD-optimalisasies gebruik: -* `thumb-relocator` can now *hook tiny ARM/Thumb functions* generated by LLD’s 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` kan nou *hook tiny ARM/Thumb functions* wat deur LLD se aggressiewe uitlynings (`--icf=all`) gegenereer word. +* Die enumerering en herbinding van *ELF import slots* werk op Android, en maak per-module `dlopen()`/`dlsym()`-patching moontlik wanneer inline hooks verwerp word. +* Java hooking is reggestel vir die nuwe **ART quick-entrypoint** wat gebruik word wanneer apps saamgestel is met `--enable-optimizations` op Android 14. -Example: enumerating all functions registered through `RegisterNatives` and dumping their addresses at runtime: +Voorbeeld: enumereer alle funksies wat geregistreer is via `RegisterNatives` en dump hul adresse tydens 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 sal uit die boks werk op PAC/BTI-enabled devices (Pixel 8/Android 14+) solank jy frida-server 16.2 of later gebruik – vroeëre weergawes kon nie padding vir inline hooks lokaliseer nie. +Frida sal reguit uit die boks werk op PAC/BTI-enabled toestelle (Pixel 8/Android 14+) solank jy frida-server 16.2 of later gebruik – vroeër weergawes het misluk om padding vir inline hooks te vind. -### Proses-lokale JNI-telemetrie via voorgelaaide .so (SoTap) +### Process-local JNI telemetry via preloaded .so (SoTap) -Wanneer volwaardige instrumentasie oorbodig of geblokkeer is, kan jy steeds native-vlak sigbaarheid kry deur ’n klein logger in die teikenproses voor te laai. SoTap is ’n liggewig Android native (.so) biblioteek wat die runtime-gedrag van ander JNI (.so) biblioteke binne dieselfde app-proses log (geen root benodig nie). +Wanneer vol-funksionele instrumentation oorkill of geblokkeer is, kan jy steeds native-vlak sigbaarheid kry deur 'n klein logger binne die teikenproses voor te laai. SoTap is 'n liggewig Android native (.so) library wat die runtime-gedrag van ander JNI (.so) libraries binne dieselfde app-proses log (no root required). Belangrike eienskappe: -- Initialiseer vroeg en waarneem JNI/native-interaksies binne die proses wat dit laai. -- Bewaar logs deur verskeie skryfbare paaie met ’n elegante terugval na Logcat wanneer berging beperk is. -- Bron-aanpasbaar: wysig sotap.c om uit te brei of aan te pas wat gelog word en herbou per ABI. +- Initialiseer vroeg en monitor JNI/native-interaksies binne die proses wat dit laai. +- Behou logs deur verskeie skryfbare paaie te gebruik met 'n elegante terugval na Logcat wanneer stoorplek beperk is. +- Bron-aanpasbaar: redigeer sotap.c om te uitbrei/aan te pas wat aangeteken word en bou weer per ABI. -Opstelling (repak die APK): -1) Plaas die regte ABI build in die APK sodat die loader libsotap.so kan oplos: +Opstelling (herpak die APK): +1) Plaas die korrekte ABI-bou in die APK sodat die loader libsotap.so kan oplos: - lib/arm64-v8a/libsotap.so (for arm64) - lib/armeabi-v7a/libsotap.so (for arm32) -2) Verseker dat SoTap laai voordat ander JNI-libs laai. Injiseer ’n vroeë oproep (bv. Application subclass static initializer of onCreate) sodat die logger eers geïnisialiseer word. Smali snippet example: +2) Verseker SoTap laai voordat ander JNI libs. Injiseer 'n oproep vroeg (bv. Application subclass static initializer of onCreate) sodat die logger eers geïnitialiseer word. Smali snippet example: ```smali const-string v0, "sotap" invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V ``` -3) Herbou/onderteken/installeer, hardloop die app, en versamel dan logs. +3) Rebuild/sign/install, run the app, then collect logs. -Log-paadjies (gekontroleer in volgorde): +Log paths (checked in order): ``` /data/user/0/%s/files/sotap.log /data/data/%s/files/sotap.log @@ -91,46 +91,46 @@ Log-paadjies (gekontroleer in volgorde): /sdcard/Download/sotap-%s.log # If all fail: fallback to Logcat only ``` -Aantekeninge en probleemoplossing: -- ABI-belyning is verpligtend. ’n ongelykheid sal UnsatisfiedLinkError veroorsaak en die logger sal nie laai nie. -- Stoorbeperkings is algemeen op moderne Android; as lêerskryf misluk, sal SoTap steeds via Logcat uitsend. -- Gedrag/uitvoerigheid is bedoel om aangepas te word; bou dit weer vanaf die bron nadat jy sotap.c geredigeer het. +Aantekeninge en foutopsporing: +- ABI-belyning is verpligtend. 'n Ongelykheid sal UnsatisfiedLinkError veroorsaak en die logger sal nie laai nie. +- Stoorbeperkings is algemeen op moderne Android; as lêerskryf misluk, sal SoTap steeds via Logcat uitstuur. +- Gedrag/verbositeit is bedoel om aangepas te word; herbou vanaf bron nadat jy sotap.c gewysig het. -Hierdie benadering is nuttig vir malware-triage en JNI-debugging waar dit kritiek is om native oproepvloei vanaf prosesbegin waar te neem, maar root/stelselwye hooks nie beskikbaar is nie. +Hierdie benadering is handig vir malware-triage en JNI-debogering waar dit kritiek is om native-aanroepvloei vanaf prosesbegin waar te neem, maar root-/stelselwye hooks nie beskikbaar is nie. --- ### Onlangse kwesbaarhede wat die moeite werd is om in APKs te soek -| Jaar | CVE | Aangetaste biblioteek | Aantekeninge | -|------|-----|-----------------------|-------------| -|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow bereikbaar vanaf native kode wat WebP-beelde dekodeer. Verskeie Android-apps bundel kwesbare weergawes. Wanneer jy `libwebp.so` binne 'n APK sien, kontroleer die weergawe en probeer eksploitasie of patches toepas.| | -|2024|Multiple|OpenSSL 3.x series|Verskeie geheue-veiligheids- en padding-orakel-kwessies. Baie Flutter & ReactNative-bundels stuur hul eie `libcrypto.so`.| +| Year | CVE | Affected library | Notes | +|------|-----|------------------|-------| +|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow bereikbaar vanaf native-kode wat WebP-beelde dekodeer. Verskeie Android-apps bevat kwesbare weergawes. Wanneer jy 'n `libwebp.so` in 'n APK sien, kontroleer sy weergawe en probeer eksploiteer of patcheer.| | +|2024|Multiple|OpenSSL 3.x series|Verskeie geheue-veiligheids- en padding-orakelprobleme. Baie Flutter- & ReactNative-bundels sluit hul eie `libcrypto.so` in.| -Wanneer jy *derdeparty* `.so` lêers binne 'n APK raak, kruisverifieer altyd hul hash teen upstream advisories. SCA (Software Composition Analysis) is ongewoon op mobiele platforms, dus is verouderde kwesbare boue algemeen. +Wanneer jy *derdepartye* `.so`-lêers in 'n APK raaksien, kruischeck altyd hul hash teen upstream advisories. SCA (Software Composition Analysis) is skaars op mobiele platforms, dus is verouderde kwesbare bouwe algemeen. --- ### Anti-Reversing & Hardening trends (Android 13-15) -* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 aktiveer PAC/BTI in stelselbiblioteke op ondersteunde ARMv8.3+ silikoon. Decompilers toon nou PAC-verwante pseudo-instruksies; vir dinamiese analise spuit Frida trampolines in ná die verwydering van PAC, maar jou eie trampolines behoort `pacda`/`autibsp` aan te roep waar nodig. +* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 aktiveer PAC/BTI in stelselbiblioteke op ondersteunde ARMv8.3+ silicon. Decompilers vertoon nou PAC‐verwante pseudo-instruksies; vir dinamiese analise spuit Frida trampolines in ná die verwydering van PAC, maar jou pasgemaakte trampolines moet `pacda`/`autibsp` aanroep waar nodig. * **MTE & Scudo hardened allocator:** memory-tagging is opsioneel maar baie Play-Integrity-bewuste apps bou met `-fsanitize=memtag`; gebruik `setprop arm64.memtag.dump 1` plus `adb shell am start ...` om tag-foute vas te vang. -* **LLVM Obfuscator (opaque predicates, control-flow flattening):** kommersiële packers (e.g., Bangcle, SecNeo) beskerm toenemend *native* kode, nie net Java nie; verwag valsige control-flow en versleutelde string blobs in `.rodata`. +* **LLVM Obfuscator (opaque predicates, control-flow flattening):** kommersiële packers (bv. Bangcle, SecNeo) beskerm toenemend *native* kode, nie net Java nie; verwag valse control-flow en enkripsie string-blobs in `.rodata`. --- -### Hulpbronne +### 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) -### Verwysings +### 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) -- 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) +- NVD-advies vir `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) +- SoTap: Lightweight in-app JNI (.so) gedragslogger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap) +- SoTap-vrystellings – [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases) +- Hoe om met SoTap te werk? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/smali-changes.md b/src/mobile-pentesting/android-app-pentesting/smali-changes.md index a42a2a13a..bfc7934d2 100644 --- a/src/mobile-pentesting/android-app-pentesting/smali-changes.md +++ b/src/mobile-pentesting/android-app-pentesting/smali-changes.md @@ -3,76 +3,76 @@ {{#include ../../banners/hacktricks-training.md}} -Soms is dit interessant om die toepassing se code te wysig om toegang tot versteekte inligting te kry (miskien goed obfuscated passwords of flags). Dan kan dit interessant wees om die apk te decompileer, die code te wysig en dit weer te recompileer. +Dit is soms interessant om die toepassingskode te wysig om toegang tot verborge inligting te kry (byvoorbeeld goed versluierde wagwoorde of flags). Dan kan dit handig wees om die apk te dekompileer, die kode te wysig en dit weer saam te stel. **Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html) ## Fast Way -Deur **Visual Studio Code** en die [APKLab](https://github.com/APKLab/APKLab) extension te gebruik, kan jy die toepassing **automatically decompile**, modify, **recompile**, sign & install sonder om enige opdrag uit te voer. +Met **Visual Studio Code** en die [APKLab](https://github.com/APKLab/APKLab) uitbreiding kan jy die toepassing **automaties dekompileer**, die kode wysig, **weer saamstel**, teken & installeer sonder om enige opdrag uit te voer. -Nog 'n **script** wat hierdie taak baie vergemaklik is [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh) +Another **script** that facilitates this task a lot is [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh) ## Decompile the APK -Deur APKTool te gebruik kan jy toegang kry tot die **smali code and resources**: +Met APKTool kan jy toegang kry tot die **smali code and resources**: ```bash apktool d APP.apk ``` -As **apktool** enige fout gee, try[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/) +As **apktool** jou enige fout gee, try[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/) -Sommige **interessante lêers waarna jy moet kyk**: +Some **interesting files you should look are**: - _res/values/strings.xml_ (and all xmls inside res/values/*) - _AndroidManifest.xml_ -- Any file with extension _.sqlite_ or _.db_ +- Enige lêer met die uitbreiding _.sqlite_ of _.db_ -As `apktool` **probleme het om die toepassing te decodeer** kyk na [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) of probeer die argument **`-r`** gebruik (Moet nie die resources decodeer nie). Dan, as die probleem in 'n resource en nie in die bronkode was nie, sal jy nie die probleem hê nie (jy sal ook nie die resources dekompileer nie). +If `apktool` has **problems decoding the application** take a look to [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) or try using the argument **`-r`** (Moenie resources dekodeer nie). Then, if the problem was in a resource and not in the source code, you won't have the problem (you won't also decompile the resources). ## Verander smali kode -Jy kan **instruksies** verander, die **waarde** van sekere veranderlikes verander of nuwe instruksies **byvoeg**. Ek verander die Smali kode met behulp van [**VS Code**](https://code.visualstudio.com), installeer dan die **smalise extension** en die redigeerder sal vir jou sê as enige **instruksie verkeerd is**.\ +Jy kan **instruksies** verander, die **waarde** van sommige veranderlikes verander of nuwe instruksies **byvoeg**. Ek verander die Smali kode using [**VS Code**](https://code.visualstudio.com), you then install the **smalise extension** and the editor will tell you if any **instruction is incorrect**.\ Sommige **voorbeelde** kan hier gevind word: - [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). +Of jy kan [**check below some Smali changes explained**](smali-changes.md#modifying-smali). ## Herkompileer die APK -Na die wysiging van die kode kan jy die kode **herkompileer** met: +Na aanpassing van die kode kan jy die kode **herkompileer** deur die volgende te gebruik: ```bash apktool b . #In the folder generated when you decompiled the application ``` -Dit sal die nuwe APK **compile** **inside** die _**dist**_ gids. +Dit sal die nuwe APK **compile** **binne** die _**dist**_ gids. -As **apktool** 'n **error** gooi, probeer[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/) +As **apktool** 'n **fout** gee, probeer[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/) -### **Sign the new APK** +### **Onderteken die nuwe APK** -Dan moet jy **generate a key** (jy sal gevra word vir 'n password en vir sekere inligting wat jy lukraak kan invul): +Dan moet jy 'n **sleutel genereer** (jy sal gevra word vir 'n wagwoord en vir sommige inligting wat jy lukraak kan invul): ```bash keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias ``` -Laastens, **onderteken** die nuwe APK: +Laastens, **sign** die nuwe APK: ```bash jarsigner -keystore key.jks path/to/dist/* ``` ### Optimaliseer nuwe toepassing -**zipalign** is 'n argief-belyningshulpmiddel wat belangrike optimalisering vir Android-toepassings (APK)-lêers verskaf. [Meer inligting hier](https://developer.android.com/studio/command-line/zipalign). +**zipalign** is 'n instrument vir argiefuitlyning wat belangrike optimalisering vir Android-toepassings (APK)-lêers bied. [More information here](https://developer.android.com/studio/command-line/zipalign). ```bash zipalign [-f] [-v] infile.apk outfile.apk zipalign -v 4 infile.apk ``` ### **Onderteken die nuwe APK (weer?)** -As jy **verkies** om [**apksigner**](https://developer.android.com/studio/command-line/) te gebruik in plaas van jarsigner, **moet jy die APK onderteken** na die toepassing van **die optimalisering met** zipaling. MAAR LET OP DAT JY NET DIE **TOEPASSING EENMALIG MOET ONDERTEKEN** MET jarsigner (voor zipalign) OF MET aspsigner (na zipaling). +Indien jy **verkies** om [**apksigner**](https://developer.android.com/studio/command-line/) te gebruik in plaas van jarsigner, **moet jy die apk onderteken** nadat jy **die optimalisering met** zipaling toegepas het. LET WEL DAT JY **SLEGS EEN KEER DIE AANSOEK MOET ONDERTEKEN** MET jarsigner (voor zipalign) OF MET aspsigner (na zipaling). ```bash apksigner sign --ks key.jks ./dist/mycompiled.apk ``` -## Wysig Smali +## Aanpassing van Smali Vir die volgende Hello World Java code: ```java @@ -80,7 +80,7 @@ public static void printHelloWorld() { System.out.println("Hello World") } ``` -Die Smali-kode sou wees: +Die Smali code sou wees: ```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 ``` -Die Smali-instruksieset is beskikbaar [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions). +Die Smali instruksiestel is beskikbaar [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions). -### Ligte Veranderinge +### Ligte veranderinge -### Wysig die aanvanklike waardes van 'n veranderlike binne 'n funksie +### Wysig aanvanklike waardes van 'n veranderlike binne 'n funksie -Sommige veranderlikes word aan die begin van die funksie gedefinieer met behulp van die opcode _const_, jy kan die waardes daarvan wysig, of jy kan nuwe veranderlikes definieer: +Sommige veranderlikes word aan die begin van die funksie met die opcode _const_ gedefinieer; jy kan hul waardes wysig, of jy kan nuwe veranderlikes definieer: ```bash #Number const v9, 0xf4240 @@ -129,7 +129,7 @@ goto :goto_6 #Always go to: :goto_6 ``` ### Groter Veranderinge -### Logregistrasie +### Logboek ```bash #Log win: iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5 @@ -140,17 +140,17 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin ``` Aanbevelings: -- As jy verklaarde veranderlikes binne die funksie gaan gebruik (verklaarde v0,v1,v2...) plaas hierdie reëls tussen die _.local _ en die deklarasies van die veranderlikes (_const v0, 0x1_) -- As jy die logging-kode in die middel van die kode van 'n funksie wil plaas: +- Indien jy verklaarde veranderlikes binne die funksie gaan gebruik (declared v0,v1,v2...) sit hierdie reëls tussen die _.local _ en die verklarings van die veranderlikes (_const v0, 0x1_) +- As jy die logging code in die middel van die kode van 'n funksie wil plaas: - Voeg 2 by die aantal verklaarde veranderlikes: Ex: van _.locals 10_ na _.locals 12_ -- Die nuwe veranderlikes moet die volgende nommers wees na die reeds verklaarde veranderlikes (in hierdie voorbeeld moet dit _v10_ en _v11_ wees, onthou dat dit by v0 begin). -- Verander die kode van die logging-funksie en gebruik _v10_ en _v11_ in plaas van _v5_ en _v1_. +- Die nuwe veranderlikes moet die volgende nommers wees van die reeds verklaarde veranderlikes (in hierdie voorbeeld moet dit _v10_ en _v11_ wees, onthou dat dit by v0 begin). +- Verander die kode van die logging funksie en gebruik _v10_ en _v11_ in plaas van _v5_ en _v1_. ### Toasting Onthou om 3 by die aantal _.locals_ aan die begin van die funksie te voeg. -Hierdie kode is voorberei om in die **middel van 'n funksie** ingevoeg te word (**verander** die aantal **veranderlikes** soos nodig). Dit sal die **waarde van this.o** neem, **omskakel** dit na **String** en dan **maak** 'n **toast** met daardie waarde. +Dit kode is voorberei om in die **middel van 'n funksie** ingevoeg te word (**verander** die getal van die **veranderlikes** soos nodig). Dit sal die **waarde van this.o** neem, dit na **String** omskakel en dan 'n **toast** met sy waarde wys. ```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 ``` -### Laai 'n natiewe biblioteek tydens opstart (System.loadLibrary) +### Laai 'n native biblioteek by opstart (System.loadLibrary) -Partykeer moet jy 'n natiewe biblioteek vooraf laai sodat dit geïnisialiseer word voor ander JNI-biblioteke (bv. om proses-lokale telemetrie/logging moontlik te maak). Jy kan 'n oproep na System.loadLibrary() injekteer in 'n statiese initialiseerder of vroeg in Application.onCreate(). Voorbeeld smali vir 'n statiese klas-initialiseerder (): +Soms moet jy 'n native biblioteek vooraf laai sodat dit voor ander JNI-libs geïnisialiseer word (bv., om proses-lokaal telemetry/logging te aktiveer). Jy kan 'n oproep na System.loadLibrary() in 'n statiese initializer invoeg of vroeg in Application.onCreate(). Voorbeeld smali vir 'n statiese klas-initializer (): ```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 ``` -Alternatiewelik, plaas dieselfde twee instruksies aan die begin van jou Application.onCreate() om te verseker dat die biblioteek so vroeg as moontlik laai: +Alternatiewelik, plaas dieselfde twee instruksies aan die begin van jou Application.onCreate() om te verseker dat die biblioteek so vroeg as moontlik gelaai word: ```smali .method public onCreate()V .locals 1 @@ -189,8 +189,8 @@ return-void .end method ``` Aantekeninge: -- Maak seker die korrekte ABI-variant van die biblioteek bestaan onder lib// (bv. arm64-v8a/armeabi-v7a) om UnsatisfiedLinkError te voorkom. -- Deur baie vroeg te laai (class static initializer) verseker dat die native logger daaropvolgende JNI-aktiwiteit kan waarneem. +- Maak seker dat die korrekte ABI-variant van die biblioteek onder lib// (bv. arm64-v8a/armeabi-v7a) bestaan om UnsatisfiedLinkError te voorkom. +- Laai baie vroeg (class static initializer) — dit verseker dat die native logger daaropvolgende JNI-aktiwiteit kan waarneem. ## Verwysings