【js逆向专题】4.python调用JS和扣代码

小节目标:

  1. 掌握 python调用js代码方式
  2. 熟悉 js开放接口进行调用
  3. 了解 补环境的基本概念
  4. 掌握 js调试技巧

一. pyexecjs的使用

1. 简介
  • PyExecJS 是一个 Python 库,用于在 Python 环境中执行 JavaScript 代码。它实际上是对 ExecJS 库的 Python 封装,ExecJS 本身是一个通用的 JavaScript 运行环境的抽象层。

  • 使用 PyExecJS,你可以在 Python 中执行 JavaScript 代码,而无需启动一个完整的 JavaScript 解释器。它的目标是提供一种简便的方式,使得在 Python 中嵌入 JavaScript 代码成为可能,特别是对于需要与 JavaScript 交互的项目而言。

  • git地址:https://github.com/doloopwhile/PyExecJS

  • 安装方式:

pip install PyExecJS  -i  https://pypi.tuna.tsinghua.edu.cn/simple/
2. execjs使用方式
  • 基本使用方法
import execjs  # 导入# 生成JavaScript运行环境,环境名可以指定
node = execjs.get()  # 安装nodejs后,会得到运行环境名为:Node.js (V8)with open('1111.js', encoding='utf-8') as f:js_code = f.read()# 编译js代码
ctx = node.compile(js_code)  # compile方法去加载js代码# 两种方式执行js函数
data1 = ctx.eval('get_data({"aa": "123"})')  # eval方法中,整个函数调用包含在字符串内
print(data1)
data2 = ctx.call('get_data', ['123'])  # call方法中,第一个参数是函数名(str),后面接参数
print(data2)

二. Express开放接口

1. Express简介
  • 官方给出的概念:Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。

  • 通俗的理解:Express 的作用和 Node.js 内置的 http 模块类似,是专门用来创建 Web 服务器的。

  • Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。

  • Express 的中文官网:http://www.expressjs.com.cn/

  • http 内置模块与 Express 类似于浏览器中 Web APIjQuery 的关系。后者是基于前者进一步封装出来的。

2. Express使用方式
  • 安装方式
npm install express -S
  • 创建服务器
// 1.导入 express
const express = require('express');// 2.创建 web 服务器
const app = express();// 3.get请求 req是请求对象  res响应对象
app.get('/user', function(req, res){// 调用express提供的res.send()方法,向客户端响应一个JSON对象res.send('hello world')
})
// 4.启动 web 服务器
app.listen(8080, function(){console.log('express server running at http://127.0.0.1:8080');
})
  • 获取url中携带的查询参数
  • 请求对象中会有query,不传请求查询参数就是空值
app.get('/', function(req, res){
//    通过req.query 可以获取到客户端发送过来的 查询参数
//    注意: 默认情况下,req.query 是一个空对象console.log(req.query)res.send(req.query)
})
  • express发送post请求
// 指定参数类型
app.use(express.json())
app.post('/api',function(req, res){res.send('Got a post request')
})

三. js调试技巧

1. 定位方法总结
  1. domxhr断点定位
  2. 关键字搜索(尽量符合可能在JS里面出现的形状 sign = sign: “sign”)
  3. 使用hook技术进行拦截
  4. 根据启动器去找调用关系(分析启动器是比较麻烦的,运气成分比较多)
2. 实战案例
1. 逆向目标
  • 目标网址:https://www.qimai.cn/rank/offline
  • 接口:https://api.qimai.cn/rank/offline?analysis=ew8vECUSNA54ZX4XKQt8TygiLhI0LT9MfWMqHCxTdxwrHlgANBMFSHo3KRt3XDcMBQ9FRDoWHkUCCgoWWQMACwEWHDoWBQZaVlEAAVNTUVg4Wkk%3D&status=3&date=2023-12-21&sdate=2023-12-21&edate=2023-12-21&country=cn&genre=36&option=4&page=2
2. 逆向分析
  • 定位加密位置

  • 尝试关键字搜索analysis

// 搜索不到的原因
1. 代码有做混淆
2. 关键字做拼接  
  • hook定位
(function () {var open = window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open = function (method, url, async) {if (url.indexOf("analysis") != -1) {debugger;}return open.apply(this, arguments);};
})();

在这里插入图片描述

  • 可以看到他的数据在第三个栈已经生成好了,说明代码是在异步的过程中加密的数据,但是异步执行的代码在栈堆里面是看不到的,在异步生成的过程有两个原因,第一个可能是在单纯的异步代码生成加密的,另一种可能是在拦截器里面生成的
  • 异步调试的方法,可以在发异步的位置下一个断点,先大致的过一点,先大致观察代码的执行的过程,前期可以先大致调试一下,大致知道数据在哪里生成之后就能精细化调整
  • 拦截器,向下调试找到响应拦截器,请求拦截器一般就是在响应拦截器的上面
  • 加密位置
  • e的值就是加密对应的数据
    在这里插入图片描述
3. 逆向代码
  • JavaScript代码
function o(n) {t = "",['66', '72', '6f', '6d', '43', '68', '61', '72', '43', '6f', '64', '65']['forEach'](function (n) {t += unescape("%u00" + n)});var t, e = t;return String[e](n)
}function v(t) {t = encodeURIComponent(t)["replace"](/%([0-9A-F]{2})/g, function (n, t) {return o("0x" + t)});return btoa(t)}function h(n, t) {for (var e = (n = n["split"](""))["length"], r = t["length"], a = "charCodeAt", i = 0; i < e; i++)n[i] = o(n[i][a](0) ^ t[(i + 10) % r][a](0));return n["join"]('')
}function get_analysis(a) {// var a = [1, '2023-12-21', '2023-12-21', '2023-12-21', 'cn', '36', 4, 3];a = a["sort"]()["join"]('')a = v(a)r = +new Date() - 4421027 - 1661224081041// r = 41932436257a = (a += "@#" + "/indexV2/getIndexRank") + ("@#" + r) + ("@#" + 3)console.log(a)var d = "xyz517cda96efgh"return v(h(a, d))
}aa = get_analysis(['0', '6014'])// console.log(aa)
  • python代码
import requests
import execjsheaders = {"origin": "https://www.qimai.cn","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}url = "https://api.qimai.cn/indexV2/getIndexRank"
params = {"setting": "0","genre": "6014"
}
with open('1111.js', encoding='utf-8') as f:js_code = f.read()
js = execjs.compile(js_code)
val = params.values()
analysis = js.call('get_analysis', list(val))
params['analysis'] = analysis
response = requests.get(url, headers=headers, params=params)print(response.json())

结语

以上就是关于js逆向技术中的python调用JS和扣代码全部内容了,欢迎同学在评论区讨论交流,有任何js逆向、数据采集相关需求也可以后台或V加regentwan与我联系哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413920.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Makefile入门

Makefile入门 文章目录 Makefile入门一、Makefile入门1.1 编译工具及构建工具介绍&#xff1a;1.2 编译的四个阶段&#xff1a;1.3 Makefile的认知&#xff1a;1.3.1 什么是Makefile&#xff1a;1.3.2 Makefile的规则与示例&#xff1a; 二、Makefile的基本语法&#xff1a;2.1…

Java注解和JDK新特性

1. 注解 1.1. 认识注解 Annotation&#xff1a;JDK1.5新提供的技术 编译检查&#xff1a;比如SuppressWarnings, Deprecated和Override都具有编译检查的作用替代配置文件&#xff1a;使用反射来读取注解的信息 注解就是代码里的特殊标记&#xff0c;用于替代配置文件&#…

内存管理篇-17解开页表的神秘面纱-下

1.页表初探遗留问题-页表的创建过程 使用MMU之前&#xff0c;页表要准备好&#xff0c;怎么准备的&#xff1f;如何把物理内存通过section映射构建页表页表的创建过程分析&#xff1a;__create_page_tables--创建临时页表&#xff0c;然后在开启MMU 页表的大小和用途页表在内存…

zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存

启动服务 import zdppy_api as api import zdppy_cachekey1 "admin" key2 "admin"app api.Api(routes[*zdppy_cache.zdppy_api.cache(key1, key2, api) ])if __name__ __main__:import zdppy_uvicornzdppy_uvicorn.run(app, host"0.0.0.0",…

Mac 安装Hadoop教程

1. 引言 本教程旨在介绍在Mac 电脑上安装Hadoop&#xff0c;便于编程开发人员对大数据技术的熟悉和掌握。 2.前提条件 2.1 安装JDK 想要在你的Mac电脑上安装Hadoop&#xff0c;你必须首先安装JDK。具体安装步骤这里就不详细描述了。你可参考Mac 安装JDK8。 2.2 配置ssh环境…

代码随想录 -- 字符串 -- 重复的子字符串

459. 重复的子字符串 - 力扣&#xff08;LeetCode&#xff09; 暴力解法&#xff1a; 思路&#xff1a; 假设子串 s 长度 n 为 i&#xff0c;从1到n/2遍历&#xff1a; 1. 如果 s 能够由他的子串重复构成&#xff0c;那么 s 的长度 n 一定整除其子串 s 的长度 n&#xff0c; …

结合Wireshark抓包实战,图文详解TCP三次握手及四次挥手原理(附下载)

网络安全的基础是网络&#xff0c;若连最基础的网络协议都搞不明白&#xff0c;何谈网络安全。针对核心的TCP协议&#xff0c;本文通过Wireshark工具抓取并分析TCP三次握手和四次挥手的详细过程&#xff0c;包括数据包捕获步骤&#xff0c;每个握手阶段和挥手阶段的数据包内容解…

数据分析处理库(pandas)

目录 数据预处理 数据读取 DataFrame结构 数据索引 创建DataFrame Series操作 数据分析 统计分析 pivot数据透视表 groupby操作 常用函数操作 Merge操作 排序操作 缺失值处理 apply自定义函数 时间操作 绘图操作 大数据处理技巧 数值类型转换 属性类型转换…

MediaGo下载器:专业级功能,轻松应对各种下载需求!

前言 在科技的浪潮中有这样一句名言&#xff0c;深刻地揭示了创新的力量&#xff1a;“创新是引领发展的第一动力。”正是这股不竭的动力&#xff0c;推动了无数软硬件产品的诞生与迭代&#xff0c;为我们带来了前所未有的便捷与体验。今天&#xff0c;我们要探讨的正是这样一…

C++ | Leetcode C++题解之第384题打乱数组

题目&#xff1a; 题解&#xff1a; class Solution { public:Solution(vector<int>& nums) {this->nums nums;this->original.resize(nums.size());copy(nums.begin(), nums.end(), original.begin());}vector<int> reset() {copy(original.begin(), …

重新修改 Qt 项目的 Kit 配置

要重新修改 Qt 项目的 Kit 配置&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 打开 Qt Creator 首先&#xff0c;启动 Qt Creator&#xff0c;确保你的项目已经打开。 2. 进入项目设置 在 Qt Creator 中&#xff0c;点击菜单栏的 “Projects” 标签&#xff08;通…

Java并发编程面试必备:如何创建线程池、线程池拒绝策略

一、线程池 1. 线程池使用 1.1 如何配置线程池大小 如何配置线程池大小要看业务系统执行的任务更多的是计算密集型任务&#xff0c;还是I/O密集型任务。大家可以从这两个方面来回答面试官。 &#xff08;1&#xff09;如果是计算密集型任务&#xff0c;通常情况下&#xff…

中仕公考怎么样?公务员考试什么时候补录?

公务员考试补录的时间和方法通常因地区和职位的不同有所区别&#xff0c;一般来说&#xff0c;这一过程会在面试、体检和考核环节完成后启动。 如果在招录过程中出现职位空缺或者并未全部招满的情况&#xff0c;就会进行补录。用人单位会通过其官方或公告形式公布相关信息&…

关于武汉芯景科技有限公司的实时时钟芯片XJ8337开发指南(兼容DS1337)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.时钟功能 2.闹钟功能&#xff08;两个闹钟&#xff09; 3.振荡器停止控制 4.频率输出&#xff08;1HZ、1.096KHZ、8.192KHZ、32.768KHZ&#xff09; 5.振荡器停止检测 6.闹钟中断标志 四、程序代…

短时傅里叶变换(Short-Time Fourier Transform, STFT),语音识别

高能预警&#xff01;&#xff01;&#xff01; .wav文件为笔者亲自一展歌喉录制的噪声&#xff0c;在家中播放&#xff0c;可驱赶耗子&#xff0c;蟑螂 介绍 短时傅里叶变换&#xff08;Short-Time Fourier Transform, STFT&#xff09;是一种时频分析方法&#xff0c;用于…

如何在银河麒麟操作系统中为文件加锁与解锁

如何在银河麒麟操作系统中为文件加锁与解锁 1、加锁2、解锁 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、加锁 若要为文件加锁&#xff0c;防止被修改或删除&#xff0c;可以使用chattr命令并加上i选项。这需要root权限。 命令&…

华为OD机试真题 - 多段数据压缩(Java/Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Java/Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX…

网络基础+Socket

目录 下图为数据分用的过程 认识IP地址 认识MAC地址 认识端口号 网络字节序 sockaddr结构 Makefile新写法 下图为数据分用的过程 认识IP地址 IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4 IP地址是在IP协议中, 用来…

js实现3d拖拽环绕旋转

js实现拖动节点围绕圆心转动 1.使用transform属性&#xff0c;将圆环放倒展示为椭圆 圆环上有不同的色彩&#xff0c;在转动的同时&#xff0c;需要让圆环也转动&#xff0c;所以圆环不能是椭圆&#xff0c;而是圆形&#xff0c;这样在转动的时候&#xff0c;改变rotate&…

开源 AI 智能名片 S2B2C 商城小程序在现代商业中的创新与启示

摘要&#xff1a;本文通过分析一种以 9.9 元裙子为代表的独特商业模式&#xff0c;探讨了其背后的现金流、产品和渠道组合策略&#xff0c;以及开源 AI 智能名片 S2B2C 商城小程序在其中可能发挥的作用和带来的启示。 一、引言 在当今竞争激烈的商业环境中&#xff0c;企业不断…