美文网首页安卓逆向
某婚恋app登录接口分析

某婚恋app登录接口分析

作者: 约你一起偷西瓜 | 来源:发表于2020-06-30 12:54 被阅读0次

    首先是下载了多个版本发现最早能用的版本就只有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的位置

    请求分析1
    请求分析2

    三个参数


    参数跟踪 抓包数据验证

    对应一下请求参数便可知道:
    gecode ===> 70abde****|jordan (第二个传参)
    gechallenge ===> 6851f25**** (第一个传参)
    gevalidate ===> 70abde**** (第三个传参)

    代码里验证

    这里也写得蛮清楚的,刚才分析的时候没看到。。。

    传参分析 map.put

    这里的d.a实际就是一个map的put操作,请求信息的拼接
    可以hook一下看看调用,这里hook他的目的不只是查看参数,主要是为了清楚它的拼接顺序,哪些东西先拼接,哪些东西后拼接

    调用顺序1 调用顺序2 调用顺序3 调用顺序4

    以上的这四张图片就是说明了Presenter(发起自己的登录请求)调用之前拼接的字符串全部会出现在第二张图片,调用presenters.e.d.a之前,参数太多了这先不总结,后面需要哪个字段来这里查看就知道了

    下面我们就来具体分析细节参数(这里从Fildder参数列表顺序来取)

    fildder参数顺序1 fildder参数顺序2

    gecode:不用分析了,是上一个接口返回的参数
    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****,第二个参数就是手机号码

    secucode
    secucode 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 跟一下

    traceid1 traceid2

    也就是不同手机对应的一个常量(也就是可能服务器端用作验证是不是同一个手机的参数,请求的时候看情况随意伪造)

    下面是so层的分析
    先hook一下so加载,判断得到加密函数存在于 libjyn.so

    hook native dlopen

    于是乎我们去到apk解压目录下查看又没有这个so,发现没有,所以这个应该是运行时动态加载出来的,但是文件目录不变,所以直接去app目录托出来

    文件目录 cp出来 拿到ida里面去看看

    getKey() 这个代码也啥子意思,简单看一下就是了,写的很简单,返回的也就是常量而已


    getKey

    getAlgorithm() 同上

    getAlgorithm

    getNewCode() 就是一个md5


    getNewCode

    getSendMsgAuthStr()


    getSendMsgAuthStr

    到此基本上自主登陆请求接口就分析完了,但是还有一个大关极验没过,首先是极验返回给了我们一个验证字符串(token),我们拿到这个token才能进入下一步的登录验证,这也是这里为什么选了7.8版本,7.8版本不是每次登录都会触发极验,最新版是每次都触发,所以这里也就是简单的分析了一下登录的接口数据请求y

    相关文章

      网友评论

        本文标题:某婚恋app登录接口分析

        本文链接:https://www.haomeiwen.com/subject/quotqktx.html