zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

移动安全逆向分析流程

2023-02-19 12:24:32 时间

抓包

第一大问题就是抓包,如果包都抓不到,那基本就没法进一步入手了。

而现在的app,稍微有点安全意识的,都会防抓包,并且安卓7.0版本开始也自带了安全等级,不再信任用户安装的证书,只信任系统证书,以及种种类似的情况,这种我们怎么处理呢?就得具体问题具体分析了。

系统代理检测:charles+VPN(postern、drony、小黄鸟)
网卡、vpn检测:过网卡、vpn检测脚本(以OkHttpLogger-Frida为例)
sslpinning检测:
objection 关闭ssl
frida unsslpinning脚本
tcp/udp包:mitmdump、小黄鸟
用户证书:
使用7.0以下的系统安装抓包
xposed:justTrustMe插件
frida:过证书检测脚本
证书绑定,双向证书
r0capture
针对spdy/quic:frida降级
flutter sslpinning: frida过检测脚本
自实现http请求库:
针对跟踪,hook入参和返回值
protobuf/gRPC:https://mp.weixin.qq.com/s/8yOabTkMid9iKcbMJjYVHA
tls检测:
具体情况具体处理,据说某迈也有移动版,所以也有tls检测
抓包框架:lamba:https://github.com/rev1si0n/lamda
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,会有奇效,如果还不行,这就需要去对抗检测了,三两句就说不清楚了,感兴趣可以联系我。

加密协议实现

调试完感觉能行得通之后,开始实现加密逻辑。

1.确定是什么加密算法(并不通用,需要结合实际)。

2位,一般是md5
带【==】一般是base64,如果这个【==】还带有【/】,那多半用了aes/dex/rsa,并用base64做了二次加密
40位的加密结果,一般是sha
请求体是乱码,看是否是tcp或者protobuf

 这里的加密算法,推荐看Q佬的文章。

2.判断是否是标准的加密算法,给一个固定的入参,与标准的算法对照加密结果。

3.实现协议。

这个就需要需要花精力分析,尝试,实在无法实现,可以用unidbg,不要纠结于手段。

风控对抗

当以上步骤你都走完后,请求几次,发现确实能拿数据,于是你非常开心的部署并跑起来,结果批量跑没多久,就各种异常返回,滑块,403啥的也跟着来了,这时候你可能就遇到风控了。

什么是风控,以下是简单版的,这个不一定齐全也不一定对,后面有空再单独搞个专题文章介绍风控的。

手机品牌、型号、壁纸、上网模式、wifi名等上百个基本的设备参数gps,陀螺仪root检测app检测(一般检测是否magisk包)网络/vpn检测,网络状态实时上传行为分析,按钮点击次数、接口请求统计分析某个页面停留时间,重复请求次数请求调用栈顺序分析...

结合以上信息,传到服务器,服务端收集到用AI推演出用户画像,行为习惯,判定风险等级,然后给定设备/账号限制。

如果等级低,则出滑块,不返回数据或者返回异常,提示实名认证,比如某国外社交app,需要人脸认证、身份证、手机号码验证​。

风控这种东西怎么对抗呢,这个就真的难说了,只能花时间测试并针对调整了。