Translated ['src/mobile-pentesting/android-app-pentesting/smali-changes.

This commit is contained in:
Translator 2025-09-04 02:39:59 +00:00
parent fac91cfc2c
commit 495c3534e9
3 changed files with 206 additions and 117 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)
@ -14,7 +14,7 @@
- [Intezer](https://analyze.intezer.com)
- [Any.Run](https://any.run/)
## Офлайн Антивірусні та Інструменти Виявлення
## Офлайн антивірусні та інструменти виявлення
### Yara
@ -22,10 +22,10 @@
```bash
sudo apt-get install -y yara
```
#### Підготовка правил
#### Підготуйте правила
Використовуйте цей скрипт для завантаження та об'єднання всіх правил yara для шкідливого ПЗ з github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
Створіть директорію _**rules**_ і виконайте його. Це створить файл під назвою _**malware_rules.yar**_, який міститиме всі правила yara для шкідливого ПЗ.
Використайте цей скрипт, щоб завантажити та об'єднати всі yara malware rules з github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
Створіть директорію _**rules**_ і виконайте скрипт. Це створить файл _**malware_rules.yar**_, який міститиме всі yara rules для malware.
```bash
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
@ -36,9 +36,9 @@ python malware_yara_rules.py
yara -w malware_rules.yar image #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder
```
#### YaraGen: Перевірка на наявність шкідливого ПЗ та створення правил
#### YaraGen: Перевірка на malware та створення правил
Ви можете використовувати інструмент [**YaraGen**](https://github.com/Neo23x0/yarGen) для генерації правил yara з бінарного файлу. Ознайомтеся з цими навчальними посібниками: [**Частина 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Частина 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Частина 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
Ви можете використовувати інструмент [**YaraGen**](https://github.com/Neo23x0/yarGen) для генерації yara rules із бінарного файлу. Перегляньте ці підручники: [**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** виявляє потенційно шкідливі **можливості** в виконуваних файлах: PE, ELF, .NET. Тому він знайде такі речі, як тактики Att\&ck або підозрілі можливості, такі як:
**Capa** виявляє потенційно шкідливі **можливості** в виконуваних файлах: PE, ELF, .NET. Тому він знайде такі речі, як Att\&ck tactics, або підозрілі можливості, наприклад:
- перевірка на помилку OutputDebugString
- запуск як служба
- створення процесу
- check for OutputDebugString error
- run as a service
- create process
Отримайте його в [**Github репозиторії**](https://github.com/mandiant/capa).
Отримати його можна в [**Github repo**](https://github.com/mandiant/capa).
### IOCs
IOC означає Індикатор Компрометації. IOC - це набір **умов, які ідентифікують** деяке потенційно небажане програмне забезпечення або підтверджене **шкідливе ПЗ**. Команди Blue Teams використовують таке визначення, щоб **шукати такі шкідливі файли** у своїх **системах** та **мережах**.\
Д sharing these definitions is very useful as when malware is identified in a computer and an IOC for that malware is created, other Blue Teams can use it to identify the malware faster.
IOC означає Indicator Of Compromise. IOC — це набір **умов, що ідентифікують** деяке потенційно небажане програмне забезпечення або підтверджене **malware**. Blue Teams використовують такого роду визначення, щоб **шукати цього роду шкідливі файли** у своїх **системах** та **мережах**.\
Обмін цими визначеннями дуже корисний: якщо malware виявлено на комп'ютері і створено IOC для цього malware, інші Blue Teams можуть використати його, щоб швидше ідентифікувати загрозу.
Інструмент для створення або модифікації 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), щоб **шукати визначені IOCs на пристрої**.
### Loki
[**Loki**](https://github.com/Neo23x0/Loki) - це сканер для Простих Індикаторів Компрометації.\
Виявлення базується на чотирьох методах виявлення:
[**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/) - це сканер шкідливого ПЗ для Linux, випущений під ліцензією GNU GPLv2, який розроблений з урахуванням загроз, що виникають у середовищах спільного хостингу. Він використовує дані про загрози з систем виявлення вторгнень на краю мережі для виявлення шкідливого ПЗ, яке активно використовується в атаках, і генерує сигнатури для виявлення. Крім того, дані про загрози також отримуються з подань користувачів за допомогою функції перевірки LMD та ресурсів спільноти шкідливого ПЗ.
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) — це сканер malware для Linux, випущений під ліцензією GNU GPLv2, розроблений з урахуванням загроз, які виникають у середовищах спільного хостингу. Він використовує дані про загрози із систем виявлення вторгнень на периферії мережі для вилучення malware, яке активно використовується в атаках, і генерує сигнатури для виявлення. Крім того, дані про загрози також отримуються з подань користувачів через функцію LMD checkout та ресурсів спільноти malware.
### rkhunter
Інструменти, такі як [**rkhunter**](http://rkhunter.sourceforge.net), можуть бути використані для перевірки файлової системи на можливі **rootkits** та шкідливе ПЗ.
Інструменти на кшталт [**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) - це інструмент, який намагатиметься знайти обфусцировані рядки всередині виконуваних файлів, використовуючи різні техніки.
[**FLOSS**](https://github.com/mandiant/flare-floss) — інструмент, який намагається знайти obfuscated strings всередині виконуваних файлів, використовуючи різні техніки.
### PEpper
[PEpper ](https://github.com/Th3Hurrican3/PEpper)перевіряє деякі базові речі всередині виконуваного файлу (бінарні дані, ентропія, URL-адреси та IP-адреси, деякі правила yara).
[PEpper ](https://github.com/Th3Hurrican3/PEpper) перевіряє базові речі у виконуваному файлі (binary data, entropy, URLs and IPs, some yara rules).
### PEstudio
[PEstudio](https://www.winitor.com/download) - це інструмент, який дозволяє отримувати інформацію про виконувані файли Windows, такі як імпорти, експорти, заголовки, але також перевірить virus total і знайде потенційні техніки Att\&ck.
[PEstudio](https://www.winitor.com/download) — інструмент, який дозволяє отримати інформацію про Windows executables, такі як imports, exports, headers, а також перевіряє virus total і знаходить потенційні Att\&ck techniques.
### Detect It Easy(DiE)
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) - це інструмент для виявлення, чи є файл **зашифрованим**, а також для знаходження **пакерів**.
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) — інструмент для визначення, чи файл є **encrypted**, а також для виявлення **packers**.
### NeoPI
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) - це скрипт на Python, який використовує різноманітні **статистичні методи** для виявлення **обфусцированого** та **зашифрованого** контенту в текстових/скриптових файлах. Заплановане призначення NeoPI - допомогти у **виявленні прихованого коду веб-оболонки**.
[**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) робить все можливе, щоб виявити **обфусцирований**/**підозрілий код**, а також файли, що використовують функції **PHP**, які часто використовуються в **шкідливих програмах**/веб-оболонках.
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) робить усе можливе, щоб виявити **obfuscated**/**dodgy code**, а також файли, що використовують **PHP** функції, часто вживані в **malwares**/webshells.
### Apple Binary Signatures
При перевірці деякого **зразка шкідливого ПЗ** ви завжди повинні **перевіряти підпис** бінарного файлу, оскільки **розробник**, який його підписав, може бути вже **пов'язаний** зі **шкідливим ПЗ.**
Під час перевірки деякого **malware sample** завжди слід **check the signature** бінарного файлу, оскільки **developer**, який його підписав, може вже бути **related** з **malware.**
```bash
#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -139,27 +139,39 @@ spctl --assess --verbose /Applications/Safari.app
```
## Техніки виявлення
### Складання файлів
### File Stacking
Якщо ви знаєте, що деяка папка, що містить **файли** веб-сервера, була **останніми оновленнями на певну дату**. **Перевірте** **дату** всіх **файлів**, які були створені та змінені на **веб-сервері**, і якщо якась дата є **підозрілою**, перевірте цей файл.
Якщо відома папка, що містить **files** веб-сервера була **останній раз оновлена в певну дату**, **перевірте** **дату**, коли всі **files** на **web server** були створені та змінені, і якщо якась дата здається **підозрілою**, перевірте цей файл.
### Базові лінії
### Baselines
Якщо файли папки **не повинні були бути зміненими**, ви можете обчислити **хеш** **оригінальних файлів** папки та **порівняти** їх з **поточними**. Усе, що було змінено, буде **підозрілим**.
Якщо **files** у папці **не мали бути змінені**, ви можете обчислити **hash** від **оригінальних files** папки і **порівняти** їх із **поточними**. Будь-які зміни будуть **підозрілі**.
### Статистичний аналіз
### Statistical Analysis
Коли інформація зберігається в журналах, ви можете **перевірити статистику, наприклад, скільки разів кожен файл веб-сервера був доступний, оскільки веб-оболонка може бути одним з найбільш**.
Коли інформація зберігається в logs, можна **перевірити статистику**, наприклад, скільки разів кожен файл на **web server** був доступний — web shell може бути одним із найчастіше accessed.
---
## Деобфускація динамічного контролю потоку (JMP/CALL RAX диспетчери)
### Android in-app native telemetry (no root)
Сучасні сімейства шкідливих програм сильно зловживають обфускацією графа контролю потоку (CFG): замість прямого стрибка/виклику вони обчислюють призначення під час виконання та виконують `jmp rax` або `call rax`. Невеликий *диспетчер* (зазвичай дев'ять інструкцій) встановлює остаточну ціль залежно від флагів CPU `ZF`/`CF`, повністю порушуючи статичне відновлення CFG.
На 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.
Цю техніку продемонстровану завантажувачем SLOW#TEMPEST можна подолати за допомогою трьохетапного робочого процесу, який покладається лише на IDAPython та емулятор CPU Unicorn.
See the Android native reversing page for setup details and log paths:
### 1. Знайдіть кожен непрямий стрибок / виклик
{{#ref}}
../../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
{{#endref}}
---
## 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.
Техніку — продемонстровану в SLOW#TEMPEST loader — можна подолати трикроковим workflow, який покладається лише на IDAPython та Unicorn CPU emulator.
### 1. Locate every indirect jump / call
```python
import idautils, idc
@ -168,7 +180,7 @@ mnem = idc.print_insn_mnem(ea)
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
print(f"[+] Dispatcher found @ {ea:X}")
```
### 2. Витягніть байт-код диспетчера
### 2. Витягніть байткод диспетчера
```python
import idc
@ -183,7 +195,7 @@ size = jmp_ea + idc.get_item_size(jmp_ea) - start
code = idc.get_bytes(start, size)
open(f"{start:X}.bin", "wb").write(code)
```
### 3. Емулюйте його двічі з Unicorn
### 3. Емулюйте це двічі за допомогою Unicorn
```python
from unicorn import *
from unicorn.x86_const import *
@ -199,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)`, щоб отримати цілі *хибної* та *істинної* гілок.
Запустіть `run(code,0,0)` та `run(code,1,1)`, щоб отримати *false* і *true* цільові адреси гілок.
### 4. Виправте прямий перехід / виклик
### 4. Відновлення прямого jump / call
```python
import struct, ida_bytes
@ -210,27 +222,28 @@ op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
disp = target - (ea + 5) & 0xFFFFFFFF
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 → декомпіляція переходить з *10* рядків до тисяч.
* Дозволяє перехресне посилання на рядки та xrefs, що робить реконструкцію поведінки тривіальною.
* Скрипти можна повторно використовувати: просто вставте їх у будь-який завантажувач, захищений тим самим трюком.
* Відновлює реальний CFG → decompilation переходить з *10* рядків до тисяч.
* Дозволяє string-cross-reference & xrefs, що робить відновлення поведінки тривіальним.
* Скрипти повторно використовуються: просто помістіть їх у будь-який 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)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,47 +1,50 @@
# Реверсія нативних бібліотек
# Реверсинг нативних бібліотек
{{#include ../../banners/hacktricks-training.md}}
**Для отримання додаткової інформації дивіться:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Android додатки можуть використовувати нативні бібліотеки, зазвичай написані на C або C++, для критично важливих завдань з точки зору продуктивності. Творці шкідливого ПЗ також зловживають цими бібліотеками, оскільки ELF спільні об'єкти все ще важче декомпілювати, ніж DEX/OAT байт-код. Ця сторінка зосереджена на *практичних* робочих процесах і *сучасних* покращеннях інструментів (2023-2025), які спрощують реверсування Android `.so` файлів.
**Для додаткової інформації див.** [**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` файлів.
---
### Швидкий робочий процес для свіжовитягнутої `libfoo.so`
### Швидкий триаж для щойно витягнутого `libfoo.so`
1. **Витягніть бібліотеку**
```bash
# З встановленого додатку
# From an installed application
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Або з APK (zip)
# Or from the APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
```
2. **Визначте архітектуру та захисти**
2. **Визначте архітектуру та механізми захисту**
```bash
file libfoo.so # arm64 або arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO тощо
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_' # динамічно зв'язані JNI
strings libfoo.so | grep -i "RegisterNatives" -n # статично зареєстровані JNI
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 або Cutter/Rizin) і запустіть автоаналіз. Новіші версії Ghidra представили декомпілятор AArch64, який розпізнає PAC/BTI стовпці та MTE теги, значно покращуючи аналіз бібліотек, створених з Android 14 NDK.
5. **Визначте, чи використовувати статичне чи динамічне реверсування:** знятий, обфускований код часто потребує *інструментації* (Frida, ptrace/gdbserver, LLDB).
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).
---
### Динамічна інструментація (Frida ≥ 16)
### Динамічне інструментування (Frida ≥ 16)
Серія 16 Frida принесла кілька покращень, специфічних для Android, які допомагають, коли ціль використовує сучасні оптимізації Clang/LLD:
Серія Frida 16 принесла кілька Android-специфічних покращень, що допомагають, коли ціль використовує сучасні оптимізації Clang/LLD:
* `thumb-relocator` тепер може *перехоплювати маленькі ARM/Thumb функції*, згенеровані агресивним вирівнюванням LLD (`--icf=all`).
* Перерахування та повторне зв'язування *ELF імпортних слотів* працює на Android, що дозволяє патчинг `dlopen()`/`dlsym()` для кожного модуля, коли вбудовані хуки відхиляються.
* Хукінг Java був виправлений для нового **ART швидкого входу**, що використовується, коли додатки компілюються з `--enable-optimizations` на Android 14.
* `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.
Приклад: перерахування всіх функцій, зареєстрованих через `RegisterNatives`, і вивантаження їх адрес під час виконання:
Приклад: перелічення всіх функцій, зареєстрованих через `RegisterNatives`, і дамп їхніх адрес під час виконання:
```javascript
Java.perform(function () {
var Runtime = Java.use('java.lang.Runtime');
@ -58,38 +61,76 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
});
});
```
Frida буде працювати з коробки на пристроях з підтримкою PAC/BTI (Pixel 8/Android 14+), якщо ви використовуєте frida-server 16.2 або новішу версію попередні версії не змогли знайти заповнення для вбудованих хуків. citeturn5search2turn5search0
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)
Коли повнофункціональна інструментація надмірна або заблокована, ви все ще можете отримати видимість на рівні native, попередньо завантаживши невеликий логер всередині цільового процесу. SoTap — це легка Android native (.so) бібліотека, що логирует runtime-поведінку інших JNI (.so) бібліотек у тому ж процесі додатку (root не потрібен).
Key properties:
- Ініціалізується рано та спостерігає взаємодії JNI/native всередині процесу, який його завантажив.
- Зберігає логи, використовуючи кілька доступних для запису шляхів із плавним переходом на Logcat, коли доступ до сховища обмежений.
- Налаштовується у вихідному коді: відредагуйте sotap.c, щоб розширити/підправити те, що логуватиметься, і пересоберіть під кожен ABI.
Setup (repack the APK):
1) Drop the proper ABI build into the APK so the loader can resolve libsotap.so:
- lib/arm64-v8a/libsotap.so (for arm64)
- lib/armeabi-v7a/libsotap.so (for arm32)
2) Ensure SoTap loads before other JNI libs. Inject a call early (e.g., Application subclass static initializer or onCreate) so the logger is initialized first. Smali snippet example:
```smali
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
```
3) Rebuild/sign/install, run the app, then collect logs.
Log paths (checked in order):
```
/data/user/0/%s/files/sotap.log
/data/data/%s/files/sotap.log
/sdcard/Android/data/%s/files/sotap.log
/sdcard/Download/sotap-%s.log
# If all fail: fallback to Logcat only
```
Примітки та усунення несправностей:
- ABI alignment є обов'язковим. Несумісність спричинить UnsatisfiedLinkError і logger не завантажиться.
- Обмеження сховища поширені на сучасних Android; якщо запис файлів не вдається, SoTap все одно виводитиме дані через Logcat.
- Поведінка/деталізація призначені для налаштування; після редагування sotap.c зберіть з вихідників.
Цей підхід корисний для тріажу malware та відладки JNI, коли важливо спостерігати потоки викликів native з моменту запуску процесу, але root або system-wide hooks недоступні.
---
### Останні вразливості, які варто шукати в APK
| Рік | CVE | Вразлива бібліотека | Примітки |
| Рік | CVE | Уражена бібліотека | Примітки |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Переповнення буфера купи, доступне з рідного коду, що декодує зображення WebP. Кілька Android додатків містять вразливі версії. Коли ви бачите `libwebp.so` всередині APK, перевірте його версію та спробуйте експлуатацію або патчування.| citeturn2search0|
|2024|Кілька|Серія OpenSSL 3.x|Кілька проблем з безпекою пам'яті та padding-oracle. Багато пакетів Flutter та ReactNative постачають свої власні `libcrypto.so`.|
|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`.|
Коли ви помічаєте *третіх сторін* `.so` файли всередині APK, завжди перевіряйте їх хеш проти upstream advisory. SCA (Аналіз складу програмного забезпечення) є рідкісним на мобільних пристроях, тому застарілі вразливі збірки поширені.
Коли ви помічаєте *third-party* `.so` файли всередині APK, завжди перевіряйте їхній хеш порівняно з upstream advisories. SCA (Software Composition Analysis) на мобільних рідко використовується, тому застарілі вразливі збірки поширені.
---
### Тенденції анти-реверсії та зміцнення (Android 13-15)
### Тенденції Anti-Reversing та Hardening (Android 13-15)
* **Аутентифікація вказівників (PAC) та ідентифікація цілей гілок (BTI):** Android 14 активує PAC/BTI в системних бібліотеках на підтримуваних ARMv8.3+ чіпах. Декомпілери тепер відображають псевдо-інструкції, пов'язані з PAC; для динамічного аналізу Frida інжектує trampolines *після* видалення PAC, але ваші власні trampolines повинні викликати `pacda`/`autibsp`, де це необхідно.
* **MTE та Scudo зміцнений аллокатор:** тегування пам'яті є опційним, але багато додатків, що враховують Play-Integrity, будуються з `-fsanitize=memtag`; використовуйте `setprop arm64.memtag.dump 1` плюс `adb shell am start ...` для захоплення помилок тегів.
* **LLVM Obfuscator (непрозорі предикати, сплющення контролю потоку):** комерційні пакувальники (наприклад, Bangcle, SecNeo) все більше захищають *рідний* код, а не тільки Java; очікуйте фальшивий контроль потоку та зашифровані рядкові об'єкти в `.rodata`.
* **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`.
---
### Ресурси
- **Вивчення ARM Assembly:** [Azeria Labs Основи ARM Assembly](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **Документація JNI та NDK:** [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/)
- **Налагодження рідних бібліотек:** [Налагодження рідних бібліотек Android за допомогою JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
- **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)
### Посилання
- Журнал змін Frida 16.x (Android hooking, переміщення tiny-function) [frida.re/news](https://frida.re/news/) citeturn5search0
- Консультація NVD для переповнення `libwebp` CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
- 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)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,56 +1,57 @@
# Smali - Декомпіляція/\[Модифікація]/Компіліяція
# Smali - Decompiling/[Modifying]/Compiling
{{#include ../../banners/hacktricks-training.md}}
Іноді цікаво модифікувати код програми, щоб отримати доступ до прихованої інформації (можливо, добре обфусцировані паролі або прапори). Тоді може бути цікаво декомпілювати apk, модифікувати код і знову скомпілювати його.
**Справочний посібник з опкодів:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
Іноді буває корисно змінити код застосунку, щоб отримати приховану інформацію (наприклад добре обфусковані паролі або flags). Тоді може бути цікаво декомпілювати apk, змінити код і скомпілювати його знову.
## Швидкий спосіб
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
Використовуючи **Visual Studio Code** та розширення [APKLab](https://github.com/APKLab/APKLab), ви можете **автоматично декомпілювати**, модифікувати, **скомпілювати**, підписати та встановити програму без виконання будь-якої команди.
## Fast Way
Ще один **скрипт**, який значно полегшує це завдання, - [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
Використовуючи **Visual Studio Code** та розширення [APKLab](https://github.com/APKLab/APKLab), ви можете **автоматично декомпілювати**, змінити, **скомпілювати**, підписати та встановити застосунок без виконання будь-яких команд.
## Декомпіляція APK
Ще один **скрипт**, який значно полегшує це завдання, — [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
Використовуючи APKTool, ви можете отримати доступ до **smali коду та ресурсів**:
## Decompile the APK
За допомогою APKTool ви можете отримати доступ до **smali code and resources**:
```bash
apktool d APP.apk
```
Якщо **apktool** видає будь-яку помилку, спробуйте [встановити **остання версія**](https://ibotpeaches.github.io/Apktool/install/)
Якщо **apktool** видає будь-яку помилку, спробуйте[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
Деякі **цікаві файли, на які варто звернути увагу**:
Деякі **цікаві файли, які варто переглянути**:
- _res/values/strings.xml_ (та всі xml всередині res/values/\*)
- _res/values/strings.xml_ (і всі xml-файли всередині res/values/*)
- _AndroidManifest.xml_
- Будь-який файл з розширенням _.sqlite_ або _.db_
Якщо `apktool` має **проблеми з декодуванням програми**, ознайомтеся з [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) або спробуйте використати аргумент **`-r`** (Не декодувати ресурси). Тоді, якщо проблема була в ресурсі, а не в вихідному коді, ви не матимете проблеми (також не буде декомпільовано ресурси).
Якщо `apktool` має **проблеми з декодуванням застосунку** перегляньте [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) або спробуйте використати аргумент **`-r`** (не декодувати ресурси). Якщо проблема була в ресурсі, а не в коді джерела, проблема зникне (ви також не декомпілюєте ресурси).
## Зміна коду smali
## Змінити smali код
Ви можете **змінювати** **інструкції**, змінювати **значення** деяких змінних або **додавати** нові інструкції. Я змінюю код Smali, використовуючи [**VS Code**](https://code.visualstudio.com), ви потім встановлюєте **розширення smalise**, і редактор скаже вам, якщо будь-яка **інструкція є некоректною**.\
Ви можете **змінювати** **інструкції**, змінювати **значення** деяких змінних або **додавати** нові інструкції. Я змінюю Smali-код за допомогою [**VS Code**](https://code.visualstudio.com), після чого встановіть **smalise extension** і редактор підкаже, якщо якась **інструкція некоректна**.\
Деякі **приклади** можна знайти тут:
- [Приклади змін Smali](smali-changes.md)
- [Smali changes examples](smali-changes.md)
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
Або ви можете [**перевірити нижче деякі пояснені зміни Smali**](smali-changes.md#modifying-smali).
Або ви можете [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
## Перекомпіляція APK
## Перекомпілювати 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** видає **помилку**, спробуйте [встановити **останню версію**](https://ibotpeaches.github.io/Apktool/install/)
### **Підпишіть новий APK**
### **Підписати новий APK**
Потім вам потрібно **згенерувати ключ** (вас попросять ввести пароль та деяку інформацію, яку ви можете заповнити випадковим чином):
Потім потрібно **згенерувати ключ** (у вас попросять пароль та деяку інформацію, яку можна заповнити довільно):
```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
```
@ -60,20 +61,20 @@ jarsigner -keystore key.jks path/to/dist/* <your-alias>
```
### Оптимізувати новий додаток
**zipalign** - це інструмент вирівнювання архівів, який забезпечує важливу оптимізацію для файлів Android додатків (APK). [More information here](https://developer.android.com/studio/command-line/zipalign).
**zipalign** інструмент вирівнювання архівів, який забезпечує важливу оптимізацію для Android application (APK) files. [Детальніше](https://developer.android.com/studio/command-line/zipalign).
```bash
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk
```
### **Підпишіть новий APK (знову?)**
### **Підписати новий APK (знову?)**
Якщо ви **надаєте перевагу** використовувати [**apksigner**](https://developer.android.com/studio/command-line/) замість jarsigner, **вам слід підписати apk** після застосування **оптимізації з** zipalign. АЛЕ ЗВЕРНІТЬ УВАГУ, ЩО ВИ МАЄТЕ **ПІДПИСАТИ ЗАСТОСУВАННЯ ОДИН РАЗ** З jarsigner (перед zipalign) АБО З aspsigner (після zipalign).
Якщо ви **надаєте перевагу** використовувати [**apksigner**](https://developer.android.com/studio/command-line/) замість jarsigner, **ви повинні підписати apk** після застосування **оптимізації за допомогою** zipaling. ПРОТЕ ЗВЕРНІТЬ УВАГУ, ЩО ПОТРІБНО **ПІДПИСАТИ ДОДАТОК ЛИШЕ ОДИН РАЗ** за допомогою jarsigner (перед zipalign) АБО за допомогою aspsigner (після zipaling).
```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk
```
## Зміна Smali
Для наступного коду Hello World на Java:
Для наступного Java-коду Hello World:
```java
public static void printHelloWorld() {
System.out.println("Hello World")
@ -91,11 +92,11 @@ return-void
```
Набір інструкцій Smali доступний [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
### Легкі зміни
### Невеликі зміни
### Змінити початкові значення змінної всередині функції
Деякі змінні визначені на початку функції за допомогою опкоду _const_, ви можете змінити їх значення або визначити нові:
Деякі змінні визначаються на початку функції за допомогою опкоду _const_, ви можете змінити їхні значення, або можете визначити нові:
```bash
#Number
const v9, 0xf4240
@ -139,17 +140,17 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
```
Рекомендації:
- Якщо ви збираєтеся використовувати оголошені змінні всередині функції (оголошені v0,v1,v2...) помістіть ці рядки між _.local \<number>_ та оголошеннями змінних (_const v0, 0x1_)
- Якщо ви хочете вставити код логування в середині коду функції:
- Додайте 2 до кількості оголошених змінних: Наприклад: з _.locals 10_ до _.locals 12_
- Нові змінні повинні бути наступними номерами вже оголошених змінних (в цьому прикладі повинні бути _v10_ та _v11_, пам'ятайте, що починається з v0).
- Змініть код функції логування і використовуйте _v10_ та _v11_ замість _v5_ та _v1_.
- Якщо ви збираєтеся використовувати оголошені змінні всередині функції (declared v0,v1,v2...) розмістіть ці рядки між _.local <number>_ і деклараціями змінних (_const v0, 0x1_)
- Якщо ви хочете вставити logging code посеред коду функції:
- Додайте 2 до кількості оголошених змінних: Ex: from _.locals 10_ to _.locals 12_
- Нові змінні повинні бути наступними номерами від вже оголошених змінних (в цьому прикладі це повинні бути _v10_ та _v11_, пам'ятайте, що нумерація починається з v0).
- Змініть код logging function та використовуйте _v10_ і _v11_ замість _v5_ і _v1_.
### Toasting
Не забудьте додати 3 до кількості _.locals_ на початку функції.
Пам'ятайте додати 3 до числа _.locals_ на початку функції.
Цей код підготовлений для вставки в **середину функції** (**змініть** номер **змінних** за необхідності). Він візьме **значення this.o**, **перетворить** його в **String** і потім **зробить** **toast** з його значенням.
This code is prepared to be inserted in the **середину функції** (**змініть** число **змінних** за потреби). Він візьме **значення this.o**, **перетворить** його на **String** і потім **зробить** **toast** з його значення.
```bash
const/4 v10, 0x1
const/4 v11, 0x1
@ -161,4 +162,38 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
move-result-object v12
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>):
```smali
.class public Lcom/example/App;
.super Landroid/app/Application;
.method static constructor <clinit>()V
.registers 1
const-string v0, "sotap" # library name without lib...so prefix
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
return-void
.end method
```
Альтернативно, помістіть ті самі дві інструкції на початку вашого Application.onCreate(), щоб гарантувати, що бібліотека завантажується якомога раніше:
```smali
.method public onCreate()V
.locals 1
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
invoke-super {p0}, Landroid/app/Application;->onCreate()V
return-void
.end method
```
Примітки:
- Переконайтеся, що правильний ABI-варіант бібліотеки існує під lib/<abi>/ (наприклад, arm64-v8a/armeabi-v7a), щоб уникнути UnsatisfiedLinkError.
- Раннє завантаження (class static initializer) гарантує, що native logger зможе спостерігати подальшу активність JNI.
## Посилання
- SoTap: Легкий in-app JNI (.so) логер поведінки [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
{{#include ../../banners/hacktricks-training.md}}