从零搭Android动态分析沙箱:Frida+objection+API监控
为什么自己搭公司最近要做 App 自动化合规检测,市面上的沙箱要么贵要么不开放,干脆自己搭了一套。底子是 Frida + objection,外加一层 API 调用日志收集,跑了大半年挺稳的,记下来给后来人。
[*]宿主:Ubuntu 22.04 服务器一台,64G 内存 + 一张 P2200 显卡(跑模拟器图形)
[*]模拟器:Android Studio AVD,Android 11/13 两个镜像,root 镜像走 Genymotion
[*]框架:Frida 17.x server 端 push 到 /data/local/tmp,PC 端 pip 装新版 frida-tools
架构
沙箱分三层:调度层用 Celery 把 APK 队列任务丢给 worker,分析层在模拟器里 hook 一切目标,存储层把 trace 落到 PostgreSQL + Elasticsearch 双写,前端用 Kibana 看 API 调用关系图。整套部署用 docker-compose 起,单机能跑三路并发。
核心 hook
// 通用敏感 API 调用记录
Java.perform(function(){
var CL = Java.use('android.content.ContentResolver');
CL.query.overload('android.net.Uri','[Ljava.lang.String;','java.lang.String','[Ljava.lang.String;','java.lang.String').implementation = function(uri, p, s, a, so){
send({api:'ContentResolver.query', uri: uri.toString()});
return this.query(uri, p, s, a, so);
};
var Loc = Java.use('android.location.LocationManager');
Loc.getLastKnownLocation.implementation = function(p){
var l = this.getLastKnownLocation(p);
send({api:'LocationManager.getLastKnownLocation', provider:p, lat:l?l.getLatitude():null});
return l;
};
});
几个坑
第一,Android 14 之后 SELinux 对 /data/local/tmp 写权限收紧,frida-server 要改名才能躲过基础检测;第二,objection 默认 hook 表对加固 App 不全,碰到梆梆、爱加密要补 FSExplorer 手动 dump;第三,ES 索引要按 api 字段做 keyword,否则前端聚合查询会 OOM。
https://www.metk.cn/img/posts/android_dynamic_sandbox.jpg 这篇干货,比那些只有命令没有解释的强太多了。 实战出来的经验和文档里写的完全是两码事,楼主这个很真实。 讲得挺细的,不过我建议加一句免责,这东西容易被拿去做坏事。 试了下你说的第二种方法,成功率更高,推荐。 我这边环境是Mac,有些步骤要调整,回头补个差异说明。 这个技术本身是中性工具,关键看用途,楼主的态度挺正的。 想请教一下,你用的这个版本是哪个?我这边跑起来报错。 收藏了,最近正好要搞这块,省了不少翻文档的时间。 感谢分享,之前一直卡在这个点,看完豁然开朗。