android - 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)
解决方案
您正在崩溃,因为它是一个返回且没有返回语句monitor_pid
的函数,因此编译器默认在此处放置一个操作码。void *
trap
void *monitor_pid(void *arg) {
int status;
//waitpid(child_pid, &status, 0);
/* Child status should never change. */
//_exit(0);
}
我不得不提几件事:
完全阻止热情的研究人员调试您的应用程序是不可能的,他们还可以对您的代码进行逆向工程以消除您的反调试工作。
您已经注释掉了您发布的 URL 中的许多代码。你期望它如何工作?
我不是JNI 脚本,它是使用您的应用程序编译的本机代码。
推荐阅读
- javascript - 反应组件不更新 {CountdownCircleTimer)
- ubuntu - gdb:无法列出共享库源/符号
- java - Sqlite 数据库崩溃到主屏幕
- python - 如何从 dfs 打印旧值和插值?
- reactjs - 不必要地使用 React.forwardRef() 会带来什么不利吗?
- ios - Xcode Debugger Swift:无法在调试器中查看变量的值,lldb 命令给出错误
- python - Pandas 有没有办法根据某个行值修改以前的行?
- python - VS Code 无法识别新的 Conda 环境
- python - 将数组的列切片为最小大小
- apache-spark - 如何在单行中左连接两个结构数组?