学习网址:https://music.163.com/
依然还是熟悉的流程,打开抓包软件,输入账密登录,抓包,可以看到这个login包只有两个参数,那么一看就是加密后的,这一期主要讲解这两个参数的加密方法
两个加密参数,分别是params 和 encSecKey,我们直接打开F12,搜索一下第一个参数params,搜索出来的数量不是很多,我们全部下断点,在登录一下看看会不会断下来
下完断点再去登录,发现在这个地方断了下来,而且看了一眼参数,看的第一个参数我就看到了我输入的phone,那么可以断定加密就是在这个地方了,
o.encText = a(e, r),
o.encText = a(o.encText, i),
o.encSecKey = c(i, t, n)
看下代码,是不是看到了一个很熟悉的参数,我们的第二个加密参数encSecKey直接就出来了, encSecKey = c(i, t, n),三个参数,调用C函数,我们先一步一步分析,从第一个开始看
,鼠标放到上面就可以看到a是我们的原文"{"countrycode":86,"phone":"17515111111","password":"84610bd0b6bdfe4a6aae99a7c76fc78f","rememberLogin":"true","secureCaptcha":"CN31_OG-sNATnDdXNNpB-V-xCisIL9vYOT4c47hgD.OjRqewkPSC0ENs1_bAr8mdS4f-ePFTNWPuygyvXAdFGSMM.siufv5.QV0B97Y116WCtCbefUO5t5s1S-2NJ0ylxA6l7xBItsXsYlfl7I4uMo1MlrKqavioJ8OcPy0VfpmWVXL21-a9FxBmSxOCqArv86caGW0wjFSrWYUtpQBMZmePIZGs74EmMfusvcBbeXcgG1YsSSLv7wJg5OPGv7d_7WLXx-Ahih2kROK6XfqI7aeAvMFtnRApU1DpL.6t2aex_qdJCAMhX.aEdrY6vH_Fp05w4DVUanQzdFOynyuvOx6OyHstCEFbFj2hNEVatqlFDgPftF0qsmIKvEbQU7lL9few9mZD6SkcMvfeLWhbpSs8noIXOe-CFiiNXOlyaKZXuM-NDlLjXoOEGKqtTtdFVdK85IX9nREwTlwA.b_h0nEaYpySAEFGfhJLSHF-RjZG4Tor-YWoHwu.rzQd_Vxm3","checkToken":"9ca17ae2e6ffcda170e2e6ee8aea4fa6878d86c725aca88ba2c14b828e8bb0c4608ff58390f252a98c9da2ea2af0feaec3b92a93b1b694c95bb687f88fcc4b969f9bb3d14e948e9daff143b4eabbd9b46d88baee9e"}"
里面的参数,phone就是我们输入的账号,没有发生改变,看第二个参数名password,那么就是我们的密码了,只不过是加密后的,我们上一期讲过,32位的特征是什么?于是我直接打开我们的调试工具去测试一下。
直接输入了我们的明文密码,看着这生成结果,我陷入了沉思~~~怎么也不加个key呢,真没技术含量,不过也好,我们可以节约时间去找这个函数了,到时候直接调用加密库就好了。
然后看下其他函数secureCaptcha这一个是我们的wy滑块的返回结果,不用多分析了。后面的checkToken,多次抓包发现是一个固定值,那么我们可以直接忽略他了。我们继续研究刚刚的加密地点o.encText = a(e, r),,熟悉的手法,鼠标放到a上,跟进去
function a(e, t) {
var n = r.enc.Utf8.parse(t)
, t = r.enc.Utf8.parse("0102030405060708")
, e = r.enc.Utf8.parse(e);
return r.AES.encrypt(e, n, {
iv: t,
mode: r.mode.CBC
}).toString()
}
我直接一眼看懂了,这也太明显了吧。下次请混淆一下! 直接看到了我们的加密方式,这地方可能会有一些基础不稳固的觉得只能看懂90%,那么我来解释一下吧。
看到了AES.encrypt,说明这个地方的AES的加密过程,同理以后如果看到AES.decrypt,那么就是解密过程。 mode: r.mode.CBC这个函数说明了他的加密方式,是CBC的加密方式,
CBC需要传入两个加密条件,ker和参数Iv
EBC需要传入一个加密条件,key-----------------这两句请记住
既然是两个条件,但是只传入了两个参数,其中一个是需要加密的数据,那么也就是说只传进来了一个参数,那么肯定还有一个,
t = r.enc.Utf8.parse("0102030405060708")
这地方是什么东西,为什么会有0102030405060708这么的一堆数据,看不懂看不懂,那么我们就把他当作是另一个加密条件吧.[手动滑稽]
好了,废话不多说,继续讲解:首先这个函数传进来了两个值,第一个是我们的明文e,也就是我们明文(需要加密的数据),第二个参数t,在外面o.encText = a(e, r)这一步的时候可以看到,他是一个固定值0CoJUm6Qyw8W8jud。这是通过多次测试阅读代码得知的
通过上面是数值,我们可以看出,这个a函数确定就是加密点了
那么我们第一条代码也可以解释出来了,
o.encText = a(e, r),
参数encText=AES.CBC(明文,固定值0CoJUm6Qyw8W8jud),调用加密库试一下,确实就是跟上面图的结果是一致的。
接下来,继续看第二条o.encText = a(o.encText, i),
还是调用这个a函数,只不过第二个值变了,而且多次测试,发现这个值i是每次都会发生改变的,那么我们找一下他的生成方法
i = function(e) {
for (var t, n = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", r = "", o = 0; o < e; o += 1)
t = Math.random() * n.length,
t = Math.floor(t),
r += n.charAt(t);
return r
}(16)
就在代码上面,看到了i的值是通过这个函数生成的,此函数就是一个随机生成16位字符的函数,我们也可以直接随机,或者调用这个js。
那么第二条解释:
o.encText = AES.CBC(第一步的加密结果,随机值i) //注意这个地方随机值i后面还是要用到的
接下来就是我们的第二个参数o.encSecKey = c(i, t, n)
是通过调用c函数进行的,我们首先鼠标放到上面看下它的值是什么
i="agGpqf9nOgpKy8k4" //这边i是我们的随机值,这个地方就进行传入了
t="010001"
n="00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
这边记录下这三个值,然后追踪函数c
function c(e, t, n) {
return o.setMaxDigits(131),
n = new o.RSAKeyPair(t,"",n),
o.encryptedString(n, e)
}
发现c是一个RSA加密,还是基础的代码,这边不懂的小伙伴就多联系一下,时间久了就可以一眼看懂特征了。
那么调用方式知道了,我们就直接打开调试工具运行一下
这边运行提示o未定义,直接就改写一下,把o去掉,结果就是我图中的代码了,那么我们肯定要找到里面的三个函数,那么直接搜索一下,开始扣代码,js技巧:缺啥补啥
最终得到我们所需要的全部js代码,那么就拿去调用一下就可以了。
好了OK,今天的两个加密方法就全部出来了,我写了一个易语言 的例子,也顺便给你们打包了,js也在里面。
易语言的自用模块直接删掉就以了 xx_替换引号 (data) 这个自己改一下,就是单引号替换双引号
然后那个wy滑块我就不发布了,给你们替换成了输入框的,自己想测试的话去对接吧
---------------------------------------------------------------------------
结尾:我是小万,js,Android逆向交流群:948145929
第三节.zip
266.97 KB, 下载次数: 117, 下载积分: 精币 -2 枚
易语言源码+rsa的js