JS逆向系列一
谷歌学术镜像

目的是爬取学术镜像的真实地址,在Elements视图下,观察现在访问a标签,发现启用了onclick事件,调用了visit()函数,函数内的内容,猜测就是加密后的真实URL地址。

全局搜索visit,在 https://ac.scmor.com/res/?f=run&v=1590682984 中,找到了visit函数

经过观察,猜测strdecode是解密函数,就在上几行的位置,有个可疑参数autour[b],猜测是URL地址,在Console中测试一下


经测试,autour是个数组,里面存放了加密后的真实地址,strdecode也的确是解密函数,现在去拉取strdecode函数具体内容
全局搜索,找到了strdecode,经过初步观察,是Base64加密,然后缺啥补啥,将加密函数完整的提取出来

到此,加密函数也有了,现在需要收集全部的URL,于是,之前的autour数组,也拉下来,现在只需要遍历一下就好了,刚好有个run函数就是For循环遍历autour数组,也拿下来

稍微修改下细节,就大功告成,效果图如下:

DNS.COM
目标网址:https://www.dns.com/login.html

随便输入帐号密码进行测试,发现有个XHR请求,里面的password,email两个请求参数都做了加密,猜测这就是刚才输入的帐号密码

全局搜索 password,通过在后面加上 : 或者 = 可以缩小范围,排除多余项,找到了password:的位置,现在其实已经很明显是AES加密了,但还是测试一下吧

打断点,重新登陆,果然进入debugger状态了。

然后在console中测试下aes()函数以及它的参数到底是什么,经验证,发现aes()正是一个加密函数,加密后的内容和一开始看到的相吻合

现在查看aes函数具体的内容,发现了又有k和iv,并且有个CryptoJS对象

全局搜索CryptoJS,发现了crypto-js.js文件,明显这是CryptoJS加密库

并且发现还用了$(selector).action()的jQuery语法,所以还需要载入jQuery库

从网上下载单独的CryptoJS库文件引入,从 网页中获取jQuery链接,并载入 jQuery,然后将aes函数也拉下来

效果图如下:

贝贝网
目标网址:https://m.beibei.com/login/login.html (需手机端)

输入帐号密码及验证码进行测试,发现一个XHR请求,类型为POST,提交的表单数据中的用户名密码都为明文,但问题在于请求参数中的_abr_一直在变化,猜测它为加密参数

全局搜索_abr_无果,只能打请求断点,成功断住

但是发现断点的位置没有我们要的内容,于是在call Stack中往下找调用栈,call Stack内的方法调用栈的规则是从上到下由最新调用处依次往下排列。在e.ajax中发现了包含有_abr_的内容,但是这里是要发送出去了,没有它的产生过程,于是继续往下找,终于找到了_abr_=


记录_abr_的值为:"013e01885f35c08258b6ce21d500874ed5bb3143a05ed4b7b1"
发现_abr_其实是由m(e.type, e.uri.pathname, e.query, e.form)函数生成,于是为了了解它的生成过程,在函数前打上断点,重新发送登陆请求

单步跟踪,发现了关键函数MD5


继续单步跟踪,又发现了一个关键函数HMAC


网上查找资料了解这个加密算法,发现HMAC算法,需要一个信息摘要算法以及一个密钥,在下方又找到关键函数HmacSHA1,于是推测使用了SHA-1算法


经过长时间的单步跟踪,总算来到了一开始的函数返回值部分

现在,我们开始分析,HMAC算法可以使用Python第三方库实现,先尝试一下。加密内容有了,密钥也有了(加密目标值可以用JSON.stringify()提取)
加密目标值:"01\nPOST\nb7da15fd7cdc2b8c73958ee82e7424aa\n/mroute.html?method=beibei.user.token.get\n1591002077"
密钥:"ytU7vwqIx2UXQNsi"

Python测试效果如下

但是发现,与_abr的值相较,少了一些内容,回过头观察,发现_abr的值由a+m+h组成,a经测试是固定值01,m就是经过HMAC加密后的值,h会变动且暂时还不清楚

对h进行分析,发现是由s的值使用toString(16)函数变化而来,而s则是时间戳(new Date)变化而来

提取出h的算法,测试了一下,成功

接下来,只剩下需要加密的值,它如何产生的,观察发现由a + "\n" + e + "\n" + f + "\n" + p + "\n" + s组成,a、s都清楚了,e发现是POST,p是路径/mroute.html?method=beibei.h5.login,这两个也是固定值,只剩下f是MD5加密后的值,逆向f的产生过程,发现是由"用户名+路径+登陆id"产生而来,如:username=12341234123&scene=h5_login&rams_device_id=2654748010
所以现在只需要将这个值MD5加密后传入即可,同样也能用Python实现
最终完成的效果


浙公网安备 33010602011771号