wukong问答_signature参数解密

12 篇文章 2 订阅

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:
找到那片代码,复制到这里即可

({
2function(){}
},,)

在这里插入图片描述通过搜索可以得到,整个方法。注意 复制的时候不要复制错了,复制红色框内的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基础才行,不然还是挺麻烦的。 可能我说的某些地方也是错误的,希望大神可以指正,谢谢。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值