Python爬虫-JS破解openlaw加密cookie

简单介绍:

    最近做研究js混淆加密,以openlaw作为网站进行学习研究。openlaw主页裁判文书栏中有大量案件信息,同时能够为客户提供标准的法律专业知识以及智慧和经验成果。过程中遇到一些反爬措施,记录下来。需要抓取的页面如下:

发现问题:

    利用chrome浏览器清除cookie模拟第一次访问,发现存在cookie:

利用Fiddler抓包解析,用户第一次访问会发送两次请求:

第一次请求返回加密的js用于生成cookie同时携带cookie发送第二次请求返回正常数据:

分析cookie构造:

s_token和_003相同,SESSION第一次请求得到服务器传到客户端的响应头Set-Cookie,所以只需要找到c_token生成方式用python模拟即可破解,感觉希望就在眼前。

破解流程:

一:新建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

本博客仅用于学习研究,切勿用于商业用途

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值