wukong問答_signature參數解密

wukong問答網站裏的_signature參數解密詳解

提示:這個參數加密用到了webpack打包的相關知識


一、首先通過搜索定位法,來找到參數的關鍵加密位置。

在這裏插入圖片描述通過搜索很明顯可以看到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基礎纔行,不然還是挺麻煩的。 可能我說的某些地方也是錯誤的,希望大神可以指正,謝謝。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章