爬虫逆向学习(十二):一个案例入门补环境

server/2024/10/17 6:00:40/

此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理

反爬前置信息

站点:aHR0cDovLzEyMC4yMTEuMTExLjIwNjo4MDkwL3hqendkdC94anp3ZHQvcGFnZXMvaW5mby9wb2xpY3k=
接口:/xjzwdt/rest/xmzInfoDeliveryRest/getInfoDeliveryList

破解结果预览

在这里插入图片描述

何谓补环境

补环境其实是补浏览器有而Node没有的环境,即补BOMDOM的对象,一切环境补的结果都是向浏览器实际结果靠齐,入门补环境只需要记住缺啥补啥这个技巧,当运行提示缺少某个环境,则直接在浏览器运行该环境是啥结果然后补上该结果。
在这里插入图片描述

反爬机制

站点有两个反爬项,请求体加密响应结果解密
在这里插入图片描述
在这里插入图片描述

逆向研究

补环境处理的是关键代码,所以我们还是要定位到关键代码位置拿到关键代码

找到接口的调用堆栈,点击下面图片标识的堆栈进入代码
在这里插入图片描述

1处打上断点重新发起请求,在2处可以看到这里已经实现请求体加密了,那我们得往前走,也就是点击3处标识堆栈
在这里插入图片描述

然后在1处打上断点重新发起请求,点击2处进入函数引用代码位置
在这里插入图片描述

这里就能看到关键代码了,它重新封装了ajax,请求体加密响应结果解密都是在这里进行的
在这里插入图片描述

但是我们要补的不是这个位置,因为我们又不是直接构建请求的,我们要破解的只是加解密,所以要补的是window.sm2Util.encryptwindow.sm2Util.aesDecrypt,而它们都在sm2Util.js文件中,接下来我们直接补sm2Util.js代码就行。

注意直接拿全部代码,不要格式化
在这里插入图片描述

补环境

先直接运行代码,发现报下面所示错误,这是因为window不是Node的环境,这里一般是使用global替代
在这里插入图片描述

补好window环境后再次运行报下面所示错误,继续补navigator
在这里插入图片描述

补好navigator环境后再次运行报下面所示错误,这是因为在浏览器环境下exportsundefined,但是在Node环境下exportsObject对象,所以这里我们要处理
在这里插入图片描述

补好exports后就不会报错了
在这里插入图片描述

打印看看发现能拿到想要的方法了,这里就初步补好环境了,要确定是否真正补全了还得运行一下代码,我们就拿调试时拿到的请求体加密原文进行调试
在这里插入图片描述

ok,这里测试的请求体加密成功了,说明encrypt补好了,接下来测试下响应文本解密,直接拿接口返回的响应文本测试即可
在这里插入图片描述

ok,这里测试的响应文本解密也成功了,也就说明咱们补好了。
在这里插入图片描述

补环境补充-挂代理

上面讲解遇到缺失的环境都是对象本身,所以我们能直接知道缺了啥,然后对此做出处理。

但是如果缺失的是对象某个参数呢,比如下图所示我们是没法知道是哪个对象哪个参数出的问题的。大家可能会说不是有代码位置提示吗,但是这是在明文代码下能清楚提示,遇到混淆代码就不行了,所以我们需要挂代理
在这里插入图片描述

所谓挂代理其实就是使用Proxy对象,它是一种对象代理机制,可以在对象和函数之间添加一个中间层,从而实现对对象和函数的拦截和控制。

使用下面这段代码,添加想要监控的对象

function getEnv(proxy_array) {for (var i = 0; i < proxy_array.length; i++) {handler = `{\nget: function(target, property, receiver) {\nconsole.log('方法:get','    对象:${proxy_array[i]}','    属性:',property,'    属性类型:',typeof property,'    属性值类型:',typeof target[property]);return target[property];},set: function(target, property, value, receiver){\nconsole.log('方法:set','    对象:${proxy_array[i]}','    属性:',property,'    属性类型:',typeof property,'    属性值类型:',typeof target[property]);return Reflect.set(...arguments);}}`;eval(`try {${proxy_array[i]};${proxy_array[i]} = new Proxy(${proxy_array[i]}, ${handler});} catch (e) {${proxy_array[i]} = {};${proxy_array[i]} = new Proxy(${proxy_array[i]}, ${handler});}`)}
}

这样它会打印出调用的对象、属性等信息,这不就清晰多了。
在这里插入图片描述

我们在本案例测试,可以看到代码使用的全部环境了,然后看到哪些环境或者属性是undefined就把它补好。
在这里插入图片描述

代码展示

import json
import subprocess
from functools import partialimport requestssubprocess.Popen = partial(subprocess.Popen, encoding="utf-8")  # 修改全局编码
import execjs  # 必须在修改编码后引入with open('sm2Utils.js', 'r', encoding='utf8') as fr:str_data = fr.read()
js_code = execjs.compile(str_data)headers = {"Accept": "application/json, text/javascript, */*; q=0.01","Accept-Language": "zh-CN,zh;q=0.9","Content-Type": "application/json;charset=UTF-8","Origin": "Origin","Referer": "Referer","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36","X-Requested-With": "XMLHttpRequest","encrypt": "1"
}
url = "url "
params = {"foreSessionClusterIntercept": "true"
}
post_data = {"token": "Epoint_WebSerivce_**##0601","params": {"categuids": "4bcbbec7-2428-403a-8eed-b0db5c0e01a5", "titlename": "", "currpage": 0,"pagesize": 10}}
print('encrypt data: ', json.dumps(post_data, separators=(',', ':')))
data = js_code.call('encrypt', json.dumps(post_data, separators=(',', ':')))
print('encrypt result: ', data)
response = requests.post(url, headers=headers, params=params, data=data, verify=False)
print('request result: ', response.text)
decrypt_result = js_code.call('decrypt', response.text)
print('decrypt result: ', decrypt_result)

http://www.ppmy.cn/server/132410.html

相关文章

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP&#xff0b;MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密&#xff0c;其他开源可二开 演示源码下载 开…

学习 Python 的途径

学习 Python 有许多途径,以下是一些常见的学习方法: 1. 阅读官方文档: Python 官方文档是学习和参考 Python 的权威资源,详细介绍了 Python 的语法、标准库、以及各种高级特性。文档包含教程、语言参考和库参考等内容。 - [Python 官方文档](https://docs.python.org/z…

基于SpringBoot的宇宙动漫网站系统【附源码】

基于SpringBoot的宇宙动漫网站系统 效果如下&#xff1a; 系统首页界面 用户注册界面 动漫信息页面 公告信息页面 管理员登录主页面 管理员主界面 动漫信息管理界面 订阅信息管理界面 研究背景 随着互联网技术的飞速发展&#xff0c;动漫文化在全球范围内迅速传播&#xff0…

信息与计算科学:“数学 + 计算机”,奏响未来科技新乐章

在当今科技飞速发展的时代&#xff0c;有一个专业如同一颗闪耀的新星&#xff0c;散发着独特的魅力&#xff0c;那就是信息与计算科学专业。 一、专业全貌&#xff1a;追根溯源&#xff0c;领略交叉之美 &#xff08;一&#xff09;专业的诞生与发展 1998 年&#xff0c;教育…

Android Jetpack Compose中UI刷新的几种方式

Android Jetpack Compose中UI刷新的几种方式 在 Jetpack Compose 中,如果你想强制刷新 UI,可以使用 remember 和 mutableStateOf 来创建一个可观察的状态。当这个状态变化时,Compose 会自动重组 UI。以下是一些常见的方法来实现这一点: 1. 使用 mutableStateOf 你可以使…

Redis学习笔记:跳跃表

概述 跳跃表&#xff08;skiplist&#xff09;是一种有序数据结构。相比于普通的链表访问元素需要一步一步的向后查找&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找。R…

【无人机设计与控制】差异化创意搜索DCS求解无人机路径规划MATLAB

摘要 差异化创意搜索算法&#xff08;DCS&#xff09;是一种用于解决复杂优化问题的启发式算法&#xff0c;广泛应用于路径规划、机器学习和智能控制等领域。在本研究中&#xff0c;将 DCS 应用于无人机路径规划&#xff0c;以找到最佳路径并避免碰撞障碍物。实验结果表明&…

[LeetCode] 217. 存在重复元素

题目描述&#xff1a; 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 解释&#xff1a; …