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逆向, 云资产清单, 共享库注入, 动态加载, 动态库替换, 动态库热更新, 动态链接, 数据擦除, 模块化开发, 热修补, 目录枚举, 移动安全, 进程篡改, 逆向工程