目标网站:aHR0cHM6Ly93d3cuaG9uZ3NodS5jb20vY29udGVudC8xMTM3NzIvMjA1NDI1LTE0NTU1NzIuaHRtbA==
1.确定接口
抓包,确定内容都在bookajax.do包中,第一个ajax包中包含key,是第二步需要的参数;第二个包中需要用到content、other、nextcid。
直接copy curl,转换为python代码运行,发现只需要保持cid一致就可以请求成功,得到数据后就可以进行下一步了。
2.代码解密
第二次请求后得到的content和other很大,所以很可能数据存储在其中,需要先破解加密后确认推测是否正确。
由于content和other都是返回的加密后的字符串,而页面显示的是正常文字,所以肯定存在解密的js文件或者解密函数,直接全局搜索decrypt(,发现有结果,进去后再ctrl+f搜索content,确定解密位置。
data.content = utf8to16(hs_decrypt(basedecode(data.content), key));
代码中的加密函数在文件前面有定义,直接copy下来运行,可以跑通。content跑出来是一段包含中文的字符串,但不连贯,从网页检查发现context_kw8等是中文,所以存在字体反爬。
other解出来是一段js代码,有理由怀疑other解出来的代码是解密字体反爬的。
3.ast反混淆
将other解密后的代码写入js文件中,格式化(ctrl+alt+l),发现有许多混淆后的代码,仔细看看,是标准的ob混淆,那就用ast反混淆。(如果没有学过ast,请先学习再看)
我们的目的是将解密函数代替的字符串解出来。
将代码粘贴到,找到大数组,偏移函数、解密函数的节点。
导入babel库,将所需代码写入内存,测试是否可以运行。
可以运行,接下来就是对节点进行替换,利用ast的特性,编写规则。
可以看出解密函数部分的代码已解混淆。
4.字体反爬逆向
查看代码,发现words[i]即为原本字体,运行发现需要补document环境,搜索words发现并没有在包含document的代码中调用,直接把document部分删除。再运行,可以得到文字。
但是得到的结果不是我们想要的,原因有二:
1:需要判断document的type,控制台输出的document.type是错误的,在我们删除的第二行代码有。
2:还有一个判断语句,默认是走catch,我们需要的是走if。
在文件最前方加入以下代码可以完整运行,且可以得到正确答案。
let my_code0 = 'document = {\n' +
' \'type\': \'text/css\'\n' +
'};\n' +
'top = {\n' +
' \'window\':{\n' +
' \'location\':{\n' +
' \'href\':\'href0\'\n' +
'\n' +
' }\n' +
' }\n' +
'}\n' +
'window={\n' +
' \'location\':{\n' +
' \'href\':\'href1\'\n' +
'\n' +
' }\n' +
' }'
5.替换字符,得到数据
利用flashtext库进行字符串替换,将 span class=\'context_kw 替换成 gt;{原文}< ,方便正则提取。
替换之后运行,得到结果: