简介:
我必须对 Android APK 进行逆向工程,并且想使用依赖于
ptrace
的工具来实现这一点。
APK 似乎已经实现了一个反调试机制,它会启动两个进程。然后,“辅助进程”在“主进程”上使用
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
yield
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
。
使用 frida 和 Interception.attach,你可以做的是 hook ptrace 并始终返回 0。
以下是挂钩 ptrace 并返回 0 的代码行,以便您可以绕过它: https://github.com/apkunpacker/FridaScripts/blob/1c2c4538c1b37394c6e2a57a72c9f743bbb75d29/AntiDebug.js#L45。里面还有一个解决反调试方法的列表。
其他的反hook、反调试,可以看视频:Forging Golden Hammer Against Android App Protections by Georges-Bastien Michel。该视频仅包含想法,因此您必须根据该想法实现您自己的想法。