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:
找到那片代碼,複製到這裏即可
({
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基礎纔行,不然還是挺麻煩的。 可能我說的某些地方也是錯誤的,希望大神可以指正,謝謝。