首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android中使用Cydia底层挂接C/C++方法

如何在Android中使用Cydia底层挂接C/C++方法
EN

Stack Overflow用户
提问于 2014-12-10 18:07:23
回答 1查看 1.2K关注 0票数 0

我查看了Cydia底板的主页,作者提供的Android Jni Hook示例实际上是用C代码钩住Java方法。

但我想要的是挂接一个C/C++方法,也就是安卓libXXX.so中的一个方法。比如/system/lib/libc.so中的fork()方法。来自Cydia作者和XDA的信息似乎表明Cydia可以做到这一点。我在互联网上找遍了,但没有找到一个例子。

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

EN

回答 1

Stack Overflow用户

发布于 2014-12-10 18:35:45

我真的不确定该把它放在哪里,因为它不是一个确切的答案,但它可能会把你带到正确的方向。下面是一些用C语言编写的填充/钩子fork()代码。在本例中,它是用来检测沙箱程序是否派生两次以上的,但显然您可以根据需要修改行为。

代码语言:javascript
复制
#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();
}

为了防止任何人感到好奇,我把它编译成这样:

代码语言:javascript
复制
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是包含填补/钩子代码的文件,watch.c是对fork()进行填补的进程(在watch的所有子进程中也会对其进行填补。"/lib64/libc.so.6"是包含原始fork()so。我将MAKE_CALLTHROUGH编写为宏,因为我在使用它的项目中填充了多个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27398180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档