可知平台pdf下载,仅支持pdf格式资源下载。
- 3.47824973d763f5ca60a4.1583439609949.js
原始js,地址https://cdn.keledge.com/web/static/js/3.47824973d763f5ca60a4.1583439609949.js
- nice.js
使用http://www.jsnice.org/对原始js解密得到,无法直接使用,可以用来与nice2.js对比分析逻辑。
为什么无法使用?
代码中使用toString将函数转化为文本,使用re对函数的文本形式进行了检查。。。骚操作!示例
- nice2.js
实际overwirte使用的js。
使用直接从Step 3开始即可!
https://gateway.keledge.com/transfer/aqr/authorize
在nice.js中:
"success": function(data) {
if (data["Success"]) {
if (data["Data"]["RequireAccessToken"] && !result["$cookies"]["get"]("access_token")) {
return result["setLogin"]("login", result[a26_0x4551("0x3b")]);
}
result["impoweRes"] = data["Data"]["SplitFiles"];
result["tempRes"] = result["impoweRes"];
result["AllowReadPercentage"] = data["Data"]["AuthorizeStrategy"]["AllowReadPercentage"];
result["authorKey"] = result[a26_0x4551("0x58")](data["Data"]["Key"]);
result["numberOfPages"] = data["Data"]["NumberOfPages"];
self["resolve"](data);
} else {
if (34 == data["Code"]) {
result["$router"]["replace"]({
"path": "/login",
"query": {
"redirect": result["$route"]["fullPath"]
}
});
} else {
result["closeView"](data["Description"]);
}
}
}
在nice2.js中添加Hook output_authorize:
case 7:
return codeGeneratorFunc = node["sent"], ast = CryptoJS["enc"]["Utf8"]["parse"](this["v"]["authorKey"]), generatedCode = CryptoJS["AES"]["decrypt"](codeGeneratorFunc, ast, {
"mode": CryptoJS["mode"]["ECB"],
"padding": CryptoJS["pad"]["Pkcs7"]
}), node["next"] = 12, this["wordArrayToU8"](generatedCode, flightPhase, refresh);
在nice2.js中
case 0x7:return _0x322189=_0x2d73dd['\x73\x65\x6e\x74'],_0x3ae007=CryptoJS['\x65\x6e\x63']['\x55\x74\x66\x38']['\x70\x61\x72\x73\x65'](this['\x76']['\x61\x75\x74\x68\x6f\x72\x4b\x65\x79']),_0x10fe46=CryptoJS['\x41\x45\x53']['\x64\x65\x63\x72\x79\x70\x74'](_0x322189,_0x3ae007,{'\x6d\x6f\x64\x65':CryptoJS['\x6d\x6f\x64\x65']['\x45\x43\x42'],'\x70\x61\x64\x64\x69\x6e\x67':CryptoJS['\x70\x61\x64']['\x50\x6b\x63\x73\x37']}),_0x2d73dd['\x6e\x65\x78\x74']=0xc,this['\x77\x6f\x72\x64\x41\x72\x72\x61\x79\x54\x6f\x55\x38'](_0x10fe46,_0xe8aca2,_0x1a2353);
在nice2.js中添加Hook output_password之后:
case 0x7:var ast=CryptoJS['\x65\x6e\x63']['\x55\x74\x66\x38']['\x70\x61\x72\x73\x65'](this['\x76']['\x61\x75\x74\x68\x6f\x72\x4b\x65\x79']);output_password(ast);return _0x322189=_0x2d73dd['\x73\x65\x6e\x74'],_0x3ae007=CryptoJS['\x65\x6e\x63']['\x55\x74\x66\x38']['\x70\x61\x72\x73\x65'](this['\x76']['\x61\x75\x74\x68\x6f\x72\x4b\x65\x79']),_0x10fe46=CryptoJS['\x41\x45\x53']['\x64\x65\x63\x72\x79\x70\x74'](_0x322189,_0x3ae007,{'\x6d\x6f\x64\x65':CryptoJS['\x6d\x6f\x64\x65']['\x45\x43\x42'],'\x70\x61\x64\x64\x69\x6e\x67':CryptoJS['\x70\x61\x64']['\x50\x6b\x63\x73\x37']}),_0x2d73dd['\x6e\x65\x78\x74']=0xc,this['\x77\x6f\x72\x64\x41\x72\x72\x61\x79\x54\x6f\x55\x38'](_0x10fe46,_0xe8aca2,_0x1a2353);
解密pdf方法:
openssl enc -d -aes-128-ecb -K 406c322141214d6e4e446e505450386c -in enc.pdf -out dec.pdf
原理:利用Chrome插件重定向Js地址到我们fake的Js, 保存图书信息以及加密密码。
Source: https://cdn.keledge.com/web/static/js/3.47824973d763f5ca60a4.\S+.js 此地址已无效,为了提高门槛,此地址不再更新!
Destination: https://raw.githack.com/ygcaicn/keledge/master/nice2.js
Kind: regexp
Source/Destination均无需改动,直接copy即可。
使用脚本需要登陆帐号对全文有访问权限!
Or online Rule: https://raw.githubusercontent.com/ygcaicn/keledge/master/Gooreplacer.json
原理:解析Step 3保存的authorize.txt下载加密的pdf,然后使用passwd.txt保存的密码解密生成pdf。
usage: main.py [-h] -a AUTHORIZE_FILE [-p PASSWD_FILE] [-t SLEEP]
optional arguments:
-h, --help show this help message and exit
-a AUTHORIZE_FILE authorize file
-p PASSWD_FILE passwd file
-t SLEEP sleep time in second
解密pdf依赖系统openssl,windows平台下自行安装解决!
./main.py -a ~/Downloads/1583695806_authorize.txt
无人监管下载:
使用-t可以指定下载休眠时间,防止下载过快导致下载失败。当脚本检测到未完全成功下载时会提示是否再次尝试,默认等待时间1分钟,会自动再次尝试下载。
例如在夜间进行自动化下载:
./main.py -a ~/Downloads/x1_authorize.txt -t 300
./main.py -a ~/Downloads/x2_authorize.txt -t 300
./main.py -a ~/Downloads/x3_authorize.txt -t 300
or(Linux):
apt install mupdf-tools
cd xxx_dec
ls *.pdf | sort -n | xargs mutool merge -o xxx.pdf
合并的pdf是没有目录的,由于大部分pdf都是文字版的,目录比较好处理,Windows下可以使用:pdgcnteditor
Linux/Mac: https://github.com/ygcaicn/pdf_toc