O-Isaac/dynswap
GitHub: O-Isaac/dynswap
一个用于 Android 共享库动态热交换的轻量模块,专为 native 层 hook 和插桩设计。
Stars: 0 | Forks: 0
# Dynswap - 动态库交换模块
`Dynswap` 是一个用于在 Android 上执行共享库动态热交换的模块,专为 hook 和插桩项目而设计。
## 行为特性
- 仅使用配置的交换路径 (`dynswap::config::swap_lib_path()`)。
- 如果交换文件不存在,它将跳过交换并继续正常流程。
- 通过 `DSWAP_ACTIVE=1` 防止递归重载循环。
- 加载后**不**删除交换库文件。
- 将原始 `libil2cpp.so` 路径存储在 `LIB_ORIG_PATH` 中。
## 默认配置
- 交换路径: `/data/local/tmp/libnativebridge.so`
- 原始路径环境变量: `LIB_ORIG_PATH`
- 激活保护环境变量: `DSWAP_ACTIVE`
在 `src/lib/dynswap/src/config.cpp` 中配置。
## 使用 FetchContent 安装
```
include(FetchContent)
FetchContent_Declare(
dynswap
GIT_REPOSITORY
GIT_TAG
)
FetchContent_MakeAvailable(dynswap)
target_sources(YourTarget PRIVATE
${dynswap_SOURCE_DIR}/src/lib/dynswap/src/dynswap.cpp
${dynswap_SOURCE_DIR}/src/lib/dynswap/src/loader.cpp
${dynswap_SOURCE_DIR}/src/lib/dynswap/src/config.cpp
${dynswap_SOURCE_DIR}/src/lib/dynswap/src/env.cpp
)
target_include_directories(YourTarget PRIVATE
${dynswap_SOURCE_DIR}/src/lib/dynswap/include
)
target_link_libraries(YourTarget
log
android
)
```
## 最简用法
```
#include
#include
#include
#include
extern "C" jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
Dl_info dlInfo{};
if (!dladdr(reinterpret_cast(JNI_OnLoad), &dlInfo))
return JNI_VERSION_1_6;
// 1) If we are inside swap, dynswap already stored original lib path in env.
// 2) If not, fallback to current-dir/libil2cpp.so.
std::string libFullPath = dynswap::get_library_path();
if (libFullPath.empty())
{
std::string currentDir = dirname(dlInfo.dli_fname);
libFullPath = currentDir + "/libil2cpp.so";
}
if (dynswap::try_load(vm, libFullPath.c_str()))
return JNI_VERSION_1_6;
// continue normal init using libFullPath
return JNI_VERSION_1_6;
}
```
## API
- `bool dynswap::try_load(JavaVM *vm, const char *original_lib_path);`
- `bool dynswap::load_original_jni_onload(JavaVM *vm);`
- `std::string dynswap::get_library_path();`
Config 命名空间:
- `const char *dynswap::config::swap_lib_path();`
- `const char *dynswap::config::env_var_name();`
- `const char *dynswap::config::swap_active_env_var_name();`
## 故障排除
- 验证交换文件是否存在于配置的路径中。
- 验证 ABI 是否与目标进程匹配。
- 检查日志中 `DSWAP_ACTIVE` 保护机制的行为。
- 如果你在日志中看到 `/data/local/tmp/libil2cpp.so`,说明你的调用者没有优先使用 `dynswap::get_library_path()`。
标签:Android, Bash脚本, C++, dlopen, DNS 反向解析, DSL, dylib, Hook, Instrumentation, JNI, libil2cpp, Runtime Enforcement, .so注入, Unity逆向, 云资产清单, 共享库注入, 动态加载, 动态库替换, 动态库热更新, 动态链接, 数据擦除, 模块化开发, 热修补, 目录枚举, 移动安全, 进程篡改, 逆向工程