网站:YUhSMGNITWxNMEV2TDNkM2R5NW5iVGs1TG1OdmJTOCUzRA==
目标:拿到加密密码的代码
分析方法:
01.
02.向上看到底是模块化的还是普通的
//1.webpack
!function(x){
function xxx(y){ #这个是模块加载器,这个y传入的可以是索引和对象的key,参数表示的是列表或对象的形参
x[y].call(参数)
}
}( [function(){},
function(){},
function(){}
] );传入的可以是列表也可以是对象
//或者是对象
({
1:function(){},
2:function(){},
3:function(){}
}) //括号里面的是自执行时传给x的实参
//2.普通的
function(){}
function(){}
我们需要encode函数, encode是对象n的一个成员方法, 那我们就需要对象n,所以我们需要包含这个对象的方法!
2
蓝色部分是上述加密代码所在的函数里面,所以可以看出此次密码的加密是模块化的
03.所以加密的函数其实只是传入的列表或对象里的其中一项,所以此时需要找到模块加载器,也就是自执行代码中出现call或者apply的函数,也就是要扣代码,所以扣代码的步骤:
"""
1.构造一个自执行方法
2.找到这个加载器(加载模块的方法) #通过复制然后删除其他不必要的代码只留所谓的模块加载器
!function(t) {
function e(s) {
if (i[s])
return i[s].exports;
var n = i[s] = {
exports: {},
id: s,
loaded: !1
};
return t[s].call(n.exports, n, n.exports, e),
n.loaded = !0,
n.exports
}
}() 如果不确定可以放到console中运行一下以此判断整理得到的函数是否是没有错误的
3.找到调用的模块
也就是要找密码的加密方法,进入到a.encode()这个方法,
得到的是:
n.prototype.encode = function(t, e) {
var i = e ? e + "|" + t : t;
return encodeURIComponent(this.jsencrypt.encrypt(i))
} 然后通过断点看一看它们表示的是什么,如果开头断不住,可以试一下断return
"""
可以观察到这个方法返回的仍然是调用了一个方法,其中i是通过拼接到的字符串,所以仍要进入到方法当中找到调用的方法!
进入之后指向的是所选部分,至于为什么知道它不是调用的函数是因为放上去时显示的并不是方法
可以发现实际调用的方法就是4:function(){}中,所以我们要找的要调用的模块就是这个,只要复制4:function(t,e,i){}放到自执行函数的对象里面即可。
最后整理后得到的是:
然后传入参数就可得到一开始找到的o