首先是下载了多个版本发现最早能用的版本就只有7.8
所以以下我们使用7.8版本的 * * 佳缘作为分析案例
我们的目的是分析抓包登陆信息,分析登录的相关协议信息
登录抓包找到顶部登陆activity,可以参考使用一下两种方式
adb shell dumpsys activity activities | findstr "cmp="
adb shell dumpsys activity | findstr "mFoc"
拿到栈顶activity,jadx跟进代码
栈顶activity
栈顶activity代码 objection跟踪函数调用
看到a方法的参数入值就是一个接口返回的请求信息,也就是说调用loginActivity的a方法之前,极验已经完成了认证,a方法回调是给我们调用正常的登陆逻辑的
跟进分析a(String str)方法
这里面的两个a,有参的明显是ons=Success,无参的就是onFailed回调
(tips:下面这两张图会说明上面这里我为什么这么说)
接口关键字搜索
用例查找
这里的e.d不就是上文中的presenter调用的方法么,这里就对应起来了,所以之前的分析没错,这里就是极验的回调
再往下就是分两个方向去分析了:
① 极验成功后的回调(正常的用户登陆逻辑)
post : https://api.jiayuan.com/sign/signoninfo.php
(post参数挺多的,就不挨着列出来了)
登录接口抓包
② 极验的三个请求的参数逻辑
第一个简单极验后的接口简单点,我们先来跟第一个
回到之前那个presenter的位置
请求分析2
三个参数
参数跟踪 抓包数据验证
对应一下请求参数便可知道:
gecode ===> 70abde****|jordan (第二个传参)
gechallenge ===> 6851f25**** (第一个传参)
gevalidate ===> 70abde**** (第三个传参)
这里也写得蛮清楚的,刚才分析的时候没看到。。。
传参分析 map.put这里的d.a实际就是一个map的put操作,请求信息的拼接
可以hook一下看看调用,这里hook他的目的不只是查看参数,主要是为了清楚它的拼接顺序,哪些东西先拼接,哪些东西后拼接
以上的这四张图片就是说明了Presenter(发起自己的登录请求)调用之前拼接的字符串全部会出现在第二张图片,调用presenters.e.d.a之前,参数太多了这先不总结,后面需要哪个字段来这里查看就知道了
下面我们就来具体分析细节参数(这里从Fildder参数列表顺序来取)
fildder参数顺序1 fildder参数顺序2gecode:不用分析了,是上一个接口返回的参数
userinfotypes:
userinfotypes
可以看出来它就是一个常量....(整的还挺花里胡哨)
[1,2,112,104,3,127,128,129,130,131,132,133,134,135,8,136,137,100,101,106,110,114,117,116,121,122,107,184,102,103,111,125,221,115,6,5,21,232,185,186,147,123,148,146,113,149,124,163,156,119,150,151,153,179,182,160,161,171,152,162,155,154,180,120,187,157,168,169,174,170,240,167,173,231,158,118,7,241,242,243,237,244,105,236,249,255,254,247,181,145,251,252,178,259,258,233,257,260,261,264,265,266,267,268,245,269,270,272,273,274,279,277,280,288,4,292]
简单的参数伪造包的时候不变就是了,以下都是可以不变的
osv,token,carrier,geo_lat,channelID,bundle,connection_type,imei,logmod,reallogin,screenHeight,lang,orientation,channel,android_id
android_id可以简单的看一下他是什么
android_id调用 android_id实现
还是这样,需要改可以hook或者修改smali重打包,再或者是动态添加一些随机数产生的smali代码生成随机android_id
clientID;固定值 "13"
clientVer: versionName
versionName
dd,screenWidth,password(SHA-1)
geo_accu
geo_accu
mac,os_type,clientid,deviceid,bd,geo_lon,make,brand
secucode:这个地方可能就是关键了,关键函数native话,针对这种问题,测试阶段我们可以使用hook的函数主动调用去获取返回值,或者是把他的so文件拖出来,构建一个项目去主动调用,目的都是一致的,达到函数的主动调用目的,后面在分析so,这里先看看参数
secucode
第一个参数是固定的5c28cc****,第二个参数就是手机号码
secucodesecucode java
这里是三个native函数的返回值
native返回值key和算法都不会变,其实看起来也就简单了
java代码这里大概就是这个意思:
对于a方法传进来的两个参数,第一个是一个固定的string(5c28cc****)前面说到了,第二个是一个电话号码,a方法的返回值可以看成是对第一个参数进行des加密,加密密钥为65,74,67........,加密完成后再调用native方法getNewCode加密,这里加密逻辑再so里,我稍后再去分析so,然后把返回的byte数组转换为String(Integer.HexToString()),完成加密的计算,得到得值也就是我们需要的secucode
isgeet,screen_dpi,ip,name,channelid,os_version,isJailbreak,ver,product,model,gevalidate(见上)
traceid 跟一下
也就是不同手机对应的一个常量(也就是可能服务器端用作验证是不是同一个手机的参数,请求的时候看情况随意伪造)
下面是so层的分析
先hook一下so加载,判断得到加密函数存在于 libjyn.so
于是乎我们去到apk解压目录下查看又没有这个so,发现没有,所以这个应该是运行时动态加载出来的,但是文件目录不变,所以直接去app目录托出来
文件目录 cp出来 拿到ida里面去看看getKey() 这个代码也啥子意思,简单看一下就是了,写的很简单,返回的也就是常量而已
getKey
getAlgorithm() 同上
getAlgorithmgetNewCode() 就是一个md5
getNewCode
getSendMsgAuthStr()
getSendMsgAuthStr
到此基本上自主登陆请求接口就分析完了,但是还有一个大关极验没过,首先是极验返回给了我们一个验证字符串(token),我们拿到这个token才能进入下一步的登录验证,这也是这里为什么选了7.8版本,7.8版本不是每次登录都会触发极验,最新版是每次都触发,所以这里也就是简单的分析了一下登录的接口数据请求y
网友评论