当前位置: 首页 > news >正文

js逆向——webpack扣取代码

一、webpack简介

webpack字如其名,实际上是网页代码的一种打包机制

将多个js文件(也可以是其他类型文件,比如.png)统一打包为一个js文件,一个png文件

当然如果是webpack多打包机制就会生成多个js文件

最终目的肯定是为了压缩代码,提高代码执行效率

1、当前网页前端主流的打包框架

国内:vue

国外:react

其他:webpack

2、函数打包出现重名问题

webpack完全采用闭包机制(也就是通过作用域)的办法来避免需要压缩的几个文件内部的函数有重名的现象发生(一人一个作用域就可以避免函数重名的问题),也就是:

var jss = [ {对象1},{对象2},{对象3} ]

对象1也可以是函数形式:

{

getInfo:function(){

}

}

这样,想要调用不同文件的重名函数变为:

jss[0].func1()

jss[1].func1()

这样既解决了函数名重名问题(即允许重名),又可以调用你希望调用的函数了

但是现在还有一个新的问题就是有些私有方法我不希望被外部调用,也就是访问权限问题,这个就像C++里面的共有、私有函数一样

webpack的解决方案是可以被外部访问的共有方法一律需要导出才行,即:

export:function(){

        var getInfo = function(){

        具体代码;

        return {getInfo :getInfo }

}

}

二、webpack函数的调用

1)通过数组的方式调用

2)通过对象的方式调用

//webpack加载器
!function(e) {var t = {};// 加载器  所有的模块都是从这个函数加载 执行function n(r) {if (t[r])return t[r].exports;var o = t[r] = {i: r,l: !1,exports: {}};return e[r].call(o.exports, o, o.exports, n),o.l = !0,o.exports}
}([function () {console.log('123456')},function () {console.log('模块2')},])
n(0)

!function(形参){}()是一种自执行函数,无需调用网页加载的时候自动执行

这里的e实际上就是[func1,func2,func3...]这个大数组

n(0) 就是调用数组的第一个函数,打印123456

如果是对象{}形式的话,就是n("7f6d")这种形式来调用

三、天翼云webpack案例

受害者网站:https://m.ctyun.cn/wap/main/auth/login

首先通过跟栈法追踪到password加密的关键位置

这里的Object实际上是一种混淆,可以直接去掉

也就是encodeURI(Object(b["c"])(i.value, Object(b["f"])(Object(b["g"])(r.value))))等价于:

encodeURI(b["c"]("123456789",b["f"]("123456@qq.com")))

向上找到b的生成位置

类似o("7f6d")这种形式高度怀疑是webpack打包的

如果不确定的话把该文件翻到最上面,发现还是一个webpack多打包的形式

 

下一步刷新网页,控制台输入o,跟进其内部

这样我们就得到了webpack加载器的代码!!!

将webpack的主文件全部复制下来到notepad++当中

输入webpackJsonp得到所有的子文件

将webpack所有子文件复制下来,依次放到主文件的下面

全部扣下来一共3万多行

将加载器导出到全局以便调用

在代码片段的最后加入如下代码进行测试

o=window.bubu; b = o("7f6d") ;encodeURI(b["c"]("123456789",b["f"]("123456@qq.com")));

在运行过程中看到结果了,但是一闪而过,说明重定向了

我们需要进入主模块,删除初始化部分的代码

这样我们就在浏览器环境下通过全扣法拿到了正确结果

下一步在fd当中无环境运行正确结果

删减的原则:

1)对于if...else需要观看进入哪个语句来给变量赋值

2)对于三目运算符等逻辑判断可以在网页打debugger然后删除代码

3)对于xxx undefined直接赋值为""

经过删删改改在fd无环境也能正常运行了

由于在调用o("7f6d")的过程当中并不是用到webpack的所有模块,所以我们可以简化代码来提高程序执行的性能

通过观察导出函数的格式

我们可以添加window.code+="\""+n+"\""+":"+e[n]+","

来获取所有o函数加载的模块

记住是在fd当中进行打印,如果想进一步保险简化,可以加一个判断条件pd=0等执行o("7f6d")的时候将判断条件修改为1,这样可以去掉一部分初始化的代码。

使用简化后的代码放到e这个大对象里面,再次执行,也得到正确结果了

而简化后代码行数减少为1万行

最后再总结一下webpack扣取的步骤

1)通过进入webpack的加载器拿到完整的主文件

2)通过webpackJsonXXX的方式获取拿到所有子文件,按次序放到主文件的下方

3)导出加载器到全局,如果有初始化的代码就删除掉

4)现在浏览器环境模拟运行加密算法

5)在fd无环境下模拟运行加密算法

6)有条件的话在fd环境修改加载器代码window.code+="\""+n+"\""+":"+e[n]+",“,拿到使用到的所有模块,覆盖掉之前加载的代码

7)在fd当中成功运行简化后的代码

ok,今天的你就到此为止吧,明天还要接着🐺啊 

相关文章:

  • 第J2周:ResNet50V2算法实战与解析
  • 微服务的优点及在云原生时代的合理落地方式
  • 设计模式之门面(Facade)模式
  • 【Java异常】(简简单单拿捏)
  • 剑指 offer 刷题集
  • java 生成.h文件,java调用c语言dll动态链接库流程
  • uni-app App版本更新
  • C语言习题~day33
  • react通过下拉框选择多个,并展示在下方的方式
  • 【工具分享】Darkside勒索病毒解密工具
  • 每天五分钟深度学习框架pytorch:激活函数在神经网络中的应用
  • 数据结构—(java)反射,枚举,lambda表达式
  • 开发受用户喜欢有声听书APP:快速满足用户需求的秘诀
  • [PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)
  • 使用 LlamaIndex 进行 CRAG 开发用来强化检索增强生成
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 2019年如何成为全栈工程师?
  • Akka系列(七):Actor持久化之Akka persistence
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS中外联样式表代表的含义
  • docker python 配置
  • egg(89)--egg之redis的发布和订阅
  • Electron入门介绍
  • EOS是什么
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • express + mock 让前后台并行开发
  • FastReport在线报表设计器工作原理
  • Invalidate和postInvalidate的区别
  • MySQL QA
  • oldjun 检测网站的经验
  • PaddlePaddle-GitHub的正确打开姿势
  • Quartz初级教程
  • React as a UI Runtime(五、列表)
  • Spring核心 Bean的高级装配
  • unity如何实现一个固定宽度的orthagraphic相机
  • 包装类对象
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 离散点最小(凸)包围边界查找
  • 项目管理碎碎念系列之一:干系人管理
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 译米田引理
  • 栈实现走出迷宫(C++)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Spring第一个helloWorld
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​香农与信息论三大定律
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #include到底该写在哪
  • #WEB前端(HTML属性)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (13)Hive调优——动态分区导致的小文件问题
  • (2)从源码角度聊聊Jetpack Navigator的工作流程