最近闲来无事,本着学习的目的,就研究了一下dy的算法,切入点是dy的登录协议。若哪里分析的有问题,请大佬指出。

工具:

雷电模拟器,AndroidKiller,jadx,jeb3,fiddler,AndroidStudio。

因为dy的很多Java代码用jadx是反编译不出来的,所以就jeb和jadx结合使用了。

1、抓包

我用的是fiddler,然后雷电模拟器设置好代理就可以抓包了,抓到的包如下图。
QQ截图20200815155205.png

在这里先分析password和mobile,这两个字段。那么面临第一个问题,应该搜索什么才能快速定位呢。我比较喜欢搜请求地址,因为在很多app里data比分被加密很正常,但是请求地址就一般不会做处理。但是请求地址很长,所以要提取有用的信息,我在这里搜的是 mobile/login 。

因为我分析的是登录协议,而且是依靠手机号登录的,所以这个就具有一定的代表性。

2、分析

在AndroidKiller中搜索,

851260_5GFUKRQFA45ASAC.jpg

结果有四个,然后经过排除就只剩下第一个符合条件。然后查看java代码。
QQ截图20200815155359.png

很明显,这里就是我们想要的那个点。经过分析,password和mobile这两个字段的加密都是一样的,即先按位异或,然后转成16进制。
QQ截图20200815155441.png

接下来分析X-SS-STUB字段,先简单的分析一下,可以观察到这个字段是32位的,然后我就想到了md5。最后分析出来的结果果然是md5。

下面进行分析:

首先查找了关于这个方法的调用,来到这个方法
QQ截图20200815155516.png

然后再往上查找就找不到调用点了,然后我就用AndroidStudio进行了smali代码的动态调试,
QQ截图20200815155553.png

在我一开始定位的函数的返回处打了一个断点,然后向上回溯。但是,很可惜,向上的引用在执行handler,这肯定不是我们想要的地方。

然后就在AndroidKiller中搜索了X-SS-STUB
QQ截图20200815155656.png

结果有三个,看上去三个都很像,于是我在三个函数里面都打了断点,看看经不经过就完事了。结果后两个都经过了,函数如下

第一处
QQ截图20200815155734.png

第二处
QQ截图20200815155812.png

分析后发现第一处与X-SS-STUB有关,第二处与X-Gorgon有关,通过第二处的函数名也可以看出来
QQ截图20200815155846.png

此处稍后分析X-Gorgon字段的时候分析,现在先分析第一处。

但是分析第一处的时候会发现此处没有赋值的地方,让我一度怀疑是找错了地方,但是通过分析此处的smali代码会发现,此处调用了一个函数
QQ截图20200815155923.png

这个函数即赋值的地方。所以说我之前被反编译的java代码给骗了。。。。

函数如下
QQ截图20200815155958.png

确实是在进行md5。

下面来分析一下参数,byte[] bArr 这个参数为post的data部分,即

is_vcd=1&mix_mode=1&password=72607260343736313033&mobile=2e3d332534303d3737333534343533&account_sdk_source=app

通过动态调试可以发现。
QQ截图20200815160037.png

同时再进行一次加密
QQ截图20200815160107.png

由此完成了X-SS-STUB字段的加密。

最后来分析X-Gorgon字段,找到这个函数

这个函数在分析X-SS-STUB字段的时候提到过。从名字上可以猜测这个是一个回调函数
QQ截图20200815160146.png

下面进进入分析
QQ截图20200815160218.png

在这里找到了 X-Gorgon 字符串,大胆猜测一下这个v3就是key,然后顺着找v3,看它在什么地方会被用到
QQ截图20200815160253.png

v6是一个Map,v0_1就是拼装起来的value,接下来要分析的就是v0_1了。

发现v0_1是在这里拼接的
QQ截图20200815160347.png

关键点是这个函数调用链
QQ截图20200815160445.png

下面先分析函数 com.ss.a.b.a.a()的参数v9_2, V9_2由四个参数拼接而成。

找到v0_1赋值的地方,在此处
QQ截图20200815160723.png

arg20为传进来的参数
QQ截图20200815160754.png

通过动态调试发现此参数为URL
QQ截图20200815160825.png

然后调用了tt.b()方法,跟进去之后发现接着调用了tt.d()方法.

static String b(String arg0){
 return tt.d(arg0);
}

tt.d()方法是把URL的参数截取出来,查看此函数就可以发现。
QQ截图20200815160955.png

然后接着调用b.a()方法
QQ截图20200815161025.png

QQ截图20200815161350.png

进行md5后再进行一次加密,和X-SS-STUB字段的加密是一样的。

接下来分析v12参数,此参数为X-SS-STUB字段
QQ截图20200815161424.png

参数v13和v15分别为Cookie 和 Cookie[“sessionid”]。
QQ截图20200815161505.png

这四个参数若为空,则会被赋值为 "00000000000000000000000000000000"。

最后整理一下参数

v16: flag 值为1

V10: System.currentTimeMillis() / 1000

V9_2由四个参数拼接而成,分别为

v0_1: URL中的参数部分,即 ‘?’后部分的md5后,再经过一次加密的值

v12: X-SS-STUB字段

v13: Cookie

V15: Cookie[“sessionid”]

3、总结
以上就是分析dy的login协议的全过程,希望能够对大家有所帮助。