嗨皮漫画里的隐藏下载链接
目标分析
-
首先打开目标网站:嗨皮漫画
-
随便打开一部漫画:百炼成神漫画
-
再随便点开一章节:百炼成神-652话
-
F12打开调试,开始分析。
-
打开源代码,大概浏览找到突破。
-
开始分析里面每一个变量所代表的含义
-
总结以上分析就是, 我们只需要把ReadJs里面的dct方法扒下了就基本解决了问题。
-
在控制台双击以下最后的输出函数
-
function dct(_0x3056e8, _0xc88342) { var _0x445376 = { 'uoYan': function _0x3a05cb(_0x1eaf87, _0x26f548) { return _0x1eaf87 / _0x26f548; } }; var _0x5570f2 = _0x492c('0x3e', 'aLXy')['split']('|') , _0x2e3990 = 0x0; while (!![]) { switch (_0x5570f2[_0x2e3990++]) { case '0': var _0x2c1614 = _0xc88342; continue; case '1': var _0x52c93f = CryptoJS[_0x492c('0x3f', '5a6s')](_0x3056e8, _0x3857a7, { 'hasher': CryptoJS[_0x492c('0x40', 'bLts')][_0x492c('0x41', 'vS2U')], 'keySize': _0x445376['uoYan'](0x40, 0x8), 'iterations': 0x3e7 }); continue; case '2': var _0x872444 = CryptoJS['AES'][_0x492c('0x42', 'jE0d')](_0x33163b, _0x52c93f, { 'iv': _0x1c5679 }); continue; case '3': var _0x33163b = _0x2c1614[_0x492c('0x43', 'qO)5')]; continue; case '4': var _0x1c5679 = CryptoJS[_0x492c('0x44', 'g[DF')]['Hex'][_0x492c('0x45', 'MQai')](_0x2c1614['iv']); continue; case '5': return _0x872444[_0x492c('0x46', 'F6X1')](CryptoJS[_0x492c('0x47', '$nWG')]['Utf8']); case '6': var _0x3857a7 = CryptoJS['enc'][_0x492c('0x48', 'aq3w')]['parse'](_0x2c1614['salt']); continue; } break; } },
-
分析以上代码, 把方法简化。把一些固定不变的结果替换掉。
-
首先执行ReadJs[_0x492c('0xda', 'MQai')](_0x16e8c8, ss) ,本质上就是执行了dct(_0x16e8c8, ss) , 然而 _0x16e8c8又是一个固定值,最终就是dct('c1zbnttrabim', ss)
-
然后再分析下dct方法, 把dct方法简化下。由上至下把一些var定义的变量到控制台输出一些, 把其中的固定值替换掉
-
var _0x5570f2 = _0x492c('0x3e', 'aLXy')['split']('|') ----> ["0", "3", "6", "4", "1", "2", "5"] _0x492c('0x3f', '5a6s') ----> PBKDF2, 发现CryptoJS[]里面的东西其实就是加密函数里面的某个方法,换句话说就是一个固定
通过观察不难发现,其实这个dct方法就是按照上面的列表里面的值的顺序把case里面的东西执行一遍,整理一下最终简化后就是
-
var a = CryptoJS.PBKDF2('c1zbnttrabim', CryptoJS.enc.Hex.parse(ss['salt']), { 'hasher': CryptoJS.algo.SHA512, 'keySize': 8, 'iterations': 999 }) var b = CryptoJS.AES.decrypt(ss['code'], a, { 'iv': CryptoJS.enc.Hex.parse(ss['iv']) }); // ReadJs['dct']('c1zbnttrabim', ss) data = JSON.parse(b['toString'](CryptoJS.enc.Utf8)) console.log(data)
现在测试以下代码有没有得到想要的
最终代码
# !/usr/bin/python3 # -*- coding: utf-8 -*- # Time : 2020/10/28 15:35 # Author : Amd794 # Email : 2952277346@qq.com # Github : https://github.com/Amd794 import re import execjs from threading_download_images import get_response class Happymh(object): @staticmethod def _happymh(detail_url): response = get_response(detail_url) ss = re.findall('var ss = ({.*?});', response.text)[0].replace('\\', '') ctx = execjs.get().compile(open('../js/_m_happymh.js').read(), cwd='../js/node_modules') data = ctx.call('getArr', eval(ss)) image_url = [d['url'] for d in data] return image_url if __name__ == '__main__': import sys sys.path.append('../js') print(Happymh._happymh('https://m.happymh.com/manga/read/bailianchengshen/1021588'))