逆向案例十六——简单webpack逆向,财联社信息

网址链接:财联社A股24小时电报-上市公司动态-今日股市行情报道

数据包sign参数为加密,可以直接搜索找参数的位置,搜索不到的情况下,在断点跟栈:

确定js文件所在位置,并打上断点。 点击加载刷新页面。可以发现这个文件是一个多文件的webpack,最上面的代码展现。

在控制台输出:

鼠标放在S上,进入S

这种形式,是一个加载器,在同js文件上面找S生成的位置

其中n为加载器,里面的字符串为webpack后面列表中的字典的键,对应的配置函数。 

鼠标放在m上,进入m,发现是一个最后列表函数为空的webpack

复制代码,并在js中稍微改写

var yangxin;
var window=global;
!function(e) {function r(r) {for (var n, u, i = r[0], c = r[1], f = r[2], p = 0, s = []; p < i.length; p++)u = i[p],Object.prototype.hasOwnProperty.call(o, u) && o[u] && s.push(o[u][0]),o[u] = 0;for (n in c)Object.prototype.hasOwnProperty.call(c, n) && (e[n] = c[n]);for (l && l(r); s.length; )s.shift()();return a.push.apply(a, f || []),t()}function t() {for (var e, r = 0; r < a.length; r++) {for (var t = a[r], n = !0, i = 1; i < t.length; i++) {var c = t[i];0 !== o[c] && (n = !1)}n && (a.splice(r--, 1),e = u(u.s = t[0]))}return e}var n = {}, o = {1: 0}, a = [];function u(r) {if (n[r])return n[r].exports;var t = n[r] = {i: r,l: !1,exports: {}}, o = !0;console.log(r)try {e[r].call(t.exports, t, t.exports, u),o = !1} finally {o && delete n[r]}return t.l = !0,t.exports}u.e = function(e) {var r = [], t = o[e];if (0 !== t)if (t)r.push(t[2]);else {var n = new Promise((function(r, n) {t = o[e] = [r, n]}));r.push(t[2] = n);var a, i = document.createElement("script");i.charset = "utf-8",i.timeout = 120,u.nc && i.setAttribute("nonce", u.nc),i.src = function(e) {return u.p + "static/chunks/" + ({}[e] || e) + "." + {64: "f98369126adebd425fa6",65: "c822939a64030dc2b41a",66: "a6f1cad4a3fd3d93d6ad",67: "19ba0ff6a097f7a56d45"}[e] + ".js"}(e);var c = new Error;a = function(r) {i.onerror = i.onload = null,clearTimeout(f);var t = o[e];if (0 !== t) {if (t) {var n = r && ("load" === r.type ? "missing" : r.type), a = r && r.target && r.target.src;c.message = "Loading chunk " + e + " failed.\n(" + n + ": " + a + ")",c.name = "ChunkLoadError",c.type = n,c.request = a,t[1](c)}o[e] = void 0}};var f = setTimeout((function() {a({type: "timeout",target: i})}), 12e4);i.onerror = i.onload = a,document.head.appendChild(i)}return Promise.all(r)},u.m = e,u.c = n,u.d = function(e, r, t) {u.o(e, r) || Object.defineProperty(e, r, {enumerable: !0,get: t})},u.r = function(e) {"undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}),Object.defineProperty(e, "__esModule", {value: !0})},u.t = function(e, r) {if (1 & r && (e = u(e)),8 & r)return e;if (4 & r && "object" === typeof e && e && e.__esModule)return e;var t = Object.create(null);if (u.r(t),Object.defineProperty(t, "default", {enumerable: !0,value: e}),2 & r && "string" != typeof e)for (var n in e)u.d(t, n, function(r) {return e[r]}.bind(null, n));return t},u.n = function(e) {var r = e && e.__esModule ? function() {return e.default}: function() {return e};return u.d(r, "a", r),r},u.o = function(e, r) {return Object.prototype.hasOwnProperty.call(e, r)},u.p = "",u.oe = function(e) {throw console.error(e),e};var i = window.webpackJsonp = window.webpackJsonp || [], c = i.push.bind(i);i.push = r,i = i.slice();for (var f = 0; f < i.length; f++)r(i[f]);var l = c;t()yangxin = u;
}([]);
console.log(yangxin))

结果为:

现在的目标就是复制 W2Yj函数,直接在sign所在的js文件搜索并复制粘贴。j将后面的列表改为字典格式

代码展现:

var yangxin;
var window=global;
!function(e) {function r(r) {for (var n, u, i = r[0], c = r[1], f = r[2], p = 0, s = []; p < i.length; p++)u = i[p],Object.prototype.hasOwnProperty.call(o, u) && o[u] && s.push(o[u][0]),o[u] = 0;for (n in c)Object.prototype.hasOwnProperty.call(c, n) && (e[n] = c[n]);for (l && l(r); s.length; )s.shift()();return a.push.apply(a, f || []),t()}function t() {for (var e, r = 0; r < a.length; r++) {for (var t = a[r], n = !0, i = 1; i < t.length; i++) {var c = t[i];0 !== o[c] && (n = !1)}n && (a.splice(r--, 1),e = u(u.s = t[0]))}return e}var n = {}, o = {1: 0}, a = [];function u(r) {if (n[r])return n[r].exports;var t = n[r] = {i: r,l: !1,exports: {}}, o = !0;console.log(r)try {e[r].call(t.exports, t, t.exports, u),o = !1} finally {o && delete n[r]}return t.l = !0,t.exports}u.e = function(e) {var r = [], t = o[e];if (0 !== t)if (t)r.push(t[2]);else {var n = new Promise((function(r, n) {t = o[e] = [r, n]}));r.push(t[2] = n);var a, i = document.createElement("script");i.charset = "utf-8",i.timeout = 120,u.nc && i.setAttribute("nonce", u.nc),i.src = function(e) {return u.p + "static/chunks/" + ({}[e] || e) + "." + {64: "f98369126adebd425fa6",65: "c822939a64030dc2b41a",66: "a6f1cad4a3fd3d93d6ad",67: "19ba0ff6a097f7a56d45"}[e] + ".js"}(e);var c = new Error;a = function(r) {i.onerror = i.onload = null,clearTimeout(f);var t = o[e];if (0 !== t) {if (t) {var n = r && ("load" === r.type ? "missing" : r.type), a = r && r.target && r.target.src;c.message = "Loading chunk " + e + " failed.\n(" + n + ": " + a + ")",c.name = "ChunkLoadError",c.type = n,c.request = a,t[1](c)}o[e] = void 0}};var f = setTimeout((function() {a({type: "timeout",target: i})}), 12e4);i.onerror = i.onload = a,document.head.appendChild(i)}return Promise.all(r)},u.m = e,u.c = n,u.d = function(e, r, t) {u.o(e, r) || Object.defineProperty(e, r, {enumerable: !0,get: t})},u.r = function(e) {"undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}),Object.defineProperty(e, "__esModule", {value: !0})},u.t = function(e, r) {if (1 & r && (e = u(e)),8 & r)return e;if (4 & r && "object" === typeof e && e && e.__esModule)return e;var t = Object.create(null);if (u.r(t),Object.defineProperty(t, "default", {enumerable: !0,value: e}),2 & r && "string" != typeof e)for (var n in e)u.d(t, n, function(r) {return e[r]}.bind(null, n));return t},u.n = function(e) {var r = e && e.__esModule ? function() {return e.default}: function() {return e};return u.d(r, "a", r),r},u.o = function(e, r) {return Object.prototype.hasOwnProperty.call(e, r)},u.p = "",u.oe = function(e) {throw console.error(e),e};var i = window.webpackJsonp = window.webpackJsonp || [], c = i.push.bind(i);i.push = r,i = i.slice();for (var f = 0; f < i.length; f++)r(i[f]);var l = c;t()yangxin = u;
}({W2Yj: function(e, t, n) {var r = n("p0XB"), o = n("pLtp"), i = n("KjvB"), u = n("aCH8"), a = !0;function s(e) {return String(e)}function c(e) {return o(e).sort()}function f(e) {return e.filter((function(e) {return e})).join("&")}function p(e, t) {var n = typeof t, o = null;return t === o ? o = a ? o : "".concat(s(e), "=").concat(o) : /string|number|boolean/.test(n) ? o = "".concat(s(e), "=").concat(s(t)) : r(t) ? o = function(e, t) {return t.length ? f(t.map((function(t, n) {return p("".concat(e, "[").concat(n, "]"), t)}))) : s("".concat(e, "[]"))}(e, t) : "object" === n && (o = function(e, t) {return f(c(t).map((function(n) {return p("".concat(e, "[").concat(n, "]"), t[n])})))}(e, t)),o}e.exports = function(e) {var t = e && f(c(e).map((function(t) {return p(t, e[t])})));return t = i.sync(t),t = u(t)}}
});
console.log(yangxin('W2Yj'))

结果展现:

为了找到缺少的具体部分,可以在加载器一开始打入console.log(r) 

然后会返回:

返回一开复制的地方

发现W2Yj还调用了其他模块,为了找到它们,直接在控制台打印。它们是内置函数,跟上一个案例还有一点不同。

最后解决方法见链接:【搞Python爬虫JS逆向,再不会WebPack解密,就OUT啦!-哔哩哔哩】 https://b23.tv/OFVDLi5

比较与上一个案例的相同点:

两者的生成js文件最上面都是

(window.webpackJsonp = window.webpackJsonp || []).push([[4], [function(t, e, n) {

(1)repid由n赋值

n由c()()赋值 

 

进入c(),发现是在下面 是

上面追溯,发现c是由n组成,进入n发现是一个webpack,且列表中为空,n就是代表加载器,n(100)为函数,可以在控制台打印。  

 

 

 

(2)

 

进入S,这种形式的一看就是webpack

所以一定可以在上面找到S的生成。

 

进入n发现是一个webpack,n代表加载器。n('W2Yj')代表函数,可以在下面打印。 

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

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

相关文章

REST API实战演练之JavaScript使用Rest API

咱们前面讲了一下如何创建REST API 假期别闲着&#xff1a;REST API实战演练之创建Rest API-CSDN博客 又讲了java客户端如何使用REST API 假期别闲着&#xff1a;REST API实战演练之客户端使用Rest API-CSDN博客 接下来咱们看看JavaScript怎么使用REST API。 一、新建一个…

Log4J2漏洞(CVE-2024-44228)原理_log4j2漏洞原理,网络安全面试项目

Apache log4j2-RCE 漏洞 一、漏洞简介 二、漏洞原理 三、靶场漏洞复现 四、总结 Apache log4j2-RCE 漏洞 一、漏洞简介 Apache Log4j2是一个基于Java的日志记录工具&#xff0c;当前被广泛应用于业务系统开发&#xff0c;开发 者可以利用该工具将程序的输入输出信息进行日…

Feature Pyramid Networks for object detection

FPN 总述1.引言2.相关工作3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 4. 应用用于 RPN用于 Fast R-CNN 核心代码复现FPN网络结构ResNet Bottleneck完整代码 总述 下图中&#xff0c;蓝色边框表示的是特征图&#xff0c;边框越粗表…

在Ubuntu Linux中安装boost库详细步骤

下载boost安装包 在Linux浏览器 Boost C Libraries 下载boost的最新版安装包 安装包解压缩 在安装目录中找到压缩包&#xff0c;右键点击压缩包&#xff0c;点击Extract to...解压缩至选择的目录 设置编译器 在解压缩后的目录中进入终端&#xff0c;运行命令&#xff1a; 如…

LeetCode 2529. 正整数和负整数的最大计数——每日一题

上一篇博客&#xff1a;LeetCode 993. 二叉树的堂兄弟节点——每日一题 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.…

力扣121. 买卖股票的最佳时机

Problem: 121. 买卖股票的最佳时机 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int数组max大小同prices&#xff1b;定义int变量curMax初始化为0&#xff1b; 2.从后往前遍历数组&#xff0c;若当前元素prices[i] > curMax时&#xff0c;则使将其赋值给curMa…

43.基于SpringBoot + Vue实现的前后端分离-疫苗发布和接种预约系统(项目 + 论文)

项目介绍 本次使用Java技术开发的疫苗发布和接种预约系统&#xff0c;就是运用计算机来管理疫苗接种预约信息&#xff0c;该系统是可以实现论坛管理&#xff0c;公告信息管理&#xff0c;疫苗信息管理&#xff0c;医生管理&#xff0c;医院信息管理&#xff0c;用户管理&#x…

【ensp】VLAN间通信的解决办法

目录 VLAN间通信简介 VLAN间通信的两种方式 借助三层设备路由器进行VLAN间的通信&#xff08;也就是单臂路由&#xff09; 在端口上创建子接口之后为什么需要开启arp广播&#xff0c;是因为他是子接口吗? 拓扑图 交换机配置 路由器配置 查看路由器配置 测试能否实现…

python统计分析——线性相关

参考资料&#xff1a;python统计分析【托马斯】 对于两个相关的变量&#xff0c;相关性度量的是两个变量之间的关联程度。相反&#xff0c;线性回归是用一个变量的值来预测另一个变量的值。 1、相关系数 两个变量之间的相关系数回答了这个问题&#xff1a;“这两个变量有关系吗…

Windows系统上运行appium连接iOS真机自动化测试

步骤: 1、windows安装tidevice工具 2、Mac系统打包安装WebDriverAgent(WDA)工具 3、安装Appium 4、连接iOS手机 iOS自动化的实现和执行都依赖Mac系统,因为需要通过Xcodebuild编译安装WDA (WebDriverAgent)到iOS设备中,通过WDA实现对被测应用进行操作。而Windows系统无…

LINUX系统触摸工业显示器芯片应用方案--Model4(简称M4芯片)

背景介绍&#xff1a; 触摸工业显示器传统的还是以WINDOWS为主&#xff0c;但近年来&#xff0c;安卓紧随其后&#xff0c;但一直市场应用情况不够理想&#xff0c;反而是LINUX系统的触摸工业显示器大受追捧呢&#xff1f; 触摸工业显示器传统是以Windows系统为主&#xff0c…

电脑更新到win11后不能上网,更新win11后无法上网

越来越多的用户升级了win11系统使用&#xff0c;然而有些用户发现电脑更新到win11后不能上网了&#xff0c;这是怎么回事呢?而且奇怪的是&#xff0c;网络状态显示已连接&#xff0c;但就是无法上网&#xff0c;原本以为重置网络就能搞定&#xff0c;但结果相反。针对这一情况…

如何在前后端一体的项目中引入element-ui,即引入index.js、index.css等文件。

24年接手了一个18年的项目&#xff0c;想使用el-ui的组件库&#xff0c;得自己手动引入。 通过官网可以知道&#xff0c;首先得准备以下文件 <!-- 引入样式 --> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css…

计算机视觉——Python OpenCV BGR转HSV

这里将介绍如何使用 OpenCV 与 Python 来作彩色影像转HSV(RGB to HSV 或 BGR to HSV)&#xff0c;在写 Python 影像处理程序时常会用到 OpenCV cvtColor 作颜色空间转换的功能&#xff0c;接下来介绍怎么使用 Python 搭配 OpenCV 模块来进行 RGB/BGR 转 HSV 彩色转HSV空间。 H…

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

Redis系列之主从复制集群搭建

在上一篇博客&#xff0c;我们已经知道怎么搭建一个redis单机版&#xff0c;这篇博客基于之前的基础&#xff0c;来搭建一个redis主从同步&#xff0c;本博客框架是一主二从&#xff0c;一个主节点&#xff0c;其它两个从节点 实验环境 CentOS7Xshell6XFtp6Redis6.2.2 主从关…

Redis中的集群(二)

节点 集群数据结构 redisClient结构和clusterLink结构的相同和不同之处 redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区&#xff0c;这两个结构的区别在于&#xff0c;redisClient结构中的套接字和缓冲区是用于连接客户端的&#xff0c;而clust…

Django实现的登录注册功能

1 前言 在Web开发中&#xff0c;用户登录和注册是最基本且必不可少的功能。Django&#xff0c;作为一个高级的Python Web框架&#xff0c;为我们提供了强大的工具和库来快速实现这些功能。下面&#xff0c;我将详细介绍如何使用Django来实现用户登录和注册功能。 2 功能介绍 …

MATLAB计算投资组合的cVaR和VaR

计算条件风险价值 (Conditional Value-at-Risk, cVaR) 是一种衡量投资组合风险的方法&#xff0c;它关注的是损失分布的尾部风险。 MATLAB代码如下: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 随机产生数据&#x…

Mac 安装 brew brew cask 遇到的问题以及解决办法

安装Homebrew和Homebrew Cask是在Mac上管理软件包的常用方法。虽然大多数情况下安装这两个工具是比较简单的&#xff0c;但有时候也可能遇到一些问题。下面是一些常见的问题以及解决办法&#xff1a; 问题1&#xff1a;无法安装Homebrew 解决办法&#xff1a; 1.确保你的Mac已连…