android - 如何使用 Cydia Substrate 在 Android 中 Hook C/C++ 方法

标签 android c hook cydia-substrate

我查看了Cydia Substrate的主页,作者提供的Android Jni Hook示例实际上是用C代码hook一个Java方法。

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

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

最佳答案

不太确定该把它放在哪里,因为它不完全是一个答案,但也许它会让你走向正确的方向。下面是一些用 C 语言编写的 shim/hooks fork() 代码。在本例中,编写它是为了检测沙盒程序是否 fork 两次以上,但您显然可以根据需要修改行为。

#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.cfork()的进程被填充(它也在 watch 的所有子进程中填充。"/lib64/libc.so.6" 是包含以下内容的 so原始的fork()。我将MAKE_CALLTHROUGH编写为宏,因为我在使用它的项目中填充了多个函数。

关于android - 如何使用 Cydia Substrate 在 Android 中 Hook C/C++ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27398180/

相关文章:

drupal - 使用主题函数在 body 标签之后插入代码

android - 将 native 应用程序转换为 native android 依赖项/库

android - 获取未接来电列表并将其从android中的通话记录中删除

android - AsyncTask 和 getInstalledPackages() 失败

当枚举和标识符列表的长度不匹配时导致编译器错误

c - 使用 strcat 的段错误

javascript - 下拉菜单切换不适用于 ngTouch

c++ - netlink 接口(interface) stat goto 交叉初始化错误

c++ - 为什么在尝试绕过 winapi 时进程会崩溃?

Git:用 'post-receive'命令发送参数到 'git push' hook