超详细!国家医保服务平台逆向webpack

文章目录

  • 医保局案例
    • 1. 接口分析
    • 2. 请求加密
    • 3. 响应加密
    • 4. 关键代码

本代码仅供学习、研究和交流使用,禁止用于任何商业用途或非法用途。使用者应对其行为负责,作者不对代码的滥用或不当使用承担任何责任。

医保局案例

页面: aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWw=
接口: aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL2VidXMvZnV3dS9hcGkvbnRobC9hcGkvQ29tbVF1ZXJ5L3F1ZXJ5Rml4ZWRIb3NwaXRhbA==

1. 接口分析

在这里插入图片描述
在这里插入图片描述

通过观察发现请求和相应都是加密的,并且大致的结构都是一样的,我们通过搜索关键字encData查找加密位置:

在这里插入图片描述

第一个文件是响应,直接去第二个js文件里面找,会找到多个结果,我们可以都打上断点,然后点击翻页会停到如图位置:(实际上就调用了function f(t)

在这里插入图片描述

向上查看堆栈,看看是哪里调用了这个方法

在这里插入图片描述

实际上是在Object(u.a)(e)位置进去的,并且查看e的值中就包含了加密前的请求参数,执行方法得到的参数也确实是接口中看到的加密参数:

在这里插入图片描述
在这里插入图片描述

2. 请求加密

找到了加密位置,那我们就还原u.a就好了,这种u.a的调用方式并查看u的定义位置u = n("7d92"),很明显就是webpack打包了, 还原出n,就可以通过n调用内部的方法了

在这里插入图片描述

以下是webpack还原的大致步骤:

  • u = n("7d92")位置打上断点并刷新页面
  • 进入n里面,里面是一个自执行方法,全部复制出来
  • webpack导出给全局变量使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导出使用

在这里插入图片描述

请求代码

在这里插入图片描述

3. 响应加密

我们在刚刚请求断点的基础上继续跟栈,找到如图所示位置,e中就是响应的加密结果, 执行Object(u.b)("SM4", e.data)后得到的就是明文结果

在这里插入图片描述

在这里插入图片描述

在请求代码的基础上就可以得到解密代码

在这里插入图片描述

4. 关键代码

本案例只展示了部分重要技术点,关键部分在于webpack的还原,如需要系统采集接口需要自行补充完成代码!

在进行 JavaScript 逆向分析时,Webpack 模块化的结构是一个常见的挑战,尤其是在处理经过混淆和打包的代码时。Webpack 是一个模块打包工具,它将多个 JavaScript 文件合并为一个或多个 bundle 文件,以便在浏览器中运行。在逆向分析过程中,理解 Webpack 模块的结构和加载机制是关键。 Webpack 模块化代码通常具有以下特征: - **模块定义**:每个模块在 Webpack 中被封装为一个函数,函数的参数通常为 `module`, `exports`, `__webpack_require__`(或类似的别名)。`__webpack_require__` 函数用于加载和缓存模块。 - **模块加载**:Webpack 使用 `webpackJsonp` 全局变量来异步加载分块(chunk)模块。`webpackJsonp.push()` 方法通常用于在运行时加载额外的模块[^2]。 - **代码混淆**:为了增加逆向分析的难度,许多 Webpack 打包的代码会结合 JavaScript 混淆技术,例如变量名混淆、控制流混淆等。这使得直接阅读代码变得困难[^1]。 ### Webpack 模块结构示例 ```javascript (function(modules) { // webpackBootstrap var installedModules = {}; function __webpack_require__(moduleId) { // Check if module is in cache if (installedModules[moduleId]) { return installedModules[moduleId].exports; } // Create a new module and put it into the cache var module = installedModules[moduleId] = { i: moduleId, l: false, exports: {} }; // Execute the module function modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); // Flag the module as loaded module.l = true; // Return the module exports return module.exports; } // expose the modules object (__webpack_modules__) __webpack_require__.m = modules; // expose the module cache __webpack_require__.c = installedModules; // define getter function for harmony exports __webpack_require__.d = function(exports, name, getter) { if (!__webpack_require__.o(exports, name)) { Object.defineProperty(exports, name, { enumerable: true, get: getter }); } }; // __webpack_public_path__ __webpack_require__.p = ""; // Load entry module and return exports return __webpack_require__((__webpack_require__.s = 0)); }) /************************************************************************/ ([ /* 0 */ (function(module, exports, __webpack_require__) { eval("..."); // 模块内容 }) ]); ``` ### 逆向分析技巧 1. **识别模块加载器**:查找 `__webpack_require__` 或其别名,这是 Webpack 模块系统的核心函数。它负责加载模块并返回其导出的内容[^3]。 2. **处理异步加载模块**:观察 `webpackJsonp` 的使用方式,理解模块是如何在运行时动态加载的。有时需要模拟 `webpackJsonp` 的行为,以便在本地环境中完整运行代码[^2]。 3. **还原模块结构**:将 Webpack 打包的代码还原为模块化的结构,有助于理解代码逻辑。可以使用工具或手动方式提取每个模块,并分析其依赖关系。 4. **调试与控制台输出**:通过在浏览器控制台中运行代码并观察输出,可以帮助识别模块的执行顺序和关键函数。例如,控制台可能显示加载了 253 个函数,但某些函数可能分布在多个文件中[^2]。 ### 案例分析:函数加密模块 ```javascript function(t, e, i) { var s; s = function(t, e, s) { function n() { "undefined" != typeof r && (this.jsencrypt = new r.JSEncrypt, this.jsencrypt.setPublicKey("省略")) } var r = i(4); // 观察这个i方法是什么 n.prototype.encode = function(t, e) { var i = e ? e + "|" + t : t; return encodeURIComponent(this.jsencrypt.encrypt(i)) }, s.exports = n }.call(e, i, e, t), !(void 0 !== s && (t.exports = s)) } ``` 在上述代码中,`i` 方法是 `__webpack_require__` 的别名,用于加载模块 4。此模块可能包含 `JSEncrypt` 类,用于处理加密逻辑。通过识别 `i` 的作用,可以进一步追踪模块 4 的内容并分析其功能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇事不決洛必達

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值