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

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

相关文章

服务器代理

服务器代理 配置&#xff1a;64G内存1 3090&#xff08;24g&#xff09;1P4000&#xff08;8g&#xff09; SSH连接 工作路径&#xff1a;/home/ubuntu/workspace/python Anaconda路径&#xff1a;/home/Ubuntu 1.在工作路径下创建自己的文件夹作为workspace 2.以用户ubunbtu登…

AIGC的崛起:定义未来内容创作的新纪元

&#x1f31f;文章目录 &#x1f31f;AIGC简介&#x1f31f; AIGC的相关技术与特点&#x1f31f;AIGC有哪些应用场景&#xff1f;&#x1f31f;AIGC对其他行业影响&#x1f31f;面临的挑战与问题&#x1f31f;AIGC未来发展 &#x1f31f;AIGC十大热门网站推荐&#xff1a; 文心…

【前缀合】Leetcode 连续数组

题目解析 525. 连续数组 寻找一个子数组&#xff0c;这个子数组中包含相同数目的0和1&#xff0c;但是这个子数组需要最长的 算法讲解 只需在[0,i]寻找一段区间使得这一段区间的和也等于sum即可 细节问题&#xff1a;1. 这里的哈希表的value存的是下标&#xff0c;因为需要找…

【论文笔记】PointMamba: A Simple State Space Model for Point Cloud Analysis

原文链接&#xff1a;https://arxiv.org/abs/2402.10739 1. 引言 基于Transformer的点云分析方法有二次时空复杂度&#xff0c;一些方法通过限制感受野降低计算。这引出了一个问题&#xff1a;如何设计方法实现线性复杂度并有全局感受野。 状态空间模型&#xff08;SSM&…

Axios网络请求

Axios网络请求主要用于前后端请求&#xff0c;前后端分离时前端需要通过url请求后端的接口&#xff0c;并且处理后端传过来的数据。 Axios官网教程 安装 npm install axios在main.js导入 import axios from axios;//声明一个http变量&#xff01;&#xff01;&#xff01…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive缓存及清除keep-alive缓存

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

VS2022MSDN(离线帮助文档)的下载安装与使用

哈喽,你好啊,我是雷工! 现如今最重要的能力莫过于自学能力,在工控项目或编程中遇到问题,想快速解决的最快的方法莫过于查看手册。 MSDN是VS中的一个帮助手册,可以用来查找各种函数,查看各种API文档,对初学者来说是个不可缺少的手册,非常方便。 01在线查看 当我们在联…

针式打印机左边距偏离太多,通过边距无法调节

如果如下已经设置正确的打印边距&#xff0c;还是打印异常&#xff0c;偏离太多的话 需要在打印机属性里面把纸张左边距设置为默认值&#xff0c;即0

Web前端-HTML

黑马程序员JavaWeb开发教程 一、初识web前端 1、 标准也称为网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C负责指定 2、 三个部分组成 HTML&#xff1a;负责网页的结构&#xff08;页面元素和内容&#xff09;CSS&#xff1a;负责网页的表现&#xff08;页…

jenkins+gitlab配置

汉化 1、安装Localization: Chinese (Simplified)插件 &#xff08;此处我已安装&#xff09; &#xff08;安装完成后重启jenkins服务即可实现汉化&#xff09; 新增用户权限配置 1、安装插件 Role-based Authorization Strategy 2、全局安全配置 3、配置角色权限 4、新建…

再谈C语言——理解指针(一)

内存和地址 内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;就得挨个房…

C++11的更新介绍(新的类功能、可变参数模板)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 新的类功能 默认成员函数&…

蓝桥杯嵌入式(G431)备赛笔记——PWM+LCD+按键

目录 题目要求&#xff08;真题&#xff09;&#xff1a; cubeMX配置&#xff1a; 小试牛刀&#xff1a; Keil代码&#xff1a; 效果演示&#xff1a; 题目要求&#xff08;真题&#xff09;&#xff1a; 使用第十一届第二场真题&#xff0c;练习PWM波部分的代码&#xff0c…

C++——StackQueue

目录 一Stack 1介绍 2接口 3模拟实现 4栈的oj题 二Queue 1介绍 2接口 3模拟实现 三容器适配器 1再谈栈和队列 四优先级队列 1接口 ​编辑 2仿函数 五dequeue的简单介绍 一Stack 1介绍 先来看看库中对栈的介绍&#xff1a; 1. stack是一种容器适配器&#x…

【数据结构与算法】:10道链表经典OJ

目录 1. 移除链表元素2. 反转链表2.1反转指针法2.2 头插法 3. 合并两个有序链表4. 分隔链表5. 环形链表6. 链表的中间节点7. 链表中倒数第K个节点8. 相交链表9. 环形链表的约瑟夫问题10. 链表的回文结构 1. 移除链表元素 思路1&#xff1a;遍历原链表&#xff0c;将 val 所在的…

JavaScript函数式编程

函数式编程 课程介绍 为什么要学习函数编程以及什么是函数式编程函数式编程的特性(纯函数、柯里化、函数组合等)函数式编程的应用场景函数式编程库Lodash 为什么要学习函数式编程 函数式编程是非常古老的一个概念&#xff0c;早于第一台计算机的诞生&#xff0c; 函数式编程…

开源模型应用落地-chatglm3-6b-zero/one/few-shot-入门篇(五)

一、前言 Zero-Shot、One-Shot和Few-Shot是机器学习领域中重要的概念&#xff0c;特别是在自然语言处理和计算机视觉领域。通过Zero-Shot、One-Shot和Few-Shot学习&#xff0c;模型可以更好地处理未知的情况和新任务&#xff0c;减少对大量标注数据的依赖&#xff0c;提高模型的…

心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发

心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发 支持SAAS、支持独立加密、支持独立开源、价格不同。 自带题库数据&#xff0c;后台一键初始&#xff0c;支持自己上传题目 心理测评 微信公众号微信小程序抖音小程序可打包APP 支持单题、跳跃题、计分题、因子题、…

OSPF数据报文格式

OSPF协议是跨层封装的协议&#xff0c;跨四层封装&#xff0c;直接将应用层的数据封装在网络层协议后面&#xff0c;IP协议包中协议号字段对应的数值为——89 OSPF的头部信息&#xff1a; ——所有数据包公有的信息 版本&#xff1a;OSPF版本 在IPV4中一般使用OSPFV2&#xf…

第十三届蓝桥杯真题:x进制减法,数组切分,gcd,青蛙过河

目录 x进制减法 数组切分 gcd 青蛙过河 x进制减法 其实就是一道观察规律的题。你发现如果a这个位置上的数x&#xff0c;b这个位置上的数是y&#xff0c;那么此位置至少是max(x,y)1进制。一定要把位置找对啊 #include <bits/stdc.h> using namespace std; typedef l…