我查看了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.c
是fork()
的进程被填充(它也在 watch
的所有子进程中填充。"/lib64/libc.so.6"
是包含以下内容的 so
原始的fork()
。我将MAKE_CALLTHROUGH
编写为宏,因为我在使用它的项目中填充了多个函数。
关于android - 如何使用 Cydia Substrate 在 Android 中 Hook C/C++ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27398180/