当前位置: 首页 > news >正文

js逆向之断点调试和python补环境

1.XHR/提取断点用法

当刷新页面时候,有大量请求,并且你无法定位参数信息的时候,或者参数被混淆无法搜到,可以用该方法,该方法是会捕获所有请求连接,然后我们通过连接过滤出自己想要的请求,然后在调用堆栈中去回溯跟踪。(一般都是抓取最后一次请求)

在这里插入图片描述
步骤很简单,点击加号,然后把url连接关键词丢进去,触发网络请求,这个时候符合要求的就会被断住。

2.条件断点

右键断点小蓝块,然后点击修改断点
在这里插入图片描述

选择条件断点
在这里插入图片描述
写上自己的表达式,为true的时候就会被断住,条件表达式更灵活,不局限于网络请求url过滤

3.日志断点

在这里插入图片描述
在需要断点的地方,进行日志输出,观测值

4.监听JS代理封装

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

一般补环境的时候可以用,但是你也可以直接在html页面中调用JS,浏览器会给你返回错误信息。

5.使用浏览器自动化工具补环境

如果有些环境实在难补,就直接补个浏览器。单例模式运行 也还好,慢2不了多少,就第一次初始化慢点。

from playwright.sync_api import sync_playwright
import os
import json

class BrowserEnv:
    _instance = None  # 单例模式实例
    _browser = None  # 浏览器实例
    _page = None  # 页面实例

    def __new__(cls, *args, **kwargs):
        # 单例模式实现
        if cls._instance is None:
            cls._instance = super(BrowserEnv, cls).__new__(cls)
        return cls._instance

    def __init__(self):
        if not hasattr(self, '_initialized'):  # 避免重复初始化
            self._initialized = True
            self._launch_browser()

    def _launch_browser(self):
        """静默启动浏览器并初始化页面"""
        self._playwright = sync_playwright().start()
        self._browser = self._playwright.chromium.launch(headless=True)  # 静默启动
        self._page = self._browser.new_page()

    def open_html_page(self, url):
        """打开指定的HTML页面或URL"""
        if not url.startswith(("http://", "https://", "file://")):
            # 如果是相对路径,转换为绝对路径并使用 file:// 协议
            url = "file://" + os.path.abspath(url)
        self._page.goto(url)

    def close_browser(self):
        """关闭浏览器"""
        if self._browser:
            self._browser.close()
            self._playwright.stop()
            self._browser = None
            self._page = None

    def get_result(self, function_name, *args):
        """调用页面中的JavaScript函数并返回结果"""
        args_with_quotes = [json.dumps(arg) for arg in args]  # 自动处理字符串引号
        expression = f"{function_name}({','.join(args_with_quotes)})"
        result = self._page.evaluate(expression)
        #print("JavaScript函数返回值:", result)
        return result

    def __del__(self):
        """析构函数,确保浏览器被关闭"""
        self.close_browser()

调用

from BrowserEnv import BrowserEnv
# 初始化浏览器环境
browser_env = BrowserEnv()

# 打开一个HTML页面或URL
browser_env.open_html_page("./index.html")

sec_user_id ="MS4wLjABAAAAI3kAJk38MPTYlJA7qZxU9vdG3gK86MBqYDpWGO5Et1k";
# 调用页面中的JavaScript函数
result = browser_env.get_result("get_a_bogus", sec_user_id)  # 假设页面中有 myFunction(a, b, c)

print(result)
# 关闭浏览器(可选,析构时会自动关闭)
browser_env.close_browser()

相关文章:

  • Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!
  • [c语言日寄]数据输出
  • 【FPGA开发】Cordic原理推导、Xilinx PG105手册解读
  • 【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解
  • 一文读懂Python之json模块(33)
  • ABAP Core Data Services (SAP PRESS) (First Edition)
  • 蓝桥杯11届 蛇形填数
  • 电脑上不了网普通用户排除方法
  • 神聖的綫性代數速成例題19. 最小二乘法在線性代數中的應用、線性空間的直和分解及相關性質、矩陣的特徵值分解的拓展應用
  • Python | 如何在Pandas中删除常量列
  • 【蓝桥杯】4535勇闯魔堡(多源BFS + 二分)
  • 【euclid】20 2D包围盒模块(box2d.rs)
  • 《背影》再读:时光深处的温暖与感触
  • 深度学习框架中动态图和静态图是什么意思,如何通过keras和estmator实现?
  • Linux centos 7 vsftp本地部署脚本
  • 【软件架构论文范文:价值驱动的云原生架构在电商订单系统中的实践】
  • vue3 ts 请求封装后端接口
  • #C8# UVM中的factory机制 #S8.1.4# 约束的重载
  • Spring JDBC Template与事务管理:基于XML与注解的实战指南
  • 软件设计师-进制转换
  • 远洋集团:今年前4个月销售80.9亿元,同比增加13.62%
  • 获派驻6年后,中国驻厄瓜多尔大使陈国友即将离任
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 北京今日白天超30℃晚间下冰雹,市民称“没见过这么大颗的”
  • SIFF动画单元公布首批片单:《燃比娃》《凡尔赛玫瑰》等