【python爬虫】js逆向分析及AES解密

2023-11-01

一、原理简述:

1.首先查看需要获取的数据即热门评论是否在源代码中,如果在源代码中就可以直接xpath等方式进行抓取

2.但是发现在网页和框架源代码里面都无法搜到评论内容,此时,使用网络抓包工具即:查看network中的XHD,在js代码中:get?csrf_token=中找到了hotComments

3.同时可以在headers里得到get包里请求的url,在payload中可以看到传递了两个加密的参数:params,encSecKey,说明真实的参数params是被加密了,网页收到后会根据这个key还原真实的参数,还原出来之后再去做解锁呀,查询等各种的操作

4.所以我们爬评论的话,首先需要想办法找到没加密之前数据以及加密过程,然后在我们的程序里来模拟网易的加密过程,进行手工加密,加密完成后再进行传递

5.因此,我们打开initiator逐个查找加密时是在哪个js里面

callstack为调用栈,这是一个当请求发送至get?csrf_token=时,程序经过哪些js脚本执行的过程,栈帧从下至上传递的,因此请求从底部开始调用至第一条最后发送到get?csrf_token=,因此我们可以看到调用过程

 6.首先查看第一条即:最后执行的动作(美化一下js代码)

7. 可以看到在此处,程序将请求send出去:

 8.在此处打断点,刷新页面可以查看断点之前程序执行函数的所有变量,发现request请求的url并不是我们需要的get?csrf_token=,所以放开进行下一次拦截:

9.最后找到目标js: 可以看到data被加密了,也就是说该函数所执行的为加密数据

10.因此需要逐个回查,查看e8e的data在进入该函数前的哪个函数中的data为未加密数据,同样,在callstack中往下挨个查看data是否被加密,可以看到d8f参数依旧被加密,因此继续慢慢查找。 

11.最终查找到这个函数的时候发现数据在此时为未加密数据,在进入t8l.be8W函数之后data进行了加密:

 12.因此我们回到t8l.be8W,查看参数在哪个阶段进行了加密。在t8l.be8W函数处重新打断点,刷新页面(breakpoint中释放原来的端断点),同样方法找get  13.但此时数据依旧未加密,因此执行"下一步",直到找到加密数据 

 加密数据找到在这里:

14.因此在此函数之前的函数打断点,重新刷新:

i8a里是我们的真实参数,进行下一步可以看到bVj2x有数据,也就是说:当参数i8a传递进入window.asrea进行加密,执行之后得到两个参数encseckey和enctext。

 15.接着看函数,可以看到,这两个参数被重新传递给了e8e的data中的params和encSecKey:因此,关键点找到了,我们需要的params和其实就是encText和encSecKey

e8e.data = j8b.cq8i({
                params: bVj2x.encText,
                encSecKey: bVj2x.encSecKey

二、加密过程分析:

1.接下来就是第二步,正向加密,在此之前需要逆向查找到加密函数,发现是d赋值给了windows.asrea,因此加密函数为d

2.此时需要找到函数的参数d,e,f,g,可以查看windows.asrea函数:

var bVj2x = window.asrsea(JSON.stringify(i8a), bsR7K(["流泪", "强"]), bsR7K(Xp4t.md), bsR7K(["爱心", "女孩", "惊恐", "大笑"]));

可得:

JSON.stringify(i8a)==>d
bsR7K(["流泪", "强"])==>e
bsR7K(Xp4t.md)==>f
bsR7K(["爱心", "女孩", "惊恐", "大笑"])==>g

带入终端执行发现e,f,g为固定值


3.分析加密函数:

    function a(a) {    //返回随机的16位字符串
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1)   //循环16次
            e = Math.random() * b.length,   //e为随机数处理值
            e = Math.floor(e),    //取整:floor函数表示对x 的向下取整,返回≤x的最大整数
            c += b.charAt(e);     //取b的第e个数:charAt函数返回某个索引下的char值
        return c
    }
    function b(a, b) {
        var c = CryptoJS.enc.Utf8.parse(b)
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a)
          , f = CryptoJS.AES.encrypt(e, c, {
            iv: d,
            mode: CryptoJS.mode.CBC
        });
        return f.toString()
    }
    function c(a, b, c) {    //一个加密算法(因为没有随机数产生,所以可以逆向)
        var d, e;
        return setMaxDigits(131),
        d = new RSAKeyPair(b,"",c),
        e = encryptedString(d, a)
    }
    function d(d, e, f, g) {
        var h = {}  //空对象
          , i = a(16);   //查看a函数
        return h.encText = b(d, g),   //h.encText返回的为params
        h.encText = b(h.encText, i),    //h.encSecKey返回的为encSecKey
        h.encSecKey = c(i, e, f),     //c由i决定,若将i固定则c固定,因此将i设置成定值
        h
    }
    function e(a, b, d, e) {
        var f = {};
        return f.encText = c(a + e, b, d),
        f
    }

4.因此需要固定encText和encSeckey:

1)获取encText

经过分析函数可知,encText进行了两次加密:

 return h.encText = b(d, g),   
 h.encText = b(h.encText, i)

首先将d和g进行函数b的运算,将返回的结果再和随机数i进行加密即为params

此时回到函数b,可知:

function b(a, b) {   
        var c = CryptoJS.enc.Utf8.parse(b)    //utf8转换
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a)
          , f = CryptoJS.AES.encrypt(e, c, {   //AES加密算法
            iv: d,   //iv为AES加密的偏移量
            mode: CryptoJS.mode.CBC   //CBC加密模式
        });
        return f.toString()   //返回字符串

a为原始数据即需要加密的内容,f为AES加密算法,传递的参数为e,c,iv
e:utf转换后的a,因此推理可知c为密钥,所以b为原始密钥

因此,逆向回到第一步,return h.encText中,g和i为原始密钥,d为偏移量

2)获取encSeckey:

重点是找到i的值:

此时,在h.encText = b(h.encText, i)处打断点,刷新界面,一直放到该断点处,可以获取到i值:

5.同时在e8e.data打断点放行,可以得到该i值下的encSeckey的值:

三、脚本撰写

注意两点:

1.构造加密函数时,由于参数的属性(按住ctrl点击函数可以查看到需要的参数),所以key要进行字节转换。

2.因为加密后数据不能被decode("utf-8")识别,不能直接转换成字符串,同时,加密内容必须为16倍数的字符串,具体原因参考AES加密规则,因此需要进行数据处理

def to_16(data):
    pad = 16-len(data) % 16
    data += chr(pad) * pad
    return data

成功爬取评论:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python爬虫】js逆向分析及AES解密 的相关文章

随机推荐

  • [ MySQL ] — 常见函数的使用

    目录 日期函数 current date 获取当前日期 current time 获取当前时间 current timestamp 获取当前时间戳 date 获取参数的日期部分 编辑 date add 在日期或时间的基础上进行增加 date
  • python期末考试之判断题(含部分解析)

    列表对象的排序方法sort 只能按元素从小到大排列 不支持别的排序方式 X sort方法可升序 可降序 形参可以看做是函数内部的局部变量 函数运行结束之后形参就不可访问了 一个函数如果带有默认值参数 那么必须所有参数都设置默认值 表达式 a
  • 全连接神经网络实现MNIST手写数字识别

    在对全连接神经网络的基本知识 全连接神经网络详解 学习之后 通过MNIST手写数字识别这个小项目来学习如何实现全连接神经网络 MNIST数据集 对于深度学习的任何项目来说 数据集是其中最为关键的部分 MNIST数据集是美国国家标准与技术研究
  • 云计算的三个主要服务模型:IaaS、PaaS 和 SaaS

    文章目录 介绍 基础设施即服务 Infrastructure as a Service IaaS 平台即服务 Platform as a Service PaaS 软件即服务 Software as a Service SaaS 区别 基础
  • 物理服务器、虚拟服务器、虚拟主机、云服务器的区别

    物理服务器 一台实实在在物理机 服务器性能和稳定性比普通PC强 但是价格昂贵 一般有钱的大佬才会使用独立的物理服务器 就是需要自己实实在在买一台设备放在那里 性能强 但是无论用还是不用 机器和网络等成本都在那里 虚拟专用服务器 Virtua
  • 2021年计算机保研-假211真双非三无的失败保研经历(武大/复旦/计算所/华科/同济/上交)

    从知乎 吵鸡凶鸭OvO转过来啦 文章目录 一 个人情况 二 投递情况 1 夏令营 2 预推免 3 前车之鉴 三 复试经历 1 武汉大学 测绘遥感信息工程国家重点实验室 2 复旦大学 工程与应用技术研究院 3 中科院计算所 网络数据科学实验室
  • Linux的远程访问操作遇到的问题

    1 使用命令 ifconfig出现错误 原因是没有安装相关工具 输入命令sudo apt install net tools 提示为E 无法下载 http dk archive ubantu com ubantu dists xenial
  • 【通览一百个大模型】UL2(Google)

    通览一百个大模型 UL2 Google 作者 王嘉宁 本文章内容为转载或整理 仓库链接 https github com wjn1996 LLMs NLP Algo 订阅专栏 大模型 NLP 算法 可获得博主多年积累的全部NLP 大模型和算
  • mysql中的declare_sql中declare是什么意思

    展开全部 sql中declare是声明的意思32313133353236313431303231363533e58685e5aeb931333365653236 就是声明变量的 这个一般是用在函数和存储过程中的 比如说 这个存储过程是 只要
  • python数组的操作(访问)

    Python 自带的list print python自带的list集合 list1 list range 20 print list1 list2 list1 1 10 2 从开始下标1开始截取 下标到10结束 间隔2个 print li
  • 快速创建ES集群

    win10 中docker 设置 快速创建集群 访问 官网 elasticsearch docs reference setup install docker at main elastic elasticsearch GitHub 负责上
  • 上海控安成功举办普陀区科普创新专项智能网联车学术活动

    12月25日 由上海控安主办的上海市普陀区科普创新专项 智能网联汽车不神秘 学术交流活动顺利举办 活动现场座无虚席 齐聚汽车从业人员 汽车爱好者 青年学生近百人 共同探究未来汽车产业的变革 普陀区科委相关代表列席活动 上海工程技术大学电子电
  • Python学习基础系列----了解python

    了解python 1 了解Python Python是一种解释型 这意味着开发过程中没有了编译这个环节 面向对象 支持面向对象的风格或代码封装在对象的编程技术 动态数据类型的交互式 可在命令行中通过Python提示符及直接代码执行程序 高级
  • MATLAB 正则表达式

    MATLAB 正则表达式 文章目录 MATLAB 正则表达式 与正则表达式相关的函数 regexp 用法 输出类型 如何构建 exp 元字符 字符转义 重复限定符 重复限定符的三种模式 分组运算符 锚点 选项 option 例子 与正则表达
  • JS求数组中最大值

    法一 function getArrMax arr var max arr 0 for var i 1 i lt arr length i if arr i gt max max arr i return max getArrMax 1 2
  • angular总结-my

    angular知识点 1 Component 装饰器 这表明它下面的类是一个组件 它提供了有关该组件的元数据 包括它的模板 样式和选择器 在 Component 的元数据中指定的样式只会对该组件的模板生效 2 Angular 只会绑定到组件
  • sideload刷机

    官方Recovery自带了sideload刷机选项 方便了手机出故障的机友自行恢复 转载请标明出处IUNI官方论坛 bbs iunios com http bbs iunios com thread 28244 1 1 html 一 刷前准
  • [Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效

    该系列文章是讲解Python OpenCV图像处理知识 前期主要讲解图像入门 OpenCV基础用法 中期讲解图像处理的各种算法 包括图像锐化算子 图像增强技术 图像分割等 后期结合深度学习研究图像识别 图像分类应用 希望文章对您有所帮助 如
  • Python Web系列学习3-Tornado

    1 Tornado常被用作大型站点的接口服务框架 协程是Tornado推荐的编程方式 Tornado集成了丰富的用户身份验证功能 2 同步I O可以理解为被调用的I O函数会阻塞调用函数的执行 而异步I O则不会 tornado httpc
  • 【python爬虫】js逆向分析及AES解密

    一 原理简述 1 首先查看需要获取的数据即热门评论是否在源代码中 如果在源代码中就可以直接xpath等方式进行抓取 2 但是发现在网页和框架源代码里面都无法搜到评论内容 此时 使用网络抓包工具即 查看network中的XHD 在js代码中