抓包
第一大问题就是抓包,如果包都抓不到,那基本就没法进一步入手了。
而现在的app,稍微有点安全意识的,都会防抓包,并且安卓7.0版本开始也自带了安全等级,不再信任用户安装的证书,只信任系统证书,以及种种类似的情况,这种我们怎么处理呢?就得具体问题具体分析了。
目标点定位的思路
抓到包以后,拿到了接口,以及加密参数,怎么定位这个加密参数生成呢?
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.确定是什么加密算法(并不通用,需要结合实际)。
这里的加密算法,推荐看Q佬的文章。
2.判断是否是标准的加密算法,给一个固定的入参,与标准的算法对照加密结果。
3.实现协议。
这个就需要需要花精力分析,尝试,实在无法实现,可以用unidbg,不要纠结于手段。
风控对抗
当以上步骤你都走完后,请求几次,发现确实能拿数据,于是你非常开心的部署并跑起来,结果批量跑没多久,就各种异常返回,滑块,403啥的也跟着来了,这时候你可能就遇到风控了。
什么是风控,以下是简单版的,这个不一定齐全也不一定对,后面有空再单独搞个专题文章介绍风控的。
结合以上信息,传到服务器,服务端收集到用AI推演出用户画像,行为习惯,判定风险等级,然后给定设备/账号限制。
如果等级低,则出滑块,不返回数据或者返回异常,提示实名认证,比如某国外社交app,需要人脸认证、身份证、手机号码验证。
风控这种东西怎么对抗呢,这个就真的难说了,只能花时间测试并针对调整了。