wukong问答网站里的_signature参数解密详解
提示:这个参数加密用到了webpack打包的相关知识
网址:https://www.wukong.com/
一、首先通过搜索定位法,来找到参数的关键加密位置。
通过搜索很明显可以看到js文件,而且数量也不多 可以进行快速定位。
二、在js代码中继续搜索关键参数,找到两个位置,分别打上断点,然后刷新网页,断点就会断到关键的位置
通过刷新网页,成功的断了下来,可以看到关键位置。代码如下
_signature: acrawler.sign(_this.concern_id + (_this.extra.max_behot_time || ''))
这段代码就是给_signature:参数进行赋值了,他是通过acrawler对象下的sign方法,进行计算的,至于他的参数,暂时先不看。鼠标选中其实可以看到参数的值,也就是待加密的值,经测试是固定的。
鼠标选中参数的代码,即可看到值
三、现在我们要知道acrawler 这个对象是在那里定义的,把他给抠出来。
继续通过网页内搜索的方法,可以搜到多个结果,但是通过判断,可以看到关键的位置
var acrawler = require('byted-acrawler');
由此得知,acrawler 是导入过来的,而且还传了一个参数,继续搜素这个参数,看一下这个值到底是啥
通过搜索发现,这个值是2,有经验或者对webpack比较熟的朋友,应该立马就明白了了,这个参数应该就是webpack中加载器的要加载的哪个方法,然后我们在导入哪一行打上断点,刷新网页,进入打包的函数去看一下
网页刷新时肯定是会先加载这些的,所以肯定会断下来
四、接下来是最关键的一步,也是最后一步,扣出webpack打包的代码,进行重新构造,变成我们想要得出结果的哪个方法。
红色方框内就是很熟悉的webpack特征了
(function(t){
x.call()
})({
1:[function x(){}],
2:[function y(){}]
},,);
以上代码就是webpack的明显特征代码,他的特征有三点,
第一点:他是一个自执行函数。
第二点:他在函数体内调用call或者apply方法。
第三点:自执行函数后面,跟了多个方法,会由自执行函数根据参数去加载,例如t=2,那么就会加载2那个方法。
我们之前在require 导入的时候,不是有个参数吗,参数的值是2,那么加载器加载的就是2的方法,这个2可能
是函数的名也可能是数组里第三个(从0开始)。由于代码太多 所以我就不放上去了,我们直接在页面内搜索2:
找到那片代码,复制到这里即可
({
2:function(){}
},,)
通过搜索可以得到,整个方法。注意 复制的时候不要复制错了,复制红色框内的2:[funciton…,{}]
根据这个特征,我们开始构造
(function e(t, n, r) {
function s(o, u) {
if (!n[o]) {
if (!t[o]) {
var a = typeof require == "function" && require;
if (!u && a)
return a(o, !0);
if (i)
return i(o, !0);
var f = new Error("Cannot find module '" + o + "'");
throw f.code = "MODULE_NOT_FOUND",
f
}
var l = n[o] = {
exports: {}
};
t[o][0].call(l.exports, function(e) {
var n = t[o][1][e];
return s(n ? n : e)
}, l, l.exports, e, t, n, r)
}
return n[o].exports
}
var i = typeof require == "function" && require;
for (var o = 0; o < r.length; o++)
s(r[o]);
return s
})({
},,)
首先上面是原函数,下面是我们构造的。
var aaa;
(function e(t, n, r) {
function s(o, u) {
var l = n[o] = {
exports: {}
};
t[o][0].call(l.exports, function(e) {
var n = t[o][1][e];
return s(n ? n : e)
}, l, l.exports, e, t, n, r)
return l.exports
}
aaa=s;
}
)({
2:function(){}
},{},[17]);
console.log(aaa(2).sign("6300775428692904450"));
尾部的几个参数,在代码也的最下方可以找到。直接复制过来.定义全局变量aaa来接收s方法,s方法就是关键的构造方法。
o和u是预加载用的,相当于一个加载器,aaa(2)传入2,是加载2那个方法,然后,他是进行了一系列的判断,其实是没多大用的,
我们要的关键代码一定是call或者apply那个位置,所以我们围绕这个位置来扣代码,去掉无关代码,由于l = n[o] 所以返回时我们可以返回l.exports,与上面传入的参数对应。
然后我们就可以调用aaa(2)对象下面的sign方法,在传入那个固定的值,得出_signature参数的结果。
以上就是_signature参数解密的整个思路了,说难也不难,毕竟一下子就可以定位到加密的位置,一下就可以扣出代码。说简单也不是很简单,因为构造方法的时候,改代码要有一定的js基础才行,不然还是挺麻烦的。 可能我说的某些地方也是错误的,希望大神可以指正,谢谢。