#hook #android #bindings #dobby #function-hooking

bin+lib dobby-wrapper

Rust绑定库,用于使用Dobby进行轻量级多平台函数hook,专注于Android平台

4 releases

new 0.2.0 Apr 19, 2025
0.1.2 Apr 18, 2025
0.1.1 Apr 18, 2025
0.1.0 Apr 18, 2025

#78 in #hook

Download history

118 downloads per month

Apache-2.0

1.5MB
170 lines

Contains (ELF lib, 250KB) libs/arm64-v8a/libdobby.so, (static library, 245KB) libs/arm64-v8a/libdobby.a, (static library, 200KB) libs/armeabi-v7a/libdobby.a, (static library, 200KB) libs/x86/libdobby.a, (static library, 200KB) libs/x86_64/libdobby.a, (ELF lib, 105KB) libs/armeabi-v7a/libdobby.so and 2 more.

Dobby Rust Wrapper

Crate Documentation License

这是一个 Dobby 库的 Rust 绑定,用于轻量级、多平台、多架构的函数 hook 操作,专为 Android 平台设计。

安装

将依赖添加到您的Cargo.toml文件中:

[dependencies]
dobby-wrapper = "0.1.0"

注意: 此库依赖于Dobby库,需要正确配置Android NDK和库文件才能工作。

功能特性

  • 通过 CXX 实现的 Rust 风格绑定
  • 为常用操作提供安全的包装器
  • 支持访问底层 API
  • 支持 Dobby 支持的所有架构

交叉编译支持

该库设计为在 macOS 或其他平台上交叉编译至 Android 目标平台。支持以下 Android 架构:

  • armeabi-v7a (32位 ARM)
  • arm64-v8a (64位 ARM)
  • x86 (32位 x86)
  • x86_64 (64位 x86)

项目结构

dobby-wrapper/
├── include/                  # Dobby 头文件目录
├── libs/                     # 不同架构的预编译库文件
│   ├── x86/                  # x86 架构的库文件
│   ├── x86_64/               # x86_64 架构的库文件
│   ├── armeabi-v7a/          # 32位 ARM 库文件
│   └── arm64-v8a/            # 64位 ARM 库文件
├── .cargo/                   # Cargo 配置文件
│   └── config.toml           # Android 交叉编译配置
└── src/                      # Rust 源码
    ├── lib.rs                # 主要的 Rust 绑定
    └── main.rs               # 示例代码

使用方法

1. 准备 Dobby 库文件

您需要从 https://github.com/kreedzZhao/Dobby 获取并编译 Dobby 库。

编译完成后,将生成的库文件(静态库或动态库)放入相应架构的目录:

  • libs/x86/ - 32位 x86 库
  • libs/x86_64/ - 64位 x86 库
  • libs/armeabi-v7a/ - 32位 ARM 库
  • libs/arm64-v8a/ - 64位 ARM 库

本项目目前使用静态库(.a文件)进行链接。

2. 配置 Android NDK

首先,确保您已安装Android NDK。通常通过Android Studio或直接下载。设置NDK路径:

编辑 .cargo/config.toml 文件,更新您的NDK路径:

[target.aarch64-linux-android]
linker = "/path/to/your/ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang"
ar = "/path/to/your/ndk/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar"
rustflags = ["-C", "link-arg=-Wl,--allow-multiple-definition"]

# 其他目标架构类似...

3. 交叉编译到 Android

设置 Rust 工具链支持 Android 目标平台:

rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
rustup target add i686-linux-android
rustup target add x86_64-linux-android

使用提供的脚本一键编译所有架构:

./build-android.sh

或者分别编译各个架构:

cargo build --target aarch64-linux-android     # 针对 arm64-v8a
cargo build --target armv7-linux-androideabi   # 针对 armeabi-v7a
cargo build --target i686-linux-android        # 针对 x86
cargo build --target x86_64-linux-android      # 针对 x86_64

编译结果在 target/<平台>/debug/ 目录或使用脚本时在 release/ 目录。

4. 在 Android 项目中使用

在 Android 项目中使用这个绑定,您需要将编译好的 Rust 库和 Dobby 库一起打包到您的 Android 应用中。

在您的 Rust 项目中添加以下依赖:

[dependencies]
dobby-wrapper = { path = "path/to/dobby-wrapper" }

API 文档

基本用法

use dobby_wrapper;
use std::os::raw::c_void;

// 获取 Dobby 版本
let version = dobby_wrapper::get_version();

// 符号解析
unsafe {
    let address = dobby_wrapper::symbol_resolver("libc.so", "printf");
    if !address.is_null() {
        // 使用解析到的地址进行操作
    }
}

// 函数 Hook
unsafe {
    extern "C" fn my_replacement_func() {
        println!("函数被拦截!");
    }
    
    let address: *mut c_void = /* 要 hook 的函数地址 */;
    let mut original: *mut c_void = std::ptr::null_mut();
    
    let result = dobby_wrapper::hook(
        address,
        my_replacement_func as *mut c_void,
        &mut original as *mut *mut c_void
    );
    
    if result == 0 {
        println!("Hook 成功");
    }
}

故障排除

如果遇到链接问题,检查以下几点:

  1. 确保 NDK 路径正确且 NDK 版本兼容
  2. 检查 .cargo/config.toml 中的链接器路径是否正确
  3. 验证 libs/ 目录下有正确的库文件

许可证

本 Rust 绑定使用与 Dobby 相同的 Apache-2.0 许可证。

No runtime deps

~0–1.2MB
~13K SLoC