除了一些类似字体反爬之类的奇淫技巧,js加密应该是反爬相当常见的一部分了,这也是一个分水岭,我能解决基本js加密的才能算入阶。
最近正好遇到一个比较简单的js,跟大家分享一下迅雷网盘搜索_838888
输入关键字,url变了https://838888.net/search/e8bf9be587bbe79a84e5b7a8e4baba-1-id-s.htm
咦~这key有点不对啊,很明显这不是常见的urlEncode编码,这里我也验证一下
In [1]: from urllib import parse
In [2]: parse.quote('进击的巨人',encoding='utf-8')
Out[2]: '%E8%BF%9B%E5%87%BB%E7%9A%84%E5%B7%A8%E4%BA%BA'
In [3]: parse.quote('进击的巨人',encoding='gbk')
Out[3]: '%BD%F8%BB%F7%B5%C4%BE%DE%C8%CB'
果然,猜测是某个js动态生成的。选择js,多刷几遍看看:
咦~这个base64有点可疑啊,直接将关键字base64一下
果然没这么简单,点开看下,,我发现了什么?这个url不就是我们搜索的url吗?
那么这个value也应该是这一串乱七八糟的字符咯,看这个value的生成,拿到id为'search'的值再 utf16to8() 再str2hex() 一哈。
OK,我们也不用很清楚这个utf16to8() 和 str2hex()主要是怎么运行的(当然想试下的可以看前面代码),可以按照它的方法调用然后生成这个url就好,have a try:)
先用js写个生成url的function
function change_url(str){
value = str2hex(utf16to8(str))
return value
}
然后用pyhton来调用
import execjs
file = 'base64.js'
def get_js():
f = open(file, 'r', encoding='UTF-8')
line = f.readline()
htmlstr = ''
while line:
htmlstr = htmlstr + line
line = f.readline()
return htmlstr
def get_key(key):
jsstr = Handler.get_js()
ctx = execjs.compile(jsstr)
return ctx.call('change_url',key)
这里用到了execjs这个包来调用js,测一下'进击的巨人',嗯,果然是这一串字符。
破解js是一条艰辛的道路,这篇文章并没有很多高超的技巧,我只是想通过这次实践说明并不是所有的js都是很难的,我们也并不需要很畏惧它,拥有一颗强者的心是很重要的!