以下只是搬运下我公众号的东西。很早就发过了。原帖地址:
移动安全逆向分析流程
已经发公众号的为什么还发csdn
有的圈内朋友,不经过我的允许,删减摘录我公众号的内容,这里就不提谁了,心里清楚,还能获得一些关注和流量。很无语,所以我还不如自己也发发。【猛男落泪】
前面整理了一套技能树1.0版,这次整理下逆向思路,我们拿到一个app,常规的分析流程
第一大问题就是抓包,如果包都抓不到,那基本就没法进一步入手了
而现在的app,稍微有点安全意识的,都会防抓包,并且安卓7.0版本开始也自带了安全等级,不再信任用户安装的证书,只信任系统证书,以及种种类似的情况,这种我们怎么处理呢?就得具体问题具体分析了
1.系统代理检测:charles+VPN(postern、drony、小黄鸟)
2.网卡、检测:过网卡、检测脚本(以OkHttpLogger-Frida为例)
3.sslpinning检测:
objection 关闭ssl
frida unsslpinning脚本
4.tcp/udp包:mitmdump、小黄鸟
5.用户证书:
使用7.0以下的系统安装抓包
xposed:justTrustMe插件
frida:过证书检测脚本
6.证书绑定,双向证书
r0capture
7.针对spdy/quic:frida降级
8.flutter sslpinning: frida过检测脚本
9.自实现http请求库:
针对跟踪,hook入参和返回值
10.protobuf/gRPC:https://mp.weixin.qq.com/s/8yOabTkMid9iKcbMJjYVHA
10.tls检测:
具体情况具体处理,据说某迈也有移动版,所以也有tls检测
11.抓包框架:lamba:https://github.com/rev1si0n/lamda
12.eCapture:eBPF下的抓包工具,无需CA证书即可抓HTTPS明文
抓到包以后,拿到了接口,以及加密参数,怎么定位这个加密参数生成呢
1.看请求参数,搜索想要查看的特殊字段(并不推荐,但是确实能解决50-60%的app)
2.objection 列出所有的类,hook全部,然后看关键点的时候哪些类被调用了
3.利用dumpsys window 或者activity看当前的activity(mt管理器也可以记录activity),进到里面找逻辑,如果逻辑代码太多则不适用
4.观察各个接口的请求参数,是否都有一样的请求体结构(换句话说就是看这些请求参数的键名)是不是一样的,如果一样,按照开发逻辑理念,一定有一个通用的模板加密类,搜一个加密字段,找到这个加密类,查找用例,或者用objection跟踪,打印调用栈
5.hook 通用的加密算法,打印调用栈
6.hook 网络库okhttp,request等的(以OkHttpLogger-Frida库为首的)
7.hook hashmap的put方法,大部分的请求参数基本都用的hashmap封装请求体,hook put方法,打印调用栈,则可以找到(并不100%通用)
8.hook string类的getBytes等的常用方法或者转Json的方法
9.hook Byte类的toString等的常用方法或者转Json的方法
10.hook Toast类,主流开发习惯,提示弹窗都用的这个类,hook它,看调用栈
11.关闭网络,再发起需要操作的目标接口,看报错提示,利用报错提示找调用栈,实际操作时,大部分情况跟思路10重合
12.用frida hook 类android.view.View,点击哪里hook哪里的方法,打印调用栈
13.hook Log类,按照开发逻辑,开发人员会在开发的时候会在一个阶段里用log打印输出日志看逻辑,hook log打印调用栈,有时候有奇效
14.有的app会检测返回值的格式,并解析输出显示,看是否有通用解析类,hook它,如果hook不上(或者找不到这种类),则用抓包工具修改返回值,然后看解析逻辑(不常用)
以上方法也无法保证通用,比如也有反调试调用栈,使其打印不到核心调用流程或者直接返回空调用栈,这种就得针对处理了
GDA 、jeb、jadx,混着用,别只用jadx,有时候jadx解析并不好,看不到逻辑
比如某wtoken,用jeb可以直接看到一些逻辑,jadx的那个部分解析失败
当定位到加密参数生成逻辑的时候,准备调试
一般用objection跟踪类,看调用栈,结合源码,写frida脚本调试,如果在frida逻辑里能hook或者主动调用实现,此步结束
目前来看,到这一步,基本都会遇到frida反调试,frida直接用不了,有时候换用lsposed,会有奇效,如果还不行,这就需要去对抗检测了,三两句就说不清楚了,感兴趣可以联系我。
调试完感觉能行得通之后,开始实现加密逻辑
32位,一般是md5
带【==】一般是base64,如果这个【==】还带有【/】,那多半用了aes/dex/rsa,并用base64做了二次加密
40位的加密结果,一般是sha
请求体是乱码,看是否是tcp或者protobuf
这里的加密算法,推荐看Q佬的文章
这个就需要需要花精力分析,尝试,实在无法实现,可以用unidbg,不要纠结于手段
当以上步骤你都走完后,请求几次,发现确实能拿数据,于是你非常开心的部署并跑起来,结果批量跑没多久,就各种异常返回,滑块,403啥的也跟着来了,这时候你可能就遇到风控了。
什么是风控,以下是简单版的,这个不一定齐全也不一定对,后面有空再单独搞个专题文章介绍风控的
手机品牌、型号、壁纸、上网模式、wifi名等上百个基本的设备参数
gps,陀螺仪
root检测
app检测(一般检测是否magisk包)
网络/检测,网络状态实时上传
行为分析,按钮点击次数、接口请求统计分析
某个页面停留时间,重复请求次数
请求调用栈顺序分析
...
结合以上信息,传到服务器,服务端收集到用AI推演出用户画像,行为习惯,判定风险等级,然后给定设备/账号限制
如果等级低,则出滑块,不返回数据或者返回异常,提示实名认证,比如某国外社交app,需要人脸认证、身份证、手机号码验证
风控这种东西怎么对抗呢,这个就真的难说了,只能花时间测试并针对调整了
以上流程或者思路,并不一定对,只是我个人的经验分享而已,如果对您有帮助,那我挺开心的
加我微信:geekbyte,商务合作或者技术交流,以及小白技术路线推荐,技能提升进阶课程、书推荐