mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/smali-changes.
This commit is contained in:
parent
fac91cfc2c
commit
495c3534e9
@ -1,12 +1,12 @@
|
|||||||
# Аналіз Шкідливого ПЗ
|
# Malware Analysis
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Чит-листи для Судмедекспертів
|
## Forensics CheatSheets
|
||||||
|
|
||||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||||
|
|
||||||
## Онлайн Сервіси
|
## Онлайн сервіси
|
||||||
|
|
||||||
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||||
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||||
@ -14,7 +14,7 @@
|
|||||||
- [Intezer](https://analyze.intezer.com)
|
- [Intezer](https://analyze.intezer.com)
|
||||||
- [Any.Run](https://any.run/)
|
- [Any.Run](https://any.run/)
|
||||||
|
|
||||||
## Офлайн Антивірусні та Інструменти Виявлення
|
## Офлайн антивірусні та інструменти виявлення
|
||||||
|
|
||||||
### Yara
|
### Yara
|
||||||
|
|
||||||
@ -22,10 +22,10 @@
|
|||||||
```bash
|
```bash
|
||||||
sudo apt-get install -y yara
|
sudo apt-get install -y yara
|
||||||
```
|
```
|
||||||
#### Підготовка правил
|
#### Підготуйте правила
|
||||||
|
|
||||||
Використовуйте цей скрипт для завантаження та об'єднання всіх правил yara для шкідливого ПЗ з github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
Використайте цей скрипт, щоб завантажити та об'єднати всі yara malware rules з github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||||
Створіть директорію _**rules**_ і виконайте його. Це створить файл під назвою _**malware_rules.yar**_, який міститиме всі правила yara для шкідливого ПЗ.
|
Створіть директорію _**rules**_ і виконайте скрипт. Це створить файл _**malware_rules.yar**_, який міститиме всі yara rules для malware.
|
||||||
```bash
|
```bash
|
||||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||||
mkdir rules
|
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 image #Scan 1 file
|
||||||
yara -w malware_rules.yar folder #Scan the whole folder
|
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
|
```bash
|
||||||
python3 yarGen.py --update
|
python3 yarGen.py --update
|
||||||
python3.exe yarGen.py --excludegood -m ../../mals/
|
python3.exe yarGen.py --excludegood -m ../../mals/
|
||||||
@ -57,26 +57,26 @@ clamscan folderpath #Scan the whole folder
|
|||||||
```
|
```
|
||||||
### [Capa](https://github.com/mandiant/capa)
|
### [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
|
### IOCs
|
||||||
|
|
||||||
IOC означає Індикатор Компрометації. IOC - це набір **умов, які ідентифікують** деяке потенційно небажане програмне забезпечення або підтверджене **шкідливе ПЗ**. Команди Blue Teams використовують таке визначення, щоб **шукати такі шкідливі файли** у своїх **системах** та **мережах**.\
|
IOC означає Indicator Of Compromise. IOC — це набір **умов, що ідентифікують** деяке потенційно небажане програмне забезпечення або підтверджене **malware**. 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.
|
Обмін цими визначеннями дуже корисний: якщо malware виявлено на комп'ютері і створено IOC для цього malware, інші Blue Teams можуть використати його, щоб швидше ідентифікувати загрозу.
|
||||||
|
|
||||||
Інструмент для створення або модифікації IOCs - це [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
Інструмент для створення або модифікації IOCs — [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||||
Ви можете використовувати такі інструменти, як [**Redline**](https://www.fireeye.com/services/freeware/redline.html), щоб **шукати визначені IOCs на пристрої**.
|
Ви можете використовувати інструменти, такі як [**Redline**](https://www.fireeye.com/services/freeware/redline.html), щоб **шукати визначені IOCs на пристрої**.
|
||||||
|
|
||||||
### Loki
|
### Loki
|
||||||
|
|
||||||
[**Loki**](https://github.com/Neo23x0/Loki) - це сканер для Простих Індикаторів Компрометації.\
|
[**Loki**](https://github.com/Neo23x0/Loki) є сканером для Simple Indicators of Compromise.\
|
||||||
Виявлення базується на чотирьох методах виявлення:
|
Виявлення базується на чотирьох методах детекції:
|
||||||
```
|
```
|
||||||
1. File Name IOC
|
1. File Name IOC
|
||||||
Regex match on full file path/name
|
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
|
||||||
|
|
||||||
[**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
|
||||||
|
|
||||||
Інструменти, такі як [**rkhunter**](http://rkhunter.sourceforge.net), можуть бути використані для перевірки файлової системи на можливі **rootkits** та шкідливе ПЗ.
|
Інструменти на кшталт [**rkhunter**](http://rkhunter.sourceforge.net) можна використовувати для перевірки файлової системи на наявність можливих rootkits і malware.
|
||||||
```bash
|
```bash
|
||||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||||
```
|
```
|
||||||
### FLOSS
|
### FLOSS
|
||||||
|
|
||||||
[**FLOSS**](https://github.com/mandiant/flare-floss) - це інструмент, який намагатиметься знайти обфусцировані рядки всередині виконуваних файлів, використовуючи різні техніки.
|
[**FLOSS**](https://github.com/mandiant/flare-floss) — інструмент, який намагається знайти obfuscated strings всередині виконуваних файлів, використовуючи різні техніки.
|
||||||
|
|
||||||
### PEpper
|
### 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
|
||||||
|
|
||||||
[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)
|
### Detect It Easy(DiE)
|
||||||
|
|
||||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) - це інструмент для виявлення, чи є файл **зашифрованим**, а також для знаходження **пакерів**.
|
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) — інструмент для визначення, чи файл є **encrypted**, а також для виявлення **packers**.
|
||||||
|
|
||||||
### NeoPI
|
### 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**
|
||||||
|
|
||||||
[**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
|
### Apple Binary Signatures
|
||||||
|
|
||||||
При перевірці деякого **зразка шкідливого ПЗ** ви завжди повинні **перевіряти підпис** бінарного файлу, оскільки **розробник**, який його підписав, може бути вже **пов'язаний** зі **шкідливим ПЗ.**
|
Під час перевірки деякого **malware sample** завжди слід **check the signature** бінарного файлу, оскільки **developer**, який його підписав, може вже бути **related** з **malware.**
|
||||||
```bash
|
```bash
|
||||||
#Get signer
|
#Get signer
|
||||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
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
|
```python
|
||||||
import idautils, idc
|
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":
|
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
|
||||||
print(f"[+] Dispatcher found @ {ea:X}")
|
print(f"[+] Dispatcher found @ {ea:X}")
|
||||||
```
|
```
|
||||||
### 2. Витягніть байт-код диспетчера
|
### 2. Витягніть байткод диспетчера
|
||||||
```python
|
```python
|
||||||
import idc
|
import idc
|
||||||
|
|
||||||
@ -183,7 +195,7 @@ size = jmp_ea + idc.get_item_size(jmp_ea) - start
|
|||||||
code = idc.get_bytes(start, size)
|
code = idc.get_bytes(start, size)
|
||||||
open(f"{start:X}.bin", "wb").write(code)
|
open(f"{start:X}.bin", "wb").write(code)
|
||||||
```
|
```
|
||||||
### 3. Емулюйте його двічі з Unicorn
|
### 3. Емулюйте це двічі за допомогою Unicorn
|
||||||
```python
|
```python
|
||||||
from unicorn import *
|
from unicorn import *
|
||||||
from unicorn.x86_const 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))
|
mu.emu_start(BASE, BASE+len(code))
|
||||||
return mu.reg_read(UC_X86_REG_RAX)
|
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
|
```python
|
||||||
import struct, ida_bytes
|
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
|
disp = target - (ea + 5) & 0xFFFFFFFF
|
||||||
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
|
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
|
||||||
```
|
```
|
||||||
Після патчінгу, примусьте IDA повторно проаналізувати функцію, щоб відновити повну CFG та вихід Hex-Rays:
|
Після внесення патчу примусово змусьте IDA повторно проаналізувати функцію, щоб відновити повний CFG і вивід Hex-Rays:
|
||||||
```python
|
```python
|
||||||
import ida_auto, idaapi
|
import ida_auto, idaapi
|
||||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||||
```
|
```
|
||||||
### 5. Позначте непрямі виклики API
|
### 5. Позначте непрямі виклики API
|
||||||
|
|
||||||
Якщо відомо справжнє призначення кожного `call rax`, ви можете повідомити IDA, що це так, щоб типи параметрів і імена змінних відновлювалися автоматично:
|
Коли відоме реальне призначення кожного `call rax`, можна вказати IDA, що це за функція, і типи параметрів та імена змінних відновляться автоматично:
|
||||||
```python
|
```python
|
||||||
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||||
```
|
```
|
||||||
### Практичні переваги
|
### Практичні переваги
|
||||||
|
|
||||||
* Відновлює реальний CFG → декомпіляція переходить з *10* рядків до тисяч.
|
* Відновлює реальний CFG → decompilation переходить з *10* рядків до тисяч.
|
||||||
* Дозволяє перехресне посилання на рядки та xrefs, що робить реконструкцію поведінки тривіальною.
|
* Дозволяє 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/)
|
- [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@ -1,47 +1,50 @@
|
|||||||
# Реверсія нативних бібліотек
|
# Реверсинг нативних бібліотек
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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 байт-код.
|
||||||
|
Ця сторінка зосереджена на *практичних* робочих процесах та *останніх* покращеннях інструментарію (2023–2025), які полегшують реверсинг Android `.so` файлів.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Швидкий робочий процес для свіжовитягнутої `libfoo.so`
|
### Швидкий триаж для щойно витягнутого `libfoo.so`
|
||||||
|
|
||||||
1. **Витягніть бібліотеку**
|
1. **Витягніть бібліотеку**
|
||||||
```bash
|
```bash
|
||||||
# З встановленого додатку
|
# From an installed application
|
||||||
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
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/
|
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
|
||||||
```
|
```
|
||||||
2. **Визначте архітектуру та захисти**
|
2. **Визначте архітектуру та механізми захисту**
|
||||||
```bash
|
```bash
|
||||||
file libfoo.so # arm64 або arm32 / x86
|
file libfoo.so # arm64 or arm32 / x86
|
||||||
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO тощо
|
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
|
||||||
checksec --file libfoo.so # (peda/pwntools)
|
checksec --file libfoo.so # (peda/pwntools)
|
||||||
```
|
```
|
||||||
3. **Перерахуйте експортовані символи та прив'язки JNI**
|
3. **Перелічіть експортовані символи та JNI-зв'язки**
|
||||||
```bash
|
```bash
|
||||||
readelf -s libfoo.so | grep ' Java_' # динамічно зв'язані JNI
|
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
|
||||||
strings libfoo.so | grep -i "RegisterNatives" -n # статично зареєстровані 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.
|
4. **Завантажте в декомпілятор** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) і запустіть автоматичний аналіз.
|
||||||
5. **Визначте, чи використовувати статичне чи динамічне реверсування:** знятий, обфускований код часто потребує *інструментації* (Frida, ptrace/gdbserver, LLDB).
|
Новіші версії 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`).
|
* `thumb-relocator` тепер може hook-увати крихітні ARM/Thumb-функції, згенеровані агресивним вирівнюванням LLD (`--icf=all`).
|
||||||
* Перерахування та повторне зв'язування *ELF імпортних слотів* працює на Android, що дозволяє патчинг `dlopen()`/`dlsym()` для кожного модуля, коли вбудовані хуки відхиляються.
|
* Перелічення та rebinding *ELF import slots* працює на Android, що дозволяє робити патчинг на рівні модулів через `dlopen()`/`dlsym()` коли inline hooks не підходять.
|
||||||
* Хукінг Java був виправлений для нового **ART швидкого входу**, що використовується, коли додатки компілюються з `--enable-optimizations` на Android 14.
|
* Java hooking виправлено для нового **ART quick-entrypoint**, який використовується, коли додатки компілюються з `--enable-optimizations` на Android 14.
|
||||||
|
|
||||||
Приклад: перерахування всіх функцій, зареєстрованих через `RegisterNatives`, і вивантаження їх адрес під час виконання:
|
Приклад: перелічення всіх функцій, зареєстрованих через `RegisterNatives`, і дамп їхніх адрес під час виконання:
|
||||||
```javascript
|
```javascript
|
||||||
Java.perform(function () {
|
Java.perform(function () {
|
||||||
var Runtime = Java.use('java.lang.Runtime');
|
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 або новішу версію – попередні версії не змогли знайти заповнення для вбудованих хуків. citeturn5search2turn5search0
|
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
|
### Останні вразливості, які варто шукати в APK
|
||||||
|
|
||||||
| Рік | CVE | Вразлива бібліотека | Примітки |
|
| Рік | CVE | Уражена бібліотека | Примітки |
|
||||||
|------|-----|------------------|-------|
|
|------|-----|------------------|-------|
|
||||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Переповнення буфера купи, доступне з рідного коду, що декодує зображення WebP. Кілька Android додатків містять вразливі версії. Коли ви бачите `libwebp.so` всередині APK, перевірте його версію та спробуйте експлуатацію або патчування.| citeturn2search0|
|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Переповнення heap-буфера, доступне з native-коду, який декодує WebP-зображення. Декілька Android застосунків включають вразливі версії. Коли ви бачите `libwebp.so` всередині APK, перевірте її версію та спробуйте експлуатацію або патчування.| |
|
||||||
|2024|Кілька|Серія OpenSSL 3.x|Кілька проблем з безпекою пам'яті та padding-oracle. Багато пакетів Flutter та ReactNative постачають свої власні `libcrypto.so`.|
|
|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`, де це необхідно.
|
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 вмикає PAC/BTI у системних бібліотеках на підтримуваному ARMv8.3+ кремнії. Декомпілятори тепер показують PAC‐пов'язані псевдо-інструкції; для динамічного аналізу Frida інжектить trampolines *після* видалення PAC, але ваші власні trampоліни повинні викликати `pacda`/`autibsp` там, де це необхідно.
|
||||||
* **MTE та Scudo зміцнений аллокатор:** тегування пам'яті є опційним, але багато додатків, що враховують Play-Integrity, будуються з `-fsanitize=memtag`; використовуйте `setprop arm64.memtag.dump 1` плюс `adb shell am start ...` для захоплення помилок тегів.
|
* **MTE & Scudo hardened allocator:** memory-tagging необов'язковий, але багато додатків, що враховують Play-Integrity, збираються з `-fsanitize=memtag`; використовуйте `setprop arm64.memtag.dump 1` плюс `adb shell am start ...` щоб зафіксувати tag faults.
|
||||||
* **LLVM Obfuscator (непрозорі предикати, сплющення контролю потоку):** комерційні пакувальники (наприклад, Bangcle, SecNeo) все більше захищають *рідний* код, а не тільки Java; очікуйте фальшивий контроль потоку та зашифровані рядкові об'єкти в `.rodata`.
|
* **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/)
|
- **Learning ARM Assembly:** [Azeria Labs – ARM Assembly Basics](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/)
|
- **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/)
|
||||||
- **Налагодження рідних бібліотек:** [Налагодження рідних бібліотек Android за допомогою JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
- **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/) citeturn5search0
|
- Frida 16.x change-log (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/)
|
||||||
- Консультація NVD для переповнення `libwebp` CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
|
- 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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@ -1,56 +1,57 @@
|
|||||||
# Smali - Декомпіляція/\[Модифікація]/Компіліяція
|
# Smali - Decompiling/[Modifying]/Compiling
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#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
|
```bash
|
||||||
apktool d APP.apk
|
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_
|
- _AndroidManifest.xml_
|
||||||
- Будь-який файл з розширенням _.sqlite_ або _.db_
|
- Будь-який файл з розширенням _.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)
|
- [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
|
```bash
|
||||||
apktool b . #In the folder generated when you decompiled the application
|
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
|
```bash
|
||||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
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
|
```bash
|
||||||
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
||||||
zipalign -v 4 infile.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
|
```bash
|
||||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||||
```
|
```
|
||||||
## Зміна Smali
|
## Зміна Smali
|
||||||
|
|
||||||
Для наступного коду Hello World на Java:
|
Для наступного Java-коду Hello World:
|
||||||
```java
|
```java
|
||||||
public static void printHelloWorld() {
|
public static void printHelloWorld() {
|
||||||
System.out.println("Hello World")
|
System.out.println("Hello World")
|
||||||
@ -91,11 +92,11 @@ return-void
|
|||||||
```
|
```
|
||||||
Набір інструкцій Smali доступний [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
Набір інструкцій Smali доступний [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||||
|
|
||||||
### Легкі зміни
|
### Невеликі зміни
|
||||||
|
|
||||||
### Змінити початкові значення змінної всередині функції
|
### Змінити початкові значення змінної всередині функції
|
||||||
|
|
||||||
Деякі змінні визначені на початку функції за допомогою опкоду _const_, ви можете змінити їх значення або визначити нові:
|
Деякі змінні визначаються на початку функції за допомогою опкоду _const_, ви можете змінити їхні значення, або можете визначити нові:
|
||||||
```bash
|
```bash
|
||||||
#Number
|
#Number
|
||||||
const v9, 0xf4240
|
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_)
|
- Якщо ви збираєтеся використовувати оголошені змінні всередині функції (declared v0,v1,v2...) розмістіть ці рядки між _.local <number>_ і деклараціями змінних (_const v0, 0x1_)
|
||||||
- Якщо ви хочете вставити код логування в середині коду функції:
|
- Якщо ви хочете вставити logging code посеред коду функції:
|
||||||
- Додайте 2 до кількості оголошених змінних: Наприклад: з _.locals 10_ до _.locals 12_
|
- Додайте 2 до кількості оголошених змінних: Ex: from _.locals 10_ to _.locals 12_
|
||||||
- Нові змінні повинні бути наступними номерами вже оголошених змінних (в цьому прикладі повинні бути _v10_ та _v11_, пам'ятайте, що починається з v0).
|
- Нові змінні повинні бути наступними номерами від вже оголошених змінних (в цьому прикладі це повинні бути _v10_ та _v11_, пам'ятайте, що нумерація починається з v0).
|
||||||
- Змініть код функції логування і використовуйте _v10_ та _v11_ замість _v5_ та _v1_.
|
- Змініть код logging function та використовуйте _v10_ і _v11_ замість _v5_ і _v1_.
|
||||||
|
|
||||||
### Toasting
|
### Toasting
|
||||||
|
|
||||||
Не забудьте додати 3 до кількості _.locals_ на початку функції.
|
Пам'ятайте додати 3 до числа _.locals_ на початку функції.
|
||||||
|
|
||||||
Цей код підготовлений для вставки в **середину функції** (**змініть** номер **змінних** за необхідності). Він візьме **значення this.o**, **перетворить** його в **String** і потім **зробить** **toast** з його значенням.
|
This code is prepared to be inserted in the **середину функції** (**змініть** число **змінних** за потреби). Він візьме **значення this.o**, **перетворить** його на **String** і потім **зробить** **toast** з його значення.
|
||||||
```bash
|
```bash
|
||||||
const/4 v10, 0x1
|
const/4 v10, 0x1
|
||||||
const/4 v11, 0x1
|
const/4 v11, 0x1
|
||||||
@ -161,4 +162,38 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
|
|||||||
move-result-object v12
|
move-result-object v12
|
||||||
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user