目标网站:aHR0cHM6Ly93d3cubWFvbWFvenUuY29tLyMvYnVpbGQ=
话不多说直接开干
1.打开网页,查看源码,哟吼,比我还干净,查找xhr,发现有三个文件,且都是加密数据
2.开始一般操作,随意复制hotlist.json到xur断点,停住了,开始分析调用栈,发现没有什么关键地方
3.于是开始用一种最笨的操作,试试看,咱也不知道行不行,点进入内部调试,看提示,真的不知道点了几下,可以去尝试下,终于到了关键位置,出现那一刻真的太感人了,那data不正是加密数据吗,,,,,,如果是老手的话看到加密那一刻,肯定是会先试着全局搜索encode,encrypt,decode,decrypt,json.parse等,我还是太年轻了,我事后才想起来。
4.于是开心的打上断点,刷新。真的是乐极生悲啊,虽然停住了但一直在加载,鼠标也点不了,等了好久也没好.............试了几次都一样,难道 天要亡我?。。。。。。天无绝人之路,人定胜天啊,我想起了hook,上图有个JSON.parse,没错咱就hook它,咱也不知道行不行,试试看
脚本代码如下:
5.刷新,加密数据出现,再全速运行,可以说这波操作是很成功
6.在第一次找到的地方打个断点,在全速运行,停住了,很直观,加密数据进来先替换一波,在解个密再转下类型。
7.于是进入解密内部分析,哟吼,AES,CBC,pkcs7,还有个iv,分析发现 l 是个固定值
8.多调试几遍后就可以进行扣代码了,把该扣的都扣下来,我们只是需要解密相关,但是你可能会因为this,n.default啥的不知道咋扣而选择整体扣,因为我也不知道....................................于是调试几遍后我就想用CryptoJS试试,
直接第一行写 var CryptoJS = require('crypto-js')
把n.default都替换成CryptoJS,扣好并修改好的代码如下:
function aes_decrypt(e) { var l = '0a1fea31626b3b55' return d(l, e) } function d(e, l) { e = CryptoJS.enc.Utf8.parse(e); var a = CryptoJS.AES.decrypt(l, e, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: e }); return CryptoJS.enc.Utf8.stringify(a) } function decrypted(e) { e = aes_decrypt(e.replace(/^\s+|\s+$/gm, "")) //e = JSON.parse(e) return e }
再复制个请求得到的加密数据打印看看,完美解密。
返回数据解密分析完了,下面就该分析加密参数到底是什么。
没错这次咱也直接hook
首先一个对象先转为字符串,再加密,想想这次我们应该hook什么
..................此处分析省略一万字........
.........................................................
.........................................................
.........................................................
以下直接给出代码:
function p(e, l) { return e = CryptoJS.enc.Utf8.parse(e), l = CryptoJS.enc.Utf8.parse(l), CryptoJS.AES.encrypt(l, e, { mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: e }).toString() } function k(e) { var l = '55b3b62613aef1a029bd7231109e051d' return l = 0 == e ? l.substring(0, 16) : l.substring(16, 32) } function encrypted(e) { e = JSON.stringify(e) return p(k(0), e) }
当然了有了参数加密的,是不是该有个参数解密的,写写吧,其实已经有答案了。