diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md index e9bfb2506..7cb8af918 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md @@ -1,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(' 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 won’t 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 aren’t 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) diff --git a/src/mobile-pentesting/android-app-pentesting/smali-changes.md b/src/mobile-pentesting/android-app-pentesting/smali-changes.md index 1140c5d47..190e326c7 100644 --- a/src/mobile-pentesting/android-app-pentesting/smali-changes.md +++ b/src/mobile-pentesting/android-app-pentesting/smali-changes.md @@ -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 ``` @@ -61,20 +61,20 @@ jarsigner -keystore key.jks path/to/dist/* ``` ### Оптимізувати новий додаток -**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] 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: " ``` -Рекомендації: +Recommendations: -- Якщо ви збираєтеся використовувати оголошені змінні всередині функції (declared v0,v1,v2...) розмістіть ці рядки між _.local _ і деклараціями змінних (_const v0, 0x1_) -- Якщо ви хочете вставити logging code посеред коду функції: +- Якщо ви збираєтесь використовувати оголошені змінні всередині функції (declared v0,v1,v2...) помістіть ці рядки між _.local _ і деклараціями змінних (_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 для статичного ініціалізатора класу (): +Іноді потрібно попередньо завантажити нативну бібліотеку, щоб вона ініціалізувалася перед іншими JNI libs (наприклад, щоб увімкнути локальну для процесу телеметрію/логування). Ви можете інжектувати виклик System.loadLibrary() у статичний ініціалізатор або на ранньому етапі Application.onCreate(). Приклад smali для статичного ініціалізатора класу (): ```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// (наприклад, arm64-v8a/armeabi-v7a), щоб уникнути UnsatisfiedLinkError. -- Раннє завантаження (class static initializer) гарантує, що native logger зможе спостерігати подальшу активність JNI. +- Переконайтеся, що правильний варіант ABI бібліотеки існує в lib// (наприклад, 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}}