Dobby使用 密级: 【C-1】 | 时间:2024-01-02 | 目录:编程开发 | 编辑本文 文章距今已发表三个月,请自行判断文中技术方法、代码的有效性:) ## 安装 ![](https://img.meituan.net/imgupload/7e424e745f32552feb01fb15d7bd1c5d22878.png) ![](https://img.meituan.net/imgupload/4b35b21844d047d0b9907ce066c08bb64838.png) ## 简单Hook ``` //指向原函数地址 方法名追加*oragin static jstring (*orgin_Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI)(JNIEnv* env,jobject /* this */); // 代替的方法 extern "C" JNIEXPORT jstring JNICALL new_Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "我被hook修改了"; return env->NewStringUTF(hello.c_str()); } __attribute__((constructor)) static void ctor() { // 构造函数 静态插入hook调用 // 原函数名 // 新函数地址 // 旧函数地址 DobbyHook((void *) DobbySymbolResolver(NULL, "Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI"), (void *) new_Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI,(void **) &orgin_Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI); } ``` 在使用Dobby Hook之前,你需要定义一个指向原函数地址的函数指针,这样在hook函数中才能调用原函数。这里的方法名后加上origin_前缀,以区分原始函数和替代函数。 DobbyHook使用DobbySymbolResolver,找到函数符号名后,第一个入参代表需要将函数转发到的新函数处理。第二个为原始函数指针。构造函数(在这里使用__attribute__((constructor)))会在加载共享库时自动执行。在构造函数中,你调用DobbyHook来设置hook。 ## 详解 DobbySymbolResolver(NULL, "Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI"): 这个函数用于解析原始JNI函数的地址。NULL表示在当前进程的符号表中查找。 new_Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI: 这是你编写的替代函数的地址。 &origin_Java_com_example_a2023110803_common_NativeFunctionUtils_stringFromJNI: 这是指向原函数指针的地址,Dobby会将原始函数的地址存储在这里,以便在替代函数中调用。 评论列表 写评论 您的IP:3.143.22.19,临时用户名:baf4e71a评论已接入DepyWAF审计与流量系统,请勿频繁操作导致IP拉黑 提交评论 © 版权声明:非标注『转载』情况下本文为原创文章,版权归 Depy's docs 所有,转载请联系博主获得授权。