Как перехватывать методы 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?


person Misty Zhu    schedule 10.12.2014    source источник


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

person nchen24    schedule 10.12.2014