我查看了Cydia底板的主页,作者提供的Android Jni Hook示例实际上是用C代码钩住Java方法。
但我想要的是挂接一个C/C++方法,也就是安卓libXXX.so中的一个方法。比如/system/lib/libc.so中的fork()方法。来自Cydia作者和XDA的信息似乎表明Cydia可以做到这一点。我在互联网上找遍了,但没有找到一个例子。
谁能告诉我如何使用Cydia在Android中挂接C/C++方法?
发布于 2014-12-10 18:35:45
我真的不确定该把它放在哪里,因为它不是一个确切的答案,但它可能会把你带到正确的方向。下面是一些用C语言编写的填充/钩子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是包含填补/钩子代码的文件,watch.c是对fork()进行填补的进程(在watch的所有子进程中也会对其进行填补。"/lib64/libc.so.6"是包含原始fork()的so。我将MAKE_CALLTHROUGH编写为宏,因为我在使用它的项目中填充了多个函数。
https://stackoverflow.com/questions/27398180
复制相似问题