首页 > 解决方案 > Android 禁用 ptrace 调试以确保安全

问题描述

出于安全考虑,我想阻止任何外部人员查看或将调试器附加到我的应用程序,并且可以检查应用程序的日志。为了防止这种情况发生,我遇到了JNI 脚本 ,如果有人试图在发布应用程序中附加调试器,它实际上会杀死应用程序。

static int child_pid;

void *monitor_pid(void *arg) {

    int status;

    //waitpid(child_pid, &status, 0);

    /* Child status should never change. */

    //_exit(0);

}

jboolean anti_debug() {

    child_pid=fork();

    if(child_pid==0)
    {
        int ppid = getppid();
        int status;

        if(ptrace(PTRACE_ATTACH,ppid,NULL,NULL) ==0)
        {
            waitpid(ppid, &status,0);

            ptrace(PTRACE_CONT,ppid,NULL,NULL);

            while(waitpid(ppid, &status,0)) {

                if(WIFSTOPPED(status)) {
                    ptrace(PTRACE_CONT,ppid,NULL,NULL);
                } else{
                    // Process has exited
                    //_exit(0);
                    //ptrace(PTRACE_DETACH,ppid,NULL,NULL);
                    return JNI_TRUE;
                }
            }
        }

    } else{
        pthread_t t;
        //ptrace(PTRACE_DETACH,getppid(),NULL,NULL);
        /* Start the monitoring thread */
        pthread_create(&t, NULL, monitor_pid, (void *)NULL);
    }

    return JNI_FALSE; 
}

extern "C" JNIEXPORT jboolean JNICALL Java_com_utilities_Global_checkPtrace(
        JNIEnv *env, jobject instance) {
    return anti_debug(); 
}

现在我的问题是它第一次用于调试构建,然后当我第二次打开应用程序时它崩溃,下面是我遇到的错误。

任何帮助都会得到帮助

A/DEBUG:     #00 pc 0000965c  /data/app/com.dev-uvtomKbV4Z3rmhQFiqJ81Q==/lib/x86/libapp.so (monitor_pid(void*)+12)
2019-05-16 16:40:24.646 12904-12904/? A/DEBUG:     #01 pc 0008f065  /system/lib/libc.so (__pthread_start(void*)+53)
2019-05-16 16:40:24.646 12904-12904/? A/DEBUG:     #02 pc 0002485b  /system/lib/libc.so (__start_thread+75)

标签: androidsecurityandroid-ndkptracejnienv

解决方案


您正在崩溃,因为它是一个返回且没有返回语句monitor_pid的函数,因此编译器默认在此处放置一个操作码。void *trap

void *monitor_pid(void *arg) {

    int status;

    //waitpid(child_pid, &status, 0);

    /* Child status should never change. */

    //_exit(0);

}

我不得不提几件事:

  1. 完全阻止热情的研究人员调试您的应用程序是不可能的,他们还可以对您的代码进行逆向工程以消除您的反调试工作。

  2. 您已经注释掉了您发布的 URL 中的许多代码。你期望它如何工作?

  3. 我不是JNI 脚本,它是使用您的应用程序编译的本机代码。


推荐阅读