简单介绍:html
最近作研究js混淆加密,以openlaw做为网站进行学习研究。openlaw主页裁判文书栏中有大量案件信息,同时可以为客户提供标准的法律专业知识以及智慧和经验成果。过程当中遇到一些反爬措施,记录下来。须要抓取的页面以下:python
发现问题:chrome
利用chrome浏览器清除cookie模拟第一次访问,发现存在cookie:浏览器
利用Fiddler抓包解析,用户第一次访问会发送两次请求:服务器
第一次请求返回加密的js用于生成cookie同时携带cookie发送第二次请求返回正常数据:cookie
分析cookie构造:session
s_token和_003相同,SESSION第一次请求获得服务器传到客户端的响应头Set-Cookie,因此只须要找到c_token生成方式用python模拟便可破解,感受但愿就在眼前。app
破解流程:学习
一:新建html文件将第一次请求返回源码js格式化后复制,同时在js的最低端加上debugger并在chrome中打开网站
利用Console功能进行js代码解析。只有$表示的第三段代码可能和c_token有关系,获得相对应的参数:
其中$.$表示Function从而将方法中代码进行调试:
获得对cookie加密JS代码,获得c_token以及s_token生成过程:
以后经过python模拟js进行c_token的生成,和c_token彻底同样,至此觉得破解完毕。
但是,经过正则提取_003模拟生成c_token以后添加cookie发送请求,出乎意料的未抓到想要的数据,再次重复解析JS生成c_token过程,发现js代码生成token参数不断变化致使没法经过固定的python方式模拟生成.
二:想到经过PyV8(Python2)或者PyExecJS(Python3)来执行每次请求返回的js代码以生成cookie,添加到请求头中。至于PyV8和PyExecJS的安装和使用教程自行百度吧!博主用的PyExecJS.直接上源代码吧。
import requests import re import execjs import time from get_proxy import func_proxy ip_list = [] header1 = { 'Host': 'openlaw.cn', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } # 代理ip ip_list.append(func_proxy()) resp = requests.get(url='http://openlaw.cn/judgement/a66ac059bf924212a9b90f740e098060', proxies=ip_list[0],headers=header1) content = resp.text #带有js混淆加密内容html标签 print(content) # 第一次请求服务端返回的SESSION session1 = resp.headers['Set-Cookie'].split("=")[1].split(';')[0] # 生成token的必要参数,正则提取 js1 = re.findall(r'_003(\s{1})=(\s{1})(.*?);', content, re.S)[0][2] # 主要的js混淆加密代码,正则提取 js2 = re.findall(r'\$\.\$\(\$\.\$\(\$\.\$\$\+(.*?)\)\(\)\)\(\);', content, re.S)[0] file = "jube.js" # 加载js文件, ctx = execjs.get().compile(open(file, encoding='utf-8').read()) data = ctx.call('Encrypted', js2) func_js = data[213:-196] # 执行生成c_token的方法,返回c_toke ctx2 = execjs.compile(func_js).call('_a', eval(js1)) header1 = { 'Host': 'openlaw.cn', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Cookie': 's_token=%s; c_token=%s; SESSION=%s' % ( eval(js1), ctx2, session1), 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Referer': 'http://openlaw.cn/judgement/a66ac059bf924212a9b90f740e098060' } resp = requests.get(url='http://openlaw.cn/judgement/a66ac059bf924212a9b90f740e098060', proxies=ip_list[0],headers=header1) print(resp.content.decode())
破解混淆加密所须要的固定js参数文件
function Encrypted(code) { $ = ~[]; $ = { ___: ++$, $$$$: (![] + "")[$], __$: ++$, $_$_: (![] + "")[$], _$_: ++$, $_$$: ({} + "")[$], $$_$: ($[$] + "")[$], _$$: ++$, $$$_: (!"" + "")[$], $__: ++$, $_$: ++$, $$__: ({} + "")[$], $$_: ++$, $$$: ++$, $___: ++$, $__$: ++$ }; $.$_ = ($.$_ = $ + "")[$.$_$] + ($._$ = $.$_[$.__$]) + ($.$$ = ($.$ + "")[$.__$]) + ((!$) + "")[$._$$] + ($.__ = $.$_[$.$$_]) + ($.$ = (!"" + "")[$.__$]) + ($._ = (!"" + "")[$._$_]) + $.$_[$.$_$] + $.__ + $._$ + $.$; $.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$; $.$ = ($.___)[$.$_][$.$_]; data = eval(eval(code)); return data }
openlaw网站js混淆加密实验的结果以下
参考博客:https://zhuanlan.zhihu.com/p/32344678
本博客仅用于学习研究,切勿用于商业用途