一:环境
frida 16.1.4、burpsuite
百度极速版app最新版: com.baidu.searchbox.lite, arm7, 32位
二:过反调试
1:进程重启行为
frida 直接启动进程后 frida 会直接退出,app继续运行,通过 "logcat | grep com.baidu" 查看进程启动日志,过滤"ActivityManager: Start"发现:
frida启动app时, firda中获取的进程pid 和最终运行的进程pid不同,com.baidu.searchbox.lite 启动了两次
手动启动app 进程只启动了一次,可以确认有反调试行为。

2:java 层 查找进程结束函数
hook 所有 System.exit 调用的地方,发现不是这些地方结束的进程,其它地方测试发现也不是,猜测可能是native层。
3:native 层反调试查找
方式1:natvie 层进程退出的方法有以下方式:
exit -> SVC __NR_exit_group 进程退出
syscall tgkill -> SVC __NR_tgkill 进程退出
hook exit 和 syscall (tgkill) 都没有捕获到进程结束行为,可能是通过更底层的 SVC __NR_exit_group 或 SVC __NR_tgkill 来执行进程结束行为的。
理论上可以通过 stackplz 打印SVC 进程退出的调用,但工具需要 android 内核 5.1 以上支持,只能放弃
(注: 后续复盘的过程中发送确实是通过 libmsaoaidsec.so 中的SVC __NR_exit_group 调用完成进程退出)

方式2:Hook libc 的 opendir、__open_2 函数查找反调试行为
其中 26280 是com.baidu.searchbox.lite的,查找其调用来源,发现来自 libmsaoaidsec.so的 .init_proc
方式3:直接 hook dlopen 和 android_dlopen_ext 查找是哪个 so 加载后进程退出,检测大概率就是这个so

同样定位到 libmsaoaidsec.so
4:libmsaoaidsec.so 反调试patch
直接patch .init_proc 函数,使其直接执行返回指令:hook 时机选择在 linker 的 find_library 函数返回,此时目标so已经被加载内存, .init_proc 还没有执行,可以修改so的内存

发现进程运行一段时间后会再次结束,说明还有其它函数在进行检测,.init_proc 函数是由 linker 的 call_array 进行调用,hook call_array 函数,发现它还调用了其它3个INIT_ARRAY表中的函数:

patch这3个函数和.init_proc 一样,直接执行返回指令

后续app 正常运行,反调试被过掉
三:过掉抓包检测
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



