0

查了一下Cydia Substrate的主页,作者提供的Android Jni Hook例子其实是用C代码hook了一个Java方法。

但我想要的是挂钩一个 C/C++ 方法,即 Android 中 libXXX.so 中的一个方法。就像 /system/lib/libc.so 中的 fork() 方法一样。Cydia 作者和 XDA 提供的信息似乎表明 Cydia 可以做到这一点。我在互联网上搜索了所有内容,但找不到示例。

谁能告诉我如何使用 Cydia 在 Android 中挂钩 C/C++ 方法?

4

1 回答 1

0

不太确定把它放在哪里,因为它不完全是一个答案,但也许它会让你朝着正确的方向前进。这是一些 shim/hooks 的代码fork(),用 C 语言编写。在这种情况下,它是为了检测沙盒程序是否分叉超过两次而编写的,但显然您可以根据需要修改行为。

#define MAKE_CALLTHROUGH(fx, libfx)                                            \
    do{                                                                        \
        void *handle = NULL;                                                   \
        if(!libfx){                                                            \
            handle = dlopen("/lib64/libc.so.6", RTLD_LAZY);                    \
            if(!handle){                                                       \
                fputs(dlerror(), stderr);                                      \
                exit(1);                                                       \
                return 0;                                                      \
            }                                                                  \
            libfx = dlsym(handle, fx);                                         \
            if(dlerror() != NULL){                                             \
                fprintf(stderr, "Could not make handle for function %s\n", fx);\
                exit(1);                                                       \
            }                                                                  \
        }                                                                      \
    }while(0);

const int MAX_FORKS = 2;
int forks = 0;

int fork(){
    static int (*libfork) (void) = NULL;
    MAKE_CALLTHROUGH("fork", libfork);
    if(forks++ > 2){
        fprintf(stderr, "Illegally exceeded 2 forks.\n");
        killpg(0, 9);
    }
    return libfork();
}

如果有人好奇,我将其编译如下:

gcc -g -Wall -Wextra -fPIC -c watchshim.c -o watchshim.o
gcc -g -Wall -Wextra -fPIC -shared -ldl watchshim.o -o watchshim.so 

gcc -g -Wall -Wextra -pthread -o watch watch.c 

watchshim.c包含 shim/hook 代码的文件在哪里,并且watch.c是填充的进程fork()(它也在 . 的所有子进程中填充watch. "/lib64/libc.so.6"so包含原始fork(). 我MAKE_CALLTHROUGH写成一个宏,因为我正在填充多个函数我用这个的项目。

于 2014-12-10T10:35:44.923 回答