逆向案例十六——简单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.hqwc.cn/news/615186.html

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

相关文章

golang map总结

目录 概述 一、哈希表原理 哈希函数 哈希表和哈希函数的关系 哈希表的优势 哈希冲突 什么是哈希冲突 如何处理哈希冲突 链表法 开放寻址法 哈希表常见操作过程 存储数据 检索数据 删除数据 常用的哈希算法 哈希表的应用场景 二、golang map map的内部结构 h…

突破编程_前端_SVG(circle 圆形)

1 circle 元素的基本属性和用法 SVG 的 <circle> 元素用于在SVG文档中绘制圆形。它具有几个基本属性&#xff0c;允许定义圆形的大小、位置、填充颜色和边框样式。以下是 <circle> 元素的基本属性及其详细解释&#xff1a; 1.1 cx 和 cy 描述&#xff1a;这两个…

30元腾讯云服务器搭建幻兽帕鲁Palworld多人联机游戏,畅玩

幻兽帕鲁太火了&#xff0c;官方palworld服务器不稳定&#xff1f;不如自建服务器&#xff0c;基于腾讯云幻兽帕鲁服务器成本32元全自动部署幻兽帕鲁服务器&#xff0c;超简单有手就行&#xff0c;全程自动化一键部署10秒钟即可搞定&#xff0c;无需玩家手动部署幻兽帕鲁游戏程…

AD7685BRMZRL7 16位 2.3V 低功耗模数转换器芯片 ADI

AD7685BRMZRL7是一款由ADI&#xff08;亚德诺&#xff09;公司生产的模数转换器&#xff08;ADC&#xff09;芯片。该芯片的主要功能是将模拟信号转换为数字信号&#xff0c;以便在数字系统中处理. AD7685BRMZRL7 规格信息&#xff1a; 制造商:Analog Devices Inc. 产品种类:模…

CSS特效---百分比加载特效

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…

CentOS下部署ftp服务

要在linux部署ftp服务首先需要安装vsftpd服务 yum install vsftpd -y 安装完成后需要启动vsftpd服务 systemctl start vsftpd 为了能够访问ftp的端口&#xff0c;需要在防火墙中开启ftp的端口21&#xff0c;否则在使用ftp连接的时候会报错No route to host. 执行如下命令为f…

WebGL 2.0相较于1.0有什么不同?

作者&#xff1a;STANCH 1.概述 WebGL 1.0自推出以来&#xff0c;已成为广泛支持的Web标准&#xff0c;既能跨平台&#xff0c;还免版税。它通过插件为Web浏览器带来高质量的3D图形&#xff0c;这是迄今为止市场上使用最广泛的Web图形&#xff0c;并得到Apple&#xff0c;Goog…

Leetcode第28题:实现 strStr()【python】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a;LeetCode解锁1000题: 打怪升级之旅python数据分析可…

C#生成一个绿色文件

生成一个绿色文件免去了安装的繁琐过程&#xff0c;直接运行&#xff0c;非常方便。 新建一个类库项目 在类库Class1中实现简单的Sum方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespac…

【Hello算法】 > 第 2 关 >数据结构 之 数组与链表

数据结构 之 数组与链表 1&#xff1a;Understanding data structures &#xff01;——了解数据结构——1.1&#xff1a;Classification-分类-1.2&#xff1a;Type-类型- 2&#xff1a;Arrays are the bricks that make up the wall of data structures *——数组是组成数据结…

二、Maven安装

Maven安装 一、Centos7.9安装1.下载2.安装3.设置国内镜像4.设置maven安装路径 一、Centos7.9安装 1.下载 第一种&#xff1a;官网下载最新版本&#xff1a;http://maven.apache.org/download.cgi第二种&#xff1a;其他版本下载&#xff1a;https://archive.apache.org/dist/…

Ubuntu20.04安装和编译运行lidar_align来联合标定lidar与imu的外参

硬件&#xff1a;树霉派4b、天眸lidar(32线)、IMU(GNSS不接天线) 系统&#xff1a;ubuntu20.04、 天眸lidar(32线)&#xff1a; IMU(GNSS不接天线)&#xff1a; 1、下载并安装lidar_align mkdir -p lidar_align/src cd lidar_align/src git clone https://github.com/ethz-…