声明
本文仅供学习参考,请勿用于他途,违者后果自负
前言
笔者一直是一个小说控,喜欢看小说很多年了。自从学会了python后,就经常会去不同的小说网站抓取小说保存到本地阅读,最近发现一本很好看的小说,准备抓下来看,却发现有请求参数和返回的接口数据有加密!
参数分析
目标网站:
aHR0cHM6Ly93d3cuc2h1cWkuY29tL3JlYWRlcj9iaWQ9NzEwMjM5NCZjaWQ9ODI0NjA2
params中有一个sign
参数,32位长度,忙猜md5。响应数据比较长,暂不确定是什么加密,需要分析。
逻辑分析
首先来看sign
的生成,全局搜索关键字即可
在这里有一个sign
的加密,打下断点,刷新页面并没有断下来,看一下这个代码是怎么回事。
sign: $.md5("imei=" + h + "&platform=an&readChapters=1&sn=" + h + "×tamp=1234567890&userId=" + n + "&skey=8771731b23164da09a5b80c4d7e4c619").toUpperCase()
md5的加密,最后大写。但是URL参数中的sign并没有大写。说明不是在这里进行的加密,那跳过这个文件继续寻找,看到最后一个文件。
搜索sign会发现有一千多个。
而且最关键的是sign已经给出具体的数值了,不用再进行逆向处理了,简直了!
这个sign的分析就到此结束了。
继续看章节内容的加密逻辑,继续搜索关键字ChapterContent,进入文件。关键字比较有特点,所以一下子就找到了。
刷新,然后会断住。
解密函数传入密文,然后一系列的操作就可以得到明文了。
总体来说还是难度不大,细致即可。
扣代码
代码难度比较小,就直接附上了。码字不易,喜欢的可以给笔者点个赞。
function _decodeCont(t) {
return t = function(t) {
return t.split("").map(function(t) {
var e, i;
return t.match(/[A-Za-z]/) ? (e = Math.floor(t.charCodeAt(0) / 97), i = (t.toLowerCase().charCodeAt(0) - 83) % 26 || 26, String.fromCharCode(i + (0 == e ? 64 : 96))) : t
}).join("")
} (t),
function(t) {
var e, i, a, n, r, o, c, s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
d = "",
l = 0;
for (t = t.replace(/[^A-Za-z0-9\+\/\=]/g, ""); l < t.length;) n = s.indexOf(t.charAt(l++)),
r = s.indexOf(t.charAt(l++)),
o = s.indexOf(t.charAt(l++)),
c = s.indexOf(t.charAt(l++)),
e = n << 2 | r >> 4,
i = (15 & r) << 4 | o >> 2,
a = (3 & o) << 6 | c,
d += String.fromCharCode(e),
64 != o && (d += String.fromCharCode(i)),
64 != c && (d += String.fromCharCode(a));
return function(t) {
for (var e, i = "",
a = 0,
n = 0,
r = 0; a < t.length;) n = t.charCodeAt(a),
n < 128 ? (i += String.fromCharCode(n), a++) : n > 191 && n < 224 ? (r = t.charCodeAt(a + 1), i += String.fromCharCode((31 & n) << 6 | 63 & r), a += 2) : (r = t.charCodeAt(a + 1), e = t.charCodeAt(a + 2), i += String.fromCharCode((15 & n) << 12 | (63 & r) << 6 | 63 & e), a += 3);
return i
} (d)
} (t)
}