编译Linux x86_64 DobbyHook动态库

下载处理过的dobby源码
https://pan.xuebuhui.cn/d/linux-lib/x86_64/Dobby.zip
进入源码目录

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DDOBBY_GENERATE_SHARED=ON -DCMAKE_CXX_FLAGS="-fPIC"
cmake --build . --config Release

下载已经编译好的动态库
dobby | 盘不会

头文件在源码include文件夹中

静态库使用教程(从Android项目复制的,未经测试)
静态库丢到CMakeLists.txt所在目录的lib文件夹中,没有就创建
头文件丢到CMakeLists.txt所在目录的include文件夹中,没有就创建
CMakeLists.txt中加入

set(dobby_path "${CMAKE_CURRENT_SOURCE_DIR}/lib/libdobby.a")
add_library(dobby STATIC IMPORTED)
set_target_properties(dobby PROPERTIES IMPORTED_LOCATION ${dobby_path})

target_link_libraries(${PROJECT_NAME} INTERFACE
    dobby
)

target_include_directories(${PROJECT_NAME} INTERFACE
    "${CMAKE_CURRENT_SOURCE_DIR}/include")

理想中的情况,结合理论分析最有可能的做法,暂未测试

#include <cstdio>
#include <cstring>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <dlfcn.h>
#include <android/log.h>

#define LOG_TAG "MemoryHook"

// 原始的 fread 函数指针
typedef size_t (*fread_t)(void *ptr, size_t size, size_t count, FILE *stream);
fread_t original_fread = nullptr;

// Hook 的 fread 函数
size_t hook_fread(void *ptr, size_t size, size_t count, FILE *stream) {
    __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "Hooked fread: %p", stream);
    // 调用原始的 fread 函数
    return original_fread(ptr, size, count, stream);
}

int main() {
    pid_t target_pid = 12345;  // 替换为目标进程的 PID
    
    // 附加到目标进程
    if (ptrace(PTRACE_ATTACH, target_pid, nullptr, nullptr) == -1) {
        perror("ptrace attach");
        return -1;
    }
    waitpid(target_pid, nullptr, 0);  // 等待目标进程暂停

    // 获取目标进程的 libc.so 路径
    char libc_path[] = "/system/lib/libc.so"; // 假设路径是这个

    // 使用 ptrace 在目标进程中直接加载 libc.so
    void* libc_handle = dlopen(libc_path, RTLD_LAZY);  // 加载 libc.so
    if (!libc_handle) {
        perror("dlopen failed");
        ptrace(PTRACE_DETACH, target_pid, nullptr, nullptr);
        return -1;
    }

    // 获取 fread 函数地址
    original_fread = (fread_t)dlsym(libc_handle, "fread");  // 获取 fread 地址
    if (!original_fread) {
        perror("dlsym failed");
        ptrace(PTRACE_DETACH, target_pid, nullptr, nullptr);
        return -1;
    }

    printf("fread address: %p\n", original_fread);

    // Hook fread
    int result = memory::hook::hook_function((void*)original_fread, (dobby_dummy_func_t)hook_fread, nullptr);
    if (result != 0) {
        printf("Failed to hook fread.\n");
        ptrace(PTRACE_DETACH, target_pid, nullptr, nullptr);
        return -1;
    }

    printf("Successfully hooked fread.\n");

    // 恢复目标进程并继续运行
    ptrace(PTRACE_DETACH, target_pid, nullptr, nullptr);
    return 0;
}

Android逆向-基础与实践 (七)-ptrace注入_ptraceinject-CSDN博客
在Linux上的ptrace学习和代码注入 - An2i - 博客园
翻到这个博客,发现大体和我的思路差不多,但是对其中的寄存器操作不理解。上面的代码只是思路,实际上要搞寄存器这种东西,真是草了

完整视频教程,教学了linux下如何用ptrace将我们的so库(这个so库包含hook目标进程的linux层的各种函数和方法)注入到目标进程
看了以后,发现这几个博客和视频都是想将so注入到目标进程然后运行,分为注入so和hook so,和我们的目的其实有点不太一样,不过打开so执行函数的时候如果能传参,其实也没问题。

老实用frida吧