下载处理过的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吧