如何在Android中防止ptrace反调试?

qxsslcnc  于 2023-08-01  发布在  Android
关注(0)|答案(1)|浏览(254)

介绍:

我必须反向工程一个Android APK,并希望使用依赖于ptrace的工具。
APK似乎已经实现了一个反调试机制,它启动了两个进程。然后,“helper进程”在“main进程”上使用ptrace。由于ptrace在任何给定时间只能在一个进程上使用,因此防止了其他进程可以调试“主”进程。错误可能如下所示:

attach: ptrace(PTRACE_SEIZE, PID): Operation not permitted

字符串
我运行在一个root模拟器上,我可以在其他进程上使用ptrace,杀死“助手进程”将导致“主进程”也终止,在“助手进程”本身上使用ptrace时也是如此:

strace: Process PID attached
wait4(PID,  <unfinished ...>)          = ?
+++ killed by SIGKILL +++

我已经尝试过了:

ptrace scope设置为0以防止内核硬化:

echo 0| tee /proc/sys/kernel/yama/ptrace_scope


确认

cat /proc/sys/kernel/yama/ptrace_scope


得到0,步骤成功。
在这不起作用之后,我尝试使用LD_PRELOAD覆盖APK使用的现有ptrace shared object,以下每个命令都是从同一个adb shell运行的:
我的ptrace.c

long ptrace(int request, int pid, void *addr, void *data) {
    return 0;
}


编译:

gcc -shared -fPIC ptrace.c -o ptrace.so


设置环境变量:

export LD_PRELOAD=./ptrace.so


启动应用程序(我也使用了-e标志,我不确定它是否可以用于环境变量,但它也不会造成任何伤害):

am start -n the.app.id/the.app.id.MainActivity -e LD_PRELOAD ./ptrace.so


遗憾的是,跑步:

cat /proc/PID/status | grep TracerPid


仍然显示tracer PID是“助手进程”而不是0。没有其他进程可以在“主进程”上使用ptrace

7cwmlq89

7cwmlq891#

在Interception.attach中使用frida,您可以做的是钩住ptrace并始终返回0。
下面是挂接ptrace并返回0的代码行,以便您可以绕过它:里面https://github.com/apkunpacker/FridaScripts/blob/1c2c4538c1b37394c6e2a57a72c9f743bbb75d29/AntiDebug.js#L45还列出了使用反调试的方法。
对于其他防挂机、防调试,可以查看视频:Forging Golden Hammer Against Android App Protections by Georges-Bastien Michel。视频只包含想法,所以你必须从想法中实现自己的。

相关问题