社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 爬虫逆向破解请求头加密参数:居然这么简单?这不科学啊?

未闻Code • 1 年前 • 229 次点击  


C

U

W

CODING UPGRADE WORLD

逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你详细地逆向分析请求头加密字段的构造逻辑,包括如何逆向分析、如何准确地找到加密入口、如何模拟执行JS等


特别声明本篇文章仅供学习与研究使用,不用做任何非法用途,相关URL和API等均已做脱敏处理,若有侵权请联系作者删除


目录

        一、逆向目标

        二、前期准备

        三、逆向分析

        四、模拟执行 JS


coding-real mind writing-genuine heart

作者:Maker陈    本文字数:1.3k   阅读时长≈2分钟    



01

逆向目标                               

逆向网站:

aHR0cHM6Ly9zb2xzY2FuLmlvL2xlYWRlcmJvYXJkL3Byb2dyYW0/cGFnZT0xJnJhbmdlPTMw


逆向接口:

aHR0cHM6Ly9hcGkuc29sc2Nhbi5pby92Mi9wdWJsaWNpemUvYWxs


02

前期准备                               

欲行其事,必先利其器,本期逆向实战需要 3 个第三方库:


用于模拟接口请求的:

pip install requests


用于模拟执行JS的:

pip install PyExecJS


用于存储数据的:

pip install pandas


03

逆向分析                              

进入该网站,使用开发者工具,进行接口分析:


该接口为:

https://api.小鸿爱摸鱼.io/v2/publicize/all


鼠标滑到最下面发现该接口拥有请求头加密字段:


Sol-Aut 加密的值为:

v257KTy4MWB9dls0fKZUyuXhZD8qMS0QdcGm9-b4


并且经过多次测试确认该请求头加密字段是动态变化的,意味着我们需要找出其中的加密逻辑


全局搜索

逆向分析中最简单直接的方式就是全局搜索,按快键键【Ctrl+Shift+f】搜索字符串 Sol-Aut:

运气不错,只有一个 JS 文件包含该请求头加密参数,点击找到其加密入口

由上图可知,this.randomString 就是加密位置,我们按快捷键【Ctrl+f】搜索该字符串,发现 this.randomString 是由 this.generateRandomString() 函数赋值的:

和上次操作一样,搜索字符串 generateRandomString 发现加密函数的代码块,全是 JS 的基本语法,不需要引入其他 JS 文件,也不需要引入什么包:



04

模拟执行 JS                         

根据之前的逆向分析,把相关的 JS 加密函数复制下来,保存为:header_encrypt.js 文件:

function generateRandomString() {
    let e = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789==--"
      , t = Array(16).join().split(",").map(function() {
        return e.charAt(Math.floor(Math.random() * e.length))
    }).join("")
      , r = Array(16).join().split(",").map(function() {
        return e.charAt(Math.floor(Math.random() * e.length))
    }).join("")
      , n = Math.floor(31 * Math.random())
      , o = "".concat(t).concat(r)
      , a = [o.slice(0, n), "B9dls02fK", o.slice(n)].join("");
    return a;
};

console.log(generateRandomString());


使用 Node.js 执行该 JS 文件查看控制台输出结果:


成功构造出请求头加密字段 Sol-Aut,经测试,该加密字符串是有效的


接下来只需要使用 PyExecJS 库模拟执行 JS 调用函数 generateRandomString() 即可获取请求头加密字段,相关代码如下:

import execjs


def encrypt_params():
    file = 'sol-aut.js'
    node = execjs.get()
    ctx = node.compile(open(file).read())
    js = f'generateRandomString()'
    sol_aut = ctx.eval(js)
    # sol_aur = ctx.call('generateRandomString')

    print(sol_aur)
    return sol_aut


输出结果和上面是一样的。


更多每日开发小技巧

尽在未闻 Code Telegram Channel !


END

未闻 Code·知识星球开放啦!

一对一答疑爬虫相关问题

职业生涯咨询

面试经验分享

每周直播分享

......

未闻 Code·知识星球期待与你相见~

一二线大厂在职员工

十多年码龄的编程老鸟

国内外高校在读学生

中小学刚刚入门的新人

“未闻 Code技术交流群”等你来!

入群方式:添加微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/170892
 
229 次点击