• 安装HookZz 在 Monkey 中安装 HookZz


    HookZz 是一款轻量级的动态二进制插桩(DBI)框架。它可以用来进行应用程序的运行时分析、修改和监控。

    使用 HookZz,需要先编写一个 C 或 C++ 的插件(即 hook,也叫钩子),然后使用 HookZz 提供的 API 注入到目标应用程序中。HookZz 提供了一些常用的 API,用于在目标函数的入口和出口处进行操作,例如获取或修改函数的参数、返回值,以及跳转到自定义的函数实现等。

    以下是 HookZz 的基本使用流程:

    1. 安装 HookZz

    可以从 HookZz 的 GitHub 仓库中下载最新版本的源代码,然后编译生成 libhookzz.so 或 libhookzz.dylib 等动态链接库,用于注入到目标应用程序中。

    1. 编写钩子函数

    在编写钩子函数时,需要根据目标函数的参数和返回值类型,设置正确的函数签名。HookZz 提供了一些宏定义,可以方便地声明钩子函数的参数和返回值类型。例如:

    1. #include
    2. void (*original_function)(int arg1, int arg2);
    3. void my_hook_function(RegState *rs, int arg1, int arg2) {
    4. // 在函数调用前执行的代码
    5. ...
    6. // 调用原始函数
    7. int retval = original_function(arg1, arg2);
    8. // 在函数调用后执行的代码
    9. ...
    10. // 返回原始函数的返回值
    11. rs->general.regs.x[0] = (uint64_t)retval;
    12. }
    13. void my_hook() {
    14. void *original_address = (void *)&original_function;
    15. void *hook_address = (void *)&my_hook_function;
    16. // 设置钩子
    17. HookZzHookFunction(original_address, hook_address, NULL, NULL, 0);
    18. }

    1. 注入到目标应用程序中

    HookZz 提供了一些 API,可以用于在目标进程中加载和注入动态链接库。例如,可以使用 dlopen 函数打开 libhookzz.so,然后使用 dlsym 函数获取钩子函数的地址,最后使用 HookZz 提供的 HookZzWrap 函数将钩子函数注入到目标函数中。

    1. #include
    2. #include
    3. #include
    4. void inject_library(pid_t pid, const char *library_path) {
    5. void *handle = dlopen(library_path, RTLD_NOW);
    6. if (handle == NULL) {
    7. printf("Failed to load library: %s\n", dlerror());
    8. return;
    9. }
    10. void (*hook_function)() = dlsym(handle, "my_hook");
    11. if (hook_function == NULL) {
    12. printf("Failed to find hook function: %s\n", dlerror());
    13. return;
    14. }
    15. // 附加到目标进程
    16. if (ptrace_attach(pid) != 0) {
    17. printf("Failed to attach process %d\n", pid);
    18. return;
    19. }
    20. // 等待进程停止
    21. waitpid(pid, NULL, 0);
    22. // 注入钩子函数
    23. HookZzWrap((void *)hook_function, NULL, NULL, 0);
    24. // 恢复进程运行
    25. ptrace_continue(pid);
    26. // 分离目标进程
    27. ptrace_detach(pid);
    28. }

    1. 运行目标应用程序

    在注入动态链接库后,可以使用目标应用程序的入口点启动它。当目标函数被调用时,HookZz 会自动触发钩子函数,并执行其中的代码。

    以上是 HookZz 的基本使用方法,更详细的 API 和示例代码可以参考 HookZz 的 GitHub 仓库。

    以下是在 Monkey 中安装 HookZz 的步骤:

    1. 首先,您需要在 Monkey 里打开 Terminal。

    2. 在 Terminal 上,输入以下命令来克隆 HookZz 仓库:

    git clone https://github.com/jmpews/HookZz.git
    

    1. 进入 HookZz 目录中:
    cd HookZz
    

    1. 在 HookZz 目录中,输入以下命令将其编译为动态库文件:
    make
    

    1. 接下来,将生成的 libhookzz.dylib 文件复制到 Monkey 的 /usr/lib/ 目录下:
    sudo cp libhookzz.dylib /usr/lib/
    

    1. 最后,在 Monkey 中启动任何应用程序时,您需要使用以下命令来加载 HookZz 动态库:
    DYLD_INSERT_LIBRARIES=/usr/lib/libhookzz.dylib %your_application%
    

    注意,%your_application% 应替换为您要启动的应用程序的名称。

    现在,您已经成功地在 Monkey 中安装了 HookZz,并可以使用它来进行动态函数钩子。

    Monkey 是一款 Android 应用的测试工具,可以模拟各种场景下的操作来测试应用的稳定性和安全性。而 HookZz 是一款 C 语言编写的轻量级 hook 框架,可以用于在 Linux 和 Android 系统中 hook 各种函数。

    在 Monkey 中,HookZz 可以用来 hook syscall,从而反调试绕过。具体实现步骤如下:

    1. 在 Monkey 中加载 HookZz 库,获取 syscall 函数指针。

    2. 定义一个自定义的 tracer 函数,用于跟踪 syscall 的调用。

    3. 使用 HookZz 的 ZzWrap 函数将 tracer 函数包装成一个 hook 函数,将它绑定到 syscall 函数上。

    4. 在 tracer 函数中,通过 ptrace 函数获取当前进程的状态,判断是否被调试。

    5. 如果当前进程被调试,则通过 kill 函数杀死父进程,从而绕过调试。

    6. 如果当前进程没有被调试,则直接调用原来的 syscall 函数执行系统调用操作。

    具体实现可以参考 HookZz 的 GitHub 仓库中的示例代码。值得注意的是,这种方法可以防止简单的调试器检测,但并不能完全防御高级的反调试技术。因此,在实际应用中,还需要采用多种防护手段来提高应用的安全性。

     

  • 相关阅读:
    线程池的使用及ThreadPoolExecutor源码分析
    2.1 CSS 简介特性
    采用jieba库的posseg函数对剩余有效文本数据进行词性分析
    云租赁安全管理制度
    vue使用qrcodejs2生成二维码
    庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O
    【华为机试真题 JAVA】字符串加密-100
    Java项目:SSM学生管理系统
    死锁的发生原因和怎么避免
    记一次断电引起的CentOS引导失败
  • 原文地址:https://blog.csdn.net/qq_21051503/article/details/133042803