Py学习  »  Python

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

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


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
 
207 次点击