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基礎才行,不然還是挺麻煩的, 可能我說的某些地方也是錯誤的,希望大神可以指正,謝謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240016.html
標籤:其他
