【逆向篇】Web逆向WebPack结构分析
JS逆向之webPack加载器分析
- 一般逆向思路
- 处理webPack结构
- 提取相关方法扣下
- 实践案例
一般逆向思路
案例1: 一般web逆向一个某网站的登录,登录数据如账号密码都会从前端加密后到后端,那么加密代码会在前端里面。用需要找到这个加密代码段给扣下来,进行加密,方便我们写的爬虫或者采集工具去自动登录或者其他操作,一般前端加密代码一个难点是处理webPack打包结构的代码。
处理webPack结构
webpack字如其名,实际上是网页代码的一种打包机制将多个js文件(也可以是其他类型文件,比如.png)统一打包为一个js文件,一个png文件当然如果是webpack多打包机制就会生成多个js文件最终目的肯定是为了压缩代码,提高代码执行效率
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 }
}
}
提取相关方法扣下
!function(形参){}()是一种自执行函数,无需调用网页加载的时候自动执行
这里的e实际上就是[func1,func2,func3…]这个大数组
n(0) 就是调用数组的第一个函数,打印123456
如果是对象{}形式的话,就是n(“7f6d”)这种形式来调用
//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)
实践案例
受害者网站:https://m.ctyun.cn/wap/main/auth/login
首先通过跟栈法追踪到 password 加密的关键位置
可以看到调用代码,其中有些事干扰代码,提取后如下:
encodeURI(b["c"]("123456789",b["f"]("123456@qq.com")))
ok,调用函数找到了,就需要进行下一步,
向上找到b的生成位置
类似o(“7f6d”)这种形式高度怀疑是webpack打包的
如果不确定的话把该文件翻到最上面,发现还是一个webpack多打包的形式,如下图
可以看出这个结构是webpack打包出来的。
ok,那么我们确定好是webPack结构了,那我们需要把webPack加载函数给扣下来。
下一步刷新网页,控制台输入o,跟进其内部
这里就知道那个js是主加载器了。
ok.这样我们就得到了webpack加载器的代码!!!
将webpack的主文件全部复制下来到放到新的js文件里(注意这里是全部。!!好几万行代码,如果是高手能直接复制要用到的代码就当我是p话。)
输入webpackJsonp得到所有的子文件
要调用webpack里面的函数需要把内部方法给导出来
把u函数给导出给hanshu
windows.hanshu = u;
外部调用
o = window.hanshu;
b = o("7f6d") ;
encodeURI(b["c"]("123456789",b["f"]("123456@qq.com")));
这样就成了!!。这个加密是有时间戳进去加密运算的所以 不能实时对比,结果会不一样就不放对比截图了。
实际操作中还有些问题等下一篇讲!!!
喜欢逆向的同学可以关注,有免费逆向工具与文章,谢谢支持。