首页 > 其他分享 >一个案例入门补环境

一个案例入门补环境

时间:2024-10-16 11:48:07浏览次数:1  
标签:入门 代码 环境 案例 proxy array property data

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

反爬前置信息

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

破解结果预览

image

何谓补环境

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

反爬机制

站点有两个反爬项,请求体加密响应结果解密
image
image

逆向研究

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

找到接口的调用堆栈,点击下面图片标识的堆栈进入代码
image

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

然后在1处打上断点重新发起请求,点击2处进入函数引用代码位置
image

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

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

注意直接拿全部代码,不要格式化
image

补环境

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

补好window环境后再次运行报下面所示错误,继续补navigator
image

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

补好exports后就不会报错了
image

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

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

ok,这里测试的响应文本解密也成功了,也就说明咱们补好了。
image

补环境补充-挂代理

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

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

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

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

function getEnv(proxy_array) {
    for (var i = 0; i < proxy_array.length; i++) {
        handler = `{\n
            get: function(target, property, receiver) {\n
                   console.log('方法:get','    对象:${proxy_array[i]}','    属性:',property,'    属性类型:',typeof property,'    属性值类型:',typeof target[property]);
                   return target[property];
            },
            set: function(target, property, value, receiver){\n
                    console.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});
            }
        `)
    }
}

这样它会打印出调用的对象、属性等信息,这不就清晰多了。
image

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

代码展示

import json
import subprocess
from functools import partial

import requests

subprocess.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)

标签:入门,代码,环境,案例,proxy,array,property,data
From: https://www.cnblogs.com/ranbox/p/18469586

相关文章

  • Kotlin 入门教程:流程控制
    我们有时希望程序能够根据不同的条件来决定是否执行某些代码段(条件判断),或者反复执行某段代码直到满足特定条件为止(循环),这些功能的实现方式统称为「流程控制」;本文介绍Kotlin的流程控制。本文出现的所有代码均可在Kotlin官方在线代码调试器运行,部分代码下方也会提供链接......
  • CentOS高可用运维案例之---配置bond0
    案例说明:在CentOS7系统下,两个Server之间网卡部署bond0连接测试。系统版本:[root@node201~]#cat/etc/os-releaseNAME="CentOSLinux"VERSION="7(Core)"ID="centos"ID_LIKE="rhelfedora"VERSION_ID="7"PRETTY_NAME="CentOSLinu......
  • Office365 Exchange Hybrid No.02 环境准备
    Office365ExchangeHybridNo.02环境准备在实际的经验分享过程中重点部分会图文并茂,其他一些基础的配置我会以文字的方式进行说明。第一步:AD部署这一步其实是可以省略了,我本人也不想写,在51CTO上这样的文章一抓一大把。我着重介绍一下AD的环境吧:AD林:ucssi.intUPN后缀:ucssi......
  • jsp电子交易平台5ld4k程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目名称电子交易平台的设计与实现二、研究背景与意义随着互联网技术的飞速发展,电子商务已成为现代经济的重要组成部分。电子交易平台作为电......
  • jsp电影院在线售票系统rkj04--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称电影院在线售票系统的设计与实现二、研究背景与意义随着互联网技术的快速发展,线上购票已成为电影行业的主要趋势。本研究旨在设计并......
  • jsp电影评分网站系统t269d--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称电影评分网站系统的设计与开发二、研究目的与意义随着互联网和社交媒体的兴起,电影评分网站已成为影迷们分享观影体验、交流观点的重......
  • Exchange 2016与国内版O365混合部署(2):搭建域环境
    Exchange2016与国内版O365混合部署(2):搭建域环境安装DC:远程登录虚机后,打开servermanager,选择“addrolesandfeatures ”,一直下一步: 到"serverroles"这个环节,注意勾选ADDS和DNS两个选项,一直下一步,直到完成。 安装完成后,servermanager的右上角会弹出一个警告:升级......
  • C# 并发控制框架:单线程环境下实现每秒百万级调度
    前言在工业自动化和机器视觉领域,对实时性、可靠性和效率的要求越来越高。为了满足这些需求,我们开发了一款专为工业自动化运动控制和机器视觉流程开发设计的C#并发流程控制框架。该框架不仅适用于各种工业自动化场景,还能在单线程环境下实现每秒百万次以上的调度频率,从而从容应......
  • 【可白嫖源码】招聘管理系统(案例分析)
    摘 要    本文旨在设计与实现基于Node.js的招聘管理系统,旨在提升招聘流程的效率和便捷性。通过深入研究Node.js在Web开发中的优势和应用,结合招聘管理系统的需求,构建了一个功能强大、易于使用的系统。利用Node.js的非阻塞I/O、事件驱动等特性,实现了系统的高并发处理......
  • python+eel入门示例
    安装eelpipinstalleelpyimporteelimportrandom#笑话列表jokes=["为什么电脑经常生病?因为窗户(Windows)总是开着!","为什么数学书看起来总是很悲伤?因为它里面有太多的问题(problems)","为什么海洋里没有电脑?因为它们总是遇到短路(seals)","为什么冰......