Translated ['src/generic-methodologies-and-resources/basic-forensic-meth

This commit is contained in:
Translator 2025-09-04 09:31:14 +00:00
parent 36486660fd
commit df4acba3a3
3 changed files with 113 additions and 113 deletions

View File

@ -1,12 +1,12 @@
# Malware Analysis
# Аналіз шкідливого ПЗ
{{#include ../../banners/hacktricks-training.md}}
## Forensics CheatSheets
## Шпаргалки з форензики
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
## Онлайн сервіси
## Онлайн-сервіси
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
- [HybridAnalysis](https://www.hybrid-analysis.com)
@ -24,8 +24,8 @@ sudo apt-get install -y yara
```
#### Підготуйте правила
Використайте цей скрипт, щоб завантажити та об'єднати всі yara malware rules з github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
Створіть директорію _**rules**_ і виконайте скрипт. Це створить файл _**malware_rules.yar**_, який міститиме всі yara rules для malware.
Використайте цей скрипт, щоб завантажити та об'єднати всі 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
@ -38,7 +38,7 @@ yara -w malware_rules.yar folder #Scan the whole folder
```
#### YaraGen: Перевірка на malware та створення правил
Ви можете використовувати інструмент [**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/)
Ви можете використати інструмент [**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,7 +57,7 @@ clamscan folderpath #Scan the whole folder
```
### [Capa](https://github.com/mandiant/capa)
**Capa** виявляє потенційно шкідливі **можливості** в виконуваних файлах: PE, ELF, .NET. Тому він знайде такі речі, як Att\&ck tactics, або підозрілі можливості, наприклад:
**Capa** виявляє потенційно шкідливі **capabilities** у виконуваних файлах: PE, ELF, .NET. Тому воно знаходить такі речі, як Att\&ck tactics, або підозрілі можливості, наприклад:
- check for OutputDebugString error
- run as a service
@ -67,16 +67,16 @@ clamscan folderpath #Scan the whole folder
### IOCs
IOC означає Indicator Of Compromise. IOC — це набір **умов, що ідентифікують** деяке потенційно небажане програмне забезпечення або підтверджене **malware**. Blue Teams використовують такого роду визначення, щоб **шукати цього роду шкідливі файли** у своїх **системах** та **мережах**.\
Обмін цими визначеннями дуже корисний: якщо malware виявлено на комп'ютері і створено IOC для цього malware, інші Blue Teams можуть використати його, щоб швидше ідентифікувати загрозу.
IOC означає Indicator Of Compromise. IOC — це набір **conditions that identify** деякого потенційно небажаного програмного забезпечення або підтвердженого **malware**. Blue Teams використовують такі визначення, щоб **пошукати подібні шкідливі файли** у своїх **systems** і **networks**.\
Обмін цими визначеннями дуже корисний: коли 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
[**Loki**](https://github.com/Neo23x0/Loki) є сканером для Simple Indicators of Compromise.\
Виявлення базується на чотирьох методах детекції:
[**Loki**](https://github.com/Neo23x0/Loki) — сканер для Simple Indicators of Compromise.\
Виявлення базується на чотирьох методах виявлення:
```
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/) — це сканер malware для Linux, випущений під ліцензією GNU GPLv2, розроблений з урахуванням загроз, які виникають у середовищах спільного хостингу. Він використовує дані про загрози із систем виявлення вторгнень на периферії мережі для вилучення malware, яке активно використовується в атаках, і генерує сигнатури для виявлення. Крім того, дані про загрози також отримуються з подань користувачів через функцію LMD checkout та ресурсів спільноти malware.
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) — це сканер malware для Linux, випущений під ліцензією GNU GPLv2, який розроблений з урахуванням загроз, характерних для shared hosted environments. Він використовує дані про загрози з network edge intrusion detection systems для виявлення malware, що активно використовується в атаках, та генерує сигнатури для їхнього виявлення. Крім того, дані про загрози також надходять від користувацьких надсилань через LMD checkout feature та ресурсів спільноти malware.
### rkhunter
Інструменти на кшталт [**rkhunter**](http://rkhunter.sourceforge.net) можна використовувати для перевірки файлової системи на наявність можливих rootkits і malware.
Інструменти на кшталт [**rkhunter**](http://rkhunter.sourceforge.net) можна використовувати для перевірки файлової системи на наявність можливих **rootkits** і malware.
```bash
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
```
### FLOSS
[**FLOSS**](https://github.com/mandiant/flare-floss) — інструмент, який намагається знайти obfuscated strings всередині виконуваних файлів, використовуючи різні техніки.
[**FLOSS**](https://github.com/mandiant/flare-floss) — інструмент, який намагається знайти **obfuscated strings** всередині **executables**, використовуючи різні методи.
### PEpper
[PEpper ](https://github.com/Th3Hurrican3/PEpper) перевіряє базові речі у виконуваному файлі (binary data, entropy, URLs and IPs, some yara rules).
[PEpper ](https://github.com/Th3Hurrican3/PEpper) перевіряє деякі базові речі всередині **executable** (binary data, entropy, URLs and IPs, some yara rules).
### PEstudio
[PEstudio](https://www.winitor.com/download) — інструмент, який дозволяє отримати інформацію про Windows executables, такі як imports, exports, headers, а також перевіряє virus total і знаходить потенційні Att\&ck techniques.
[PEstudio](https://www.winitor.com/download) — інструмент, який дозволяє отримати інформацію про **Windows executables**, такі як imports, exports, headers, а також перевіряє **virus total** і виявляє потенційні **Att\&ck techniques**.
### Detect It Easy(DiE)
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) — інструмент для визначення, чи файл є **encrypted**, а також для виявлення **packers**.
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) — інструмент для визначення, чи файл є **encrypted**, а також для пошуку **packers**.
### NeoPI
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) — Python script, який використовує різні **statistical methods** для виявлення **obfuscated** та **encrypted** даних у текстових/скриптових файлах. Основна мета NeoPI — допомогти у **detection of hidden web shell code**.
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) — Python script, який використовує різні **statistical methods** для виявлення **obfuscated** та **encrypted** вмісту в текстових/скриптових файлах. Основна мета 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** функції, часто вживані в **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** бінарного файлу, оскільки **developer**, який його підписав, може вже бути **related** з **malware.**
При перевірці зразка **malware sample** завжди слід **check the signature** бінарного файлу, оскільки **developer**, який його підписав, може бути вже **related** з **malware.**
```bash
#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -137,25 +137,25 @@ codesign --verify --verbose /Applications/Safari.app
#Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app
```
## Техніки виявлення
## Detection Techniques
### File Stacking
Якщо відома папка, що містить **files** веб-сервера була **останній раз оновлена в певну дату**, **перевірте** **дату**, коли всі **files** на **web server** були створені та змінені, і якщо якась дата здається **підозрілою**, перевірте цей файл.
If you know that some folder containing the **файли** of a web server was **last updated on some date**. **Check** the **date** all the **файли** in the **web server were created and modified** and if any date is **suspicious**, check that file.
### Baselines
Якщо **files** у папці **не мали бути змінені**, ви можете обчислити **hash** від **оригінальних files** папки і **порівняти** їх із **поточними**. Будь-які зміни будуть **підозрілі**.
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**.
### Statistical Analysis
Коли інформація зберігається в logs, можна **перевірити статистику**, наприклад, скільки разів кожен файл на **web server** був доступний — web shell може бути одним із найчастіше accessed.
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**.
---
### Android in-app native telemetry (no root)
На Android ви можете інструментувати native code всередині процесу цільового додатка, попередньо підвантаживши невелику бібліотеку логера перед ініціалізацією інших JNI libs. Це дає ранню видимість native поведінки без system-wide hooks або root. Популярний підхід — SoTap: помістіть libsotap.so для потрібного ABI в APK і інжектуйте виклик System.loadLibrary("sotap") на ранньому етапі (наприклад, static initializer або Application.onCreate), після чого збирайте логи з internal/external paths або через fallback в Logcat.
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:
@ -167,11 +167,11 @@ See the Android native reversing page for setup details and log paths:
## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)
Сучасні malware families широко зловживають Control-Flow Graph (CFG) obfuscation: замість прямого 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.
Техніку — продемонстровану в SLOW#TEMPEST loader — можна подолати трикроковим workflow, який покладається лише на IDAPython та 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. Знайдіть кожний indirect 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. Витягніть байткод диспетчера
### 2. Витягти байт-код диспетчера
```python
import idc
@ -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)
```
Запустіть `run(code,0,0)` та `run(code,1,1)`, щоб отримати *false* і *true* цільові адреси гілок.
Запустіть `run(code,0,0)` і `run(code,1,1)`, щоб отримати цілі гілок для *false* та *true*.
### 4. Відновлення прямого jump / call
### 4. Patch back a direct jump / call
```python
import struct, ida_bytes
@ -222,28 +222,28 @@ 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))
```
Після внесення патчу примусово змусьте IDA повторно проаналізувати функцію, щоб відновити повний CFG і вивід Hex-Rays:
Після застосування патчу, змусьте IDA повторно проаналізувати функцію, щоб відновити повний CFG і вивід Hex-Rays:
```python
import ida_auto, idaapi
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
```
### 5. Позначте непрямі виклики API
Коли відоме реальне призначення кожного `call rax`, можна вказати IDA, що це за функція, і типи параметрів та імена змінних відновляться автоматично:
Як тільки справжнє призначення кожного `call rax` буде відоме, ви можете повідомити IDA, що це за виклик, щоб типи параметрів та імена змінних були відновлені автоматично:
```python
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
```
### Практичні переваги
* Відновлює реальний CFG → decompilation переходить з *10* рядків до тисяч.
* Дозволяє string-cross-reference & xrefs, що робить відновлення поведінки тривіальним.
* Скрипти повторно використовуються: просто помістіть їх у будь-який loader, захищений тим самим трюком.
* Відновлює реальний CFG → декомпіляція переходить з *10* рядків до тисяч.
* Дозволяє string-cross-reference & xrefs, що робить реконструкцію поведінки тривіальною.
* Scripts повторно використовувані: помістіть їх у будь-який loader, захищений тим самим трюком.
---
## Джерела
## Посилання
- [Unit42 Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
- SoTap: Lightweight in-app JNI (.so) behavior logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
- SoTap: Легкий in-app JNI (.so) логер поведінки [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -3,14 +3,14 @@
{{#include ../../banners/hacktricks-training.md}}
**Для додаткової інформації див.** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
**Для додаткової інформації див.:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Android-додатки можуть використовувати нативні бібліотеки, зазвичай написані на C або C++, для задач, критичних до продуктивності. Зловмисники також зловживають цими бібліотеками, оскільки ELF shared objects все ще важче декомпілювати, ніж DEX/OAT байт-код.
Ця сторінка зосереджена на *практичних* робочих процесах та *останніх* покращеннях інструментарію (20232025), які полегшують реверсинг Android `.so` файлів.
Android-застосунки можуть використовувати нативні бібліотеки, зазвичай написані на C або C++, для завдань, де критична продуктивність. Зловмисники також зловживають такими бібліотеками, оскільки ELF shared objects все ще складніше декомпілювати, ніж DEX/OAT байт-код.
Ця сторінка зосереджена на *практичних* робочих процесах і *останніх* покращеннях інструментів (20232025), які спрощують реверс Android `.so` файлів.
---
### Швидкий триаж для щойно витягнутого `libfoo.so`
### Швидкий робочий процес триажу для щойно витягнутої `libfoo.so`
1. **Витягніть бібліотеку**
```bash
@ -19,32 +19,32 @@ 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. **Визначте архітектуру та механізми захисту**
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. **Перелічіть експортовані символи та JNI-зв'язки**
3. **Перелічіть експортовані символи та прив'язки JNI**
```bash
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
```
4. **Завантажте в декомпілятор** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) і запустіть автоматичний аналіз.
Новіші версії Ghidra додали AArch64 decompiler, який розпізнає PAC/BTI заглушки та MTE теги, що значно покращує аналіз бібліотек, зібраних з Android 14 NDK.
5. **Визначте статичний чи динамічний реверсинг:** stripped, obfuscated код часто потребує *інструментування* (Frida, ptrace/gdbserver, LLDB).
4. **Завантажте у декомпілятор** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) і запустіть автоаналіз.
Новіші версії Ghidra додали декомпілятор для AArch64, який розпізнає PAC/BTI stubs і MTE теги, що значно покращує аналіз бібліотек, зібраних з Android 14 NDK.
5. **Визначте статичний чи динамічний підхід до реверсу:** stripped, обфусцований код часто вимагає *інструментування* (Frida, ptrace/gdbserver, LLDB).
---
### Динамічне інструментування (Frida ≥ 16)
Серія Frida 16 принесла кілька Android-специфічних покращень, що допомагають, коли ціль використовує сучасні оптимізації Clang/LLD:
Серія Frida 16 принесла кілька специфічних для Android покращень, які допомагають, коли ціль використовує сучасні оптимізації Clang/LLD:
* `thumb-relocator` тепер може hook-увати крихітні ARM/Thumb-функції, згенеровані агресивним вирівнюванням LLD (`--icf=all`).
* Перелічення та rebinding *ELF import slots* працює на Android, що дозволяє робити патчинг на рівні модулів через `dlopen()`/`dlsym()` коли inline hooks не підходять.
* Java hooking виправлено для нового **ART quick-entrypoint**, який використовується, коли додатки компілюються з `--enable-optimizations` на Android 14.
* `thumb-relocator` тепер може *hook tiny ARM/Thumb functions*, згенеровані агресивним вирівнюванням LLD (`--icf=all`).
* Перелічення та rebinding *ELF import slots* працюють на Android, дозволяючи патчити по-модульно через `dlopen()`/`dlsym()`, коли inline hooks відхиляються.
* Java hooking було виправлено для нового **ART quick-entrypoint**, що використовується, коли додатки компілюються з `--enable-optimizations` на Android 14.
Приклад: перелічення всіх функцій, зареєстрованих через `RegisterNatives`, і дамп їхніх адрес під час виконання:
Example: enumerating all functions registered through `RegisterNatives` and dumping their addresses at runtime:
```javascript
Java.perform(function () {
var Runtime = Java.use('java.lang.Runtime');
@ -61,16 +61,16 @@ 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-enabled пристроях (Pixel 8/Android 14+) за умови використання frida-server 16.2 або новішої версії — ранні версії не могли знайти padding для inline hooks.
### Process-local JNI telemetry via preloaded .so (SoTap)
Коли повнофункціональна інструментація надмірна або заблокована, ви все ще можете отримати видимість на рівні native, попередньо завантаживши невеликий логер всередині цільового процесу. SoTap — це легка Android native (.so) бібліотека, що логирует runtime-поведінку інших JNI (.so) бібліотек у тому ж процесі додатку (root не потрібен).
Коли повнофункціональна instrumentation надмірна або заблокована, ви все ще можете отримати видимість на рівні native, попередньо підключивши невеликий логер всередині цільового процесу. SoTap — легка Android native (.so) бібліотека, яка логує runtime-поведінку інших JNI (.so) бібліотек в тому самому процесі додатку (root не потрібен).
Key properties:
- Ініціалізується рано та спостерігає взаємодії JNI/native всередині процесу, який його завантажив.
- Зберігає логи, використовуючи кілька доступних для запису шляхів із плавним переходом на Logcat, коли доступ до сховища обмежений.
- Налаштовується у вихідному коді: відредагуйте sotap.c, щоб розширити/підправити те, що логуватиметься, і пересоберіть під кожен ABI.
Ключові властивості:
- Ініціалізується рано та спостерігає JNI/native взаємодії всередині процесу, який її завантажив.
- Зберігає логи, використовуючи кілька доступних для запису шляхів з плавним fallback до Logcat, коли сховище обмежено.
- Налаштовується в коді: редагуйте sotap.c, щоб розширити/підкорегувати, що саме логувати, і перебудуйте під потрібний ABI.
Setup (repack the APK):
1) Drop the proper ABI build into the APK so the loader can resolve libsotap.so:
@ -91,41 +91,41 @@ Log paths (checked in order):
/sdcard/Download/sotap-%s.log
# If all fail: fallback to Logcat only
```
Примітки та усунення несправностей:
- ABI alignment є обов'язковим. Несумісність спричинить UnsatisfiedLinkError і logger не завантажиться.
- Обмеження сховища поширені на сучасних Android; якщо запис файлів не вдається, SoTap все одно виводитиме дані через Logcat.
- Поведінка/деталізація призначені для налаштування; після редагування sotap.c зберіть з вихідників.
Notes and troubleshooting:
- ABI alignment is mandatory. A mismatch will raise UnsatisfiedLinkError and the logger wont load.
- Storage constraints are common on modern Android; if file writes fail, SoTap will still emit via Logcat.
- Behavior/verbosity is intended to be customized; rebuild from source after editing sotap.c.
Цей підхід корисний для тріажу malware та відладки JNI, коли важливо спостерігати потоки викликів native з моменту запуску процесу, але root або system-wide hooks недоступні.
This approach is useful for malware triage and JNI debugging where observing native call flows from process start is critical but root/system-wide hooks arent available.
---
### Останні вразливості, які варто шукати в APK
### Recent vulnerabilities worth hunting for in APKs
| Рік | CVE | Уражена бібліотека | Примітки |
| Year | CVE | Affected library | Notes |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Переповнення heap-буфера, доступне з native-коду, який декодує WebP-зображення. Декілька Android застосунків включають вразливі версії. Коли ви бачите `libwebp.so` всередині APK, перевірте її версію та спробуйте експлуатацію або патчування.| |
|2024|Multiple|OpenSSL 3.x series|Кілька проблем з безпекою пам'яті та padding-oracle. Багато Flutter & ReactNative збірок постачають власний `libcrypto.so`.|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Переповнення буфера в купі (heap buffer overflow), доступне з native-коду, який декодує WebP-зображення. Декілька Android-додатків включають в себе вразливі версії. Коли ви бачите `libwebp.so` всередині APK, перевіряйте його версію і пробуйте експлуатацію або виправлення.| |
|2024|Multiple|OpenSSL 3.x series|Кілька проблем пов’язаних із безпекою пам’яті та padding-oracle. Багато Flutter & ReactNative бандлів постачають власний `libcrypto.so`.|
Коли ви помічаєте *third-party* `.so` файли всередині APK, завжди перевіряйте їхній хеш порівняно з upstream advisories. SCA (Software Composition Analysis) на мобільних рідко використовується, тому застарілі вразливі збірки поширені.
Коли ви знаходите *third-party* `.so` файли всередині APK, завжди звіряйте їх хеш з upstream advisories. SCA (Software Composition Analysis) рідко застосовується на мобільних платформах, тому застарілі вразливі збірки поширені.
---
### Тенденції Anti-Reversing та Hardening (Android 13-15)
### Anti-Reversing & Hardening trends (Android 13-15)
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 вмикає PAC/BTI у системних бібліотеках на підтримуваному ARMv8.3+ кремнії. Декомпілятори тепер показують PACпов'язані псевдо-інструкції; для динамічного аналізу Frida інжектить trampolines *після* видалення PAC, але ваші власні trampоліни повинні викликати `pacda`/`autibsp` там, де це необхідно.
* **MTE & Scudo hardened allocator:** memory-tagging необов'язковий, але багато додатків, що враховують Play-Integrity, збираються з `-fsanitize=memtag`; використовуйте `setprop arm64.memtag.dump 1` плюс `adb shell am start ...` щоб зафіксувати tag faults.
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** комерційні packers (наприклад, Bangcle, SecNeo) все частіше захищають *native* код, а не лише Java; очікуйте фіктивний control-flow та зашифровані string blobs у `.rodata`.
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 вмикає PAC/BTI в системних бібліотеках на сумісному ARMv8.3+ silicon. Decompilers тепер відображають PACповязані псевдо-інструкції; для динамічного аналізу Frida інжектує trampolines *after* stripping PAC, але ваші кастомні trampolines повинні викликати `pacda`/`autibsp` там, де потрібно.
* **MTE & Scudo hardened allocator:** memory-tagging є опціональним, але багато Play-Integrity aware додатків збираються з `-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) все частіше захищають *native* код, не лише Java; очікуйте фальшиві control-flow та зашифровані string blobs у `.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

@ -3,55 +3,55 @@
{{#include ../../banners/hacktricks-training.md}}
Іноді буває корисно змінити код застосунку, щоб отримати приховану інформацію (наприклад добре обфусковані паролі або flags). Тоді може бути цікаво декомпілювати apk, змінити код і скомпілювати його знову.
Іноді буває корисно змінити код додатку, щоб отримати приховану інформацію для себе (можливо добре обфусковані паролі або flags). Тоді може бути цікаво decompile the apk, modify the code і recompile його.
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
## Fast Way
## Швидкий спосіб
Використовуючи **Visual Studio Code** та розширення [APKLab](https://github.com/APKLab/APKLab), ви можете **автоматично декомпілювати**, змінити, **скомпілювати**, підписати та встановити застосунок без виконання будь-яких команд.
Використовуючи Visual Studio Code та розширення APKLab, ви можете автоматично decompile, modify, recompile, sign & install додаток без виконання жодної команди.
Ще один **скрипт**, який значно полегшує це завдання, — [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
Ще один скрипт, який значно полегшує це завдання — [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
## 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/)
If **apktool** дає будь‑яку помилку, спробуйте [встановити **останній версії**](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_
- Any file with extension _.sqlite_ or _.db_
Якщо `apktool` має **проблеми з декодуванням застосунку** перегляньте [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) або спробуйте використати аргумент **`-r`** (не декодувати ресурси). Якщо проблема була в ресурсі, а не в коді джерела, проблема зникне (ви також не декомпілюєте ресурси).
Якщо `apktool` має **проблеми з декодуванням додатка**, перегляньте [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) або спробуйте використати аргумент **`-r`** (Do not decode resources). Тоді, якщо проблема була в ресурсі, а не в коді, ви уникаєте цієї проблеми (також ви не декомпілюєте ресурси).
## Змінити smali код
Ви можете **змінювати** **інструкції**, змінювати **значення** деяких змінних або **додавати** нові інструкції. Я змінюю Smali-код за допомогою [**VS Code**](https://code.visualstudio.com), після чого встановіть **smalise extension** і редактор підкаже, якщо якась **інструкція некоректна**.\
Ви можете **змінювати** **instructions**, змінювати **value** деяких змінних або **додавати** нові інструкції. Я змінюю Smali код за допомогою [**VS Code**](https://code.visualstudio.com), потім встановіть розширення **smalise**, і редактор скаже вам, якщо якась **instruction некоректна**.
Деякі **приклади** можна знайти тут:
- [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).
## Перекомпілювати APK
Після зміни коду ви можете **перекомпілювати** код, використовуючи:
Після внесення змін у код ви можете **перекомпілювати** код, використовуючи:
```bash
apktool b . #In the folder generated when you decompiled the application
```
Він **зкомпілює** новий APK **всередині** папки _**dist**_.
Він **скомпілює** новий APK **всередині** папки _**dist**_.
Якщо **apktool** видає **помилку**, спробуйте [встановити **останню версію**](https://ibotpeaches.github.io/Apktool/install/)
Якщо **apktool** викидає **помилку**, спробуйте[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
### **Підписати новий APK**
### **Підпишіть новий APK**
Потім потрібно **згенерувати ключ** (у вас попросять пароль та деяку інформацію, яку можна заповнити довільно):
Потім потрібно **згенерувати ключ** (вам буде запропоновано ввести пароль та деяку інформацію, яку можна заповнити випадковими даними):
```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 application (APK) files. [Детальніше](https://developer.android.com/studio/command-line/zipalign).
**zipalign** — це інструмент вирівнювання архівів, який забезпечує важливу оптимізацію файлів Android-додатків (APK). [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
```
### **Підписати новий APK (знову?)**
### **Підпишіть новий APK (знову?)**
Якщо ви **надаєте перевагу** використовувати [**apksigner**](https://developer.android.com/studio/command-line/) замість jarsigner, **ви повинні підписати apk** після застосування **оптимізації за допомогою** zipaling. ПРОТЕ ЗВЕРНІТЬ УВАГУ, ЩО ПОТРІБНО **ПІДПИСАТИ ДОДАТОК ЛИШЕ ОДИН РАЗ** за допомогою jarsigner (перед zipalign) АБО за допомогою aspsigner (після zipaling).
Якщо ви **вважаєте за краще** використовувати [**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
## Модифікація Smali
Для наступного Java-коду Hello World:
Для наступного коду Hello World на Java:
```java
public static void printHelloWorld() {
System.out.println("Hello World")
@ -92,11 +92,11 @@ return-void
```
Набір інструкцій Smali доступний [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
### Невеликі зміни
### Незначні зміни
### Змінити початкові значення змінної всередині функції
Деякі змінні визначаються на початку функції за допомогою опкоду _const_, ви можете змінити їхні значення, або можете визначити нові:
Деякі змінні визначені на початку функції за допомогою опкоду _const_; ви можете змінити їхні значення або додати нові:
```bash
#Number
const v9, 0xf4240
@ -127,7 +127,7 @@ iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
goto :goto_6 #Always go to: :goto_6
```
### Більші зміни
### Великі зміни
### Логування
```bash
@ -138,19 +138,19 @@ move-result-object v1 #Move to v1
const-string v5, "wins" #Save "win" inside v5
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
```
Рекомендації:
Recommendations:
- Якщо ви збираєтеся використовувати оголошені змінні всередині функції (declared v0,v1,v2...) розмістіть ці рядки між _.local <number>_ і деклараціями змінних (_const v0, 0x1_)
- Якщо ви хочете вставити logging code посеред коду функції:
- Якщо ви збираєтесь використовувати оголошені змінні всередині функції (declared v0,v1,v2...) помістіть ці рядки між _.local <number>_ і деклараціями змінних (_const v0, 0x1_)
- Якщо ви хочете вставити код логування посеред коду функції:
- Додайте 2 до кількості оголошених змінних: Ex: from _.locals 10_ to _.locals 12_
- Нові змінні повинні бути наступними номерами від вже оголошених змінних (в цьому прикладі це повинні бути _v10_ та _v11_, пам'ятайте, що нумерація починається з v0).
- Змініть код logging function та використовуйте _v10_ і _v11_ замість _v5_ і _v1_.
- Нові змінні повинні бути наступними номерами після вже оголошених змінних (в цьому прикладі це повинні бути _v10_ та _v11_, remember that it starts in v0).
- Змініть код функції логування та використовуйте _v10_ і _v11_ замість _v5_ і _v1_.
### Toasting
### Відображення Toast
Пам'ятайте додати 3 до числа _.locals_ на початку функції.
This code is prepared to be inserted in the **середину функції** (**змініть** число **змінних** за потреби). Він візьме **значення this.o**, **перетворить** його на **String** і потім **зробить** **toast** з його значення.
This code is prepared to be inserted in the **середину функції** (**змініть** число **змінних** за потреби). It will take the **значення this.o**, **перетворить** його на **String** and them **зробить** a **toast** with its value.
```bash
const/4 v10, 0x1
const/4 v11, 0x1
@ -164,7 +164,7 @@ invoke-virtual {v12}, Landroid/widget/Toast;->show()V
```
### Loading a Native Library at Startup (System.loadLibrary)
Іноді потрібно заздалегідь завантажити native library, щоб вона ініціалізувалася до інших JNI libs (наприклад, щоб увімкнути process-local telemetry/logging). Ви можете впровадити виклик System.loadLibrary() у статичний ініціалізатор або на ранньому етапі Application.onCreate(). Приклад smali для статичного ініціалізатора класу (<clinit>):
Іноді потрібно попередньо завантажити нативну бібліотеку, щоб вона ініціалізувалася перед іншими JNI libs (наприклад, щоб увімкнути локальну для процесу телеметрію/логування). Ви можете інжектувати виклик System.loadLibrary() у статичний ініціалізатор або на ранньому етапі Application.onCreate(). Приклад smali для статичного ініціалізатора класу (<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: Легкий in-app JNI (.so) логер поведінки [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
- SoTap: Легкий in-app JNI (.so) behavior logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
{{#include ../../banners/hacktricks-training.md}}