Reversing Native Libraries
Reading time: 7 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Для додаткової інформації див.: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html
Android-додатки можуть використовувати native libraries, зазвичай написані на C або C++, для задач, критичних до продуктивності. Зловмисники також зловживають цими бібліотеками, оскільки ELF shared objects все ще важче декомпілювати, ніж DEX/OAT byte-code.
Ця сторінка зосереджена на практичних робочих процесах і останніх покращеннях інструментів (2023–2025), які полегшують reversing Android .so
файлів.
Швидкий робочий процес триажу для щойно витягнутого libfoo.so
- Витягніть бібліотеку
# From an installed application
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Or from the APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
- Визначте архітектуру та захисти
file libfoo.so # arm64 or arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so # (peda/pwntools)
- Перелічіть експортовані символи та JNI-прив'язки
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
- Завантажте в декомпілятор (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) і запустіть автоаналіз. Новіші версії Ghidra представили AArch64 decompiler, який розпізнає PAC/BTI stubs і MTE теги, що значно покращує аналіз бібліотек, зібраних з Android 14 NDK.
- Визначтеся зі static vs dynamic reversing: stripped, obfuscated code often needs instrumentation (Frida, ptrace/gdbserver, LLDB).
Dynamic Instrumentation (Frida ≥ 16)
Frida’s 16-series brought several Android-specific improvements that help when the target uses modern Clang/LLD optimisations:
thumb-relocator
can now hook tiny ARM/Thumb functions generated by LLD’s aggressive alignment (--icf=all
).- Enumerating and rebinding ELF import slots works on Android, enabling per-module
dlopen()
/dlsym()
patching when inline hooks are rejected. - Java hooking was fixed for the new ART quick-entrypoint used when apps are compiled with
--enable-optimizations
on Android 14.
Приклад: перелік усіх функцій, зареєстрованих через RegisterNatives
, та вивід їхніх адрес під час виконання:
Java.perform(function () {
var Runtime = Java.use('java.lang.Runtime');
var register = Module.findExportByName(null, 'RegisterNatives');
Interceptor.attach(register, {
onEnter(args) {
var envPtr = args[0];
var clazz = Java.cast(args[1], Java.use('java.lang.Class'));
var methods = args[2];
var count = args[3].toInt32();
console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' methods');
// iterate & dump (JNI nativeMethod struct: name, sig, fnPtr)
}
});
});
Frida працюватиме без додаткових налаштувань на пристроях з PAC/BTI (Pixel 8/Android 14+), якщо ви використовуєте frida-server 16.2 або новіший — ранні версії не могли знайти padding for inline hooks.
Локальна процесна JNI-телеметрія через попередньо завантажений .so (SoTap)
Коли повнофункціональна інструментація надмірна або заблокована, можна отримати видимість на рівні native, попередньо завантаживши невеликий логер всередину цільового процесу. SoTap — легка Android native (.so) бібліотека, яка логує runtime-поведінку інших JNI (.so) бібліотек у тому ж процесі додатка (root не потрібен).
Ключові властивості:
- Ініціалізується рано та спостерігає JNI/native взаємодії всередині процесу, який його завантажив.
- Зберігає логи у кількох доступних шляхах з плавним відкатом на Logcat, коли збереження даних обмежено.
- Налаштовується в коді: відредагуйте sotap.c, щоб розширити/відрегулювати, що логуватиметься, і перебудуйте для потрібного ABI.
Setup (repack the APK):
- 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)
- 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:
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
- Rebuild/sign/install, run the app, then collect logs.
Шляхи для логів (перевіряються в порядку):
/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 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 triage та JNI-дебагу, коли критично важливо спостерігати потоки викликів native з початку процесу, але root/системно-широкі hooks недоступні.
Див. також: виконання native-коду в пам'яті через JNI
Поширений вектор атаки — завантажити raw shellcode blob під час виконання та виконати його безпосередньо з пам'яті через JNI-міст (без on‑disk ELF). Деталі та готовий до використання JNI snippet тут:
In Memory Jni Shellcode Execution
Останні вразливості, які варто шукати в APK
Рік | CVE | Уражена бібліотека | Примітки |
---|---|---|---|
2023 | CVE-2023-4863 | libwebp ≤ 1.3.1 | Heap buffer overflow reachable from native code that decodes WebP images. Several Android apps bundle vulnerable versions. When you see a libwebp.so inside an APK, check its version and attempt exploitation or patching. |
2024 | Multiple | OpenSSL 3.x series | Several memory-safety and padding-oracle issues. Many Flutter & ReactNative bundles ship their own libcrypto.so . |
Коли ви помічаєте third-party .so
файли в APK, завжди перевіряйте їх хеш проти upstream advisories. SCA (Software Composition Analysis) рідко застосовується на мобільних платформах, тож застарілі вразливі збірки поширені.
Тенденції Anti-Reversing та Hardening (Android 13-15)
- Pointer Authentication (PAC) & Branch Target Identification (BTI): Android 14 вмикає PAC/BTI в системних бібліотеках на підтримуваних чіпах ARMv8.3+. Декомпілятори тепер відображають PAC‑пов'язані псевдо-інструкції; для динамічного аналізу Frida інжектить trampolines після видалення PAC, але ваші кастомні trampolines повинні викликати
pacda
/autibsp
, де це необхідно. - MTE & Scudo hardened allocator: memory-tagging є опційним, але багато Play-Integrity-aware apps збираються з
-fsanitize=memtag
; використовуйтеsetprop arm64.memtag.dump 1
разом ізadb shell am start ...
щоб зафіксувати tag faults. - LLVM Obfuscator (opaque predicates, control-flow flattening): комерційні packers (e.g., Bangcle, SecNeo) все частіше захищають native код, не лише Java; очікуйте фальшивий control-flow та зашифровані string blobs у
.rodata
.
Ресурси
- Вивчення ARM Assembly: Azeria Labs – ARM Assembly Basics
- Документація JNI & NDK: Oracle JNI Spec · Android JNI Tips · NDK Guides
- Debugging Native Libraries: Debug Android Native Libraries Using JEB Decompiler
Посилання
- Frida 16.x запис змін (Android hooking, tiny-function relocation) – frida.re/news
- Повідомлення NVD щодо
libwebp
overflow CVE-2023-4863 – nvd.nist.gov - SoTap: Легкий in-app JNI (.so) behavior logger – github.com/RezaArbabBot/SoTap
- Релізи SoTap – github.com/RezaArbabBot/SoTap/releases
- Як працювати з SoTap? – t.me/ForYouTillEnd/13
- CoRPhone — JNI memory-only execution pattern and packaging
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.