嗨皮漫画里的隐藏下载链接
目标分析
-
首先打开目标网站:嗨皮漫画
-
随便打开一部漫画:百炼成神漫画
-
再随便点开一章节:百炼成神-652话
-
F12打开调试,开始分析。
-
打开源代码,大概浏览找到突破。
-
-
-
-
开始分析里面每一个变量所代表的含义
-
-
总结以上分析就是, 我们只需要把ReadJs里面的dct方法扒下了就基本解决了问题。
-
在控制台双击以下最后的输出函数
-
-
12345678910111213141516171819202122232425262728293031323334353637383940
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定义的变量到控制台输出一些, 把其中的固定值替换掉
-
12
var
_0x5570f2 = _0x492c(
'0x3e'
,
'aLXy'
)[
'split'
](
'|'
) ----> [
"0"
,
"3"
,
"6"
,
"4"
,
"1"
,
"2"
,
"5"
]
_0x492c(
'0x3f'
,
'5a6s'
) ----> PBKDF2, 发现CryptoJS[]里面的东西其实就是加密函数里面的某个方法,换句话说就是一个固定
通过观察不难发现,其实这个dct方法就是按照上面的列表里面的值的顺序把case里面的东西执行一遍,整理一下最终简化后就是
-
1234567891011
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)
现在测试以下代码有没有得到想要的
最终代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # !/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' )) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库