Как подключить методы C/C++ в Android с помощью Cydia Substrate

Я проверил дом Cydia Substrate, пример Android Jni Hook, предоставленный автором, на самом деле перехватывает Java-метод с C-кодом.

Но я хочу подключить метод C/C++, то есть метод в libXXX.so в Android. Как и метод fork() в /system/lib/libc.so. Информация от автора Cydia и XDA, кажется, показывает, что Cydia может сделать это. Я искал по всему Интернету, но не могу найти пример.

Может кто-нибудь сказать мне, как подключить метод C/C++ в Android с помощью Cydia?

1 ответ

Не совсем уверен, где это поставить, потому что это не совсем ответ, но, возможно, это укажет вам правильное направление. Вот некоторый код, который прокладывает / ловит 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() Shimmed (он также Shimmed во всех дочерних процессов watch, "/lib64/libc.so.6" это so содержащий оригинал fork(), я имею MAKE_CALLTHROUGH написано как макрос, потому что я использовал несколько функций в проекте, в котором я использовал это.

Другие вопросы по тегам