前言:現在網站都有很強的反爬機制,都是非常常見的是用js前端加密參數,所以不得不去分析和逆向js混淆后的代碼
一.
打開天貓或淘寶,shift+ctrl+F12全局搜索sign參數.

這里發現很多地方有出現了sign,必須一個一個的去看,發現前面的文件的assign,這個是我們所不用的,繼續向下翻找,找到我們想要的了。

發現我們要找的js是內聯在前端頁面中的,點擊進去,看看是啥操作先。
二.點擊進入,打斷點,再調試

這樣看js代碼不現實,包括我們在F12中,需要分析dom節點時,很多時候只要把對應的Elements頁面拉開一點,就會使得頁面舒服很多,js這里要點擊這里

舒服了---------------------

同時找到了sign參數,同時個人覺得逆向與正向不同的在於,正向需要寫代碼然后得出結果,而逆向則從結果,反着去看代碼,所以抱着這樣的思想開始分析

開始找m

這里我們基本上就知道,我們需要什么了:
1.r.token
2.n
3.o
4.s.data
5.函數Y
開始逐一的尋找信息:
1.n:

說明n是時間戳,但是js中的new Date.getTime()方法,返回的是毫秒數的時間戳,而python中time.time(),返回的是以秒為單位的時間戳,當時一直調試,發現位數一直對不上,我也很郁悶,特意去查了這兩個的差別,才解決了這個問題
2.o

這句其實是一個js語法里面的||的語法,我這里簡要概述一下這個語法,||是或語句,一般格式都是a||b,當a為true是,直接返回a的值,如果為假,返回b的值。那么這里可以看到o=s.appkey。那么這個s是什么呢。
發現是參數對象,所以那個appkey是一個定值。
3.s.data
同理,是參數對象的data字段。
4.r.token
這里沒找到,有關於r.token的信息,那我們來打一下斷點。刷新一下,這里發現並沒有斷下,這種情況其實這幾天我都有遇到,在看完別人的博客,我才意識到很有可能是js代碼進行了判定,如果參數已經生成了,是不會再執行一遍重復的生成參數的代碼的,那么我們把緩存一清,讓它重新生成,清完緩存,再刷新一下。這里是真的 坑。上面打斷點停住了,這兩天就是停不下來。。。只能口述了
就是將停下來的位置,將鼠標移上去。后面會顯示token的值,后再全局搜索,發現是m_h5_tk的值
5.Y函數同4點一樣,我是打斷點找的,不過也可以直接搜索,函數就在一個js里面
這里有點關鍵的是,加密的函數很復雜,這里有兩種方式,一種是將加密的算法逆向復現出來,另一種是直接調用,第一種反正我現階段做不到,智能直接調用了,因為我用的是python,所以百度了好幾個python是否能運行js的代碼呢?
發現有好幾個庫,python🐮。

所以命令行安裝了個js2py這個庫,這個庫不需要再安裝node的環境,比較香,可惜的是,無法在源碼上寫很長的js代碼,否則會報錯,一般是用一個js文件來保存,之后將其保存到變量里面,完美解決

下面是那個js文件的內容。
function Y(aV) {
function aU(d, c) {
return d << c | d >>> 32 - c
}
function aT(i, h) {
var n, m, l, k, j;
return l = 2147483648 & i,
k = 2147483648 & h,
n = 1073741824 & i,
m = 1073741824 & h,
j = (1073741823 & i) + (1073741823 & h),
n & m ? 2147483648 ^ j ^ l ^ k : n | m ? 1073741824 & j ? 3221225472 ^ j ^ l ^ k : 1073741824 ^ j ^ l ^ k : j ^ l ^ k
}
function aS(e, d, f) {
return e & d | ~e & f
}
function aR(e, d, f) {
return e & f | d & ~f
}
function aQ(e, d, f) {
return e ^ d ^ f
}
function aP(e, d, f) {
return d ^ (e | ~f)
}
function aO(b, n, m, l, k, d, c) {
return b = aT(b, aT(aT(aS(n, m, l), k), c)),
aT(aU(b, d), n)
}
function aN(b, n, m, l, k, e, c) {
return b = aT(b, aT(aT(aR(n, m, l), k), c)),
aT(aU(b, e), n)
}
function aM(b, n, m, l, k, f, c) {
return b = aT(b, aT(aT(aQ(n, m, l), k), c)),
aT(aU(b, f), n)
}
function aL(b, n, m, l, k, g, c) {
return b = aT(b, aT(aT(aP(n, m, l), k), c)),
aT(aU(b, g), n)
}
function aK(r) {
for (var q, p = r.length, o = p + 8, n = (o - o % 64) / 64, m = 16 * (n + 1), l = new Array(m - 1), k = 0, j = 0; p > j; ) {
q = (j - j % 4) / 4,
k = j % 4 * 8,
l[q] = l[q] | r.charCodeAt(j) << k,
j++
}
return q = (j - j % 4) / 4,
k = j % 4 * 8,
l[q] = l[q] | 128 << k,
l[m - 2] = p << 3,
l[m - 1] = p >>> 29,
l
}
function aJ(g) {
var f, j, i = "", h = "";
for (j = 0; 3 >= j; j++) {
f = g >>> 8 * j & 255,
h = "0" + f.toString(16),
i += h.substr(h.length - 2, 2)
}
return i
}
function aI(f) {
f = f.replace(/\r\n/g, "\n");
for (var e = "", h = 0; h < f.length; h++) {
var g = f.charCodeAt(h);
128 > g ? e += String.fromCharCode(g) : g > 127 && 2048 > g ? (e += String.fromCharCode(g >> 6 | 192),
e += String.fromCharCode(63 & g | 128)) : (e += String.fromCharCode(g >> 12 | 224),
e += String.fromCharCode(g >> 6 & 63 | 128),
e += String.fromCharCode(63 & g | 128))
}
return e
}
var aH, aG, aF, aE, aD, aC, aB, aA, az, ay = [], ax = 7, aw = 12, av = 17, au = 22, at = 5, ar = 9, aq = 14, ap = 20, ao = 4, an = 11, am = 16, al = 23, ak = 6, aj = 10, ai = 15, ah = 21;
for (aV = aI(aV),
ay = aK(aV),
aC = 1732584193,
aB = 4023233417,
aA = 2562383102,
az = 271733878,
aH = 0; aH < ay.length; aH += 16) {
aG = aC,
aF = aB,
aE = aA,
aD = az,
aC = aO(aC, aB, aA, az, ay[aH + 0], ax, 3614090360),
az = aO(az, aC, aB, aA, ay[aH + 1], aw, 3905402710),
aA = aO(aA, az, aC, aB, ay[aH + 2], av, 606105819),
aB = aO(aB, aA, az, aC, ay[aH + 3], au, 3250441966),
aC = aO(aC, aB, aA, az, ay[aH + 4], ax, 4118548399),
az = aO(az, aC, aB, aA, ay[aH + 5], aw, 1200080426),
aA = aO(aA, az, aC, aB, ay[aH + 6], av, 2821735955),
aB = aO(aB, aA, az, aC, ay[aH + 7], au, 4249261313),
aC = aO(aC, aB, aA, az, ay[aH + 8], ax, 1770035416),
az = aO(az, aC, aB, aA, ay[aH + 9], aw, 2336552879),
aA = aO(aA, az, aC, aB, ay[aH + 10], av, 4294925233),
aB = aO(aB, aA, az, aC, ay[aH + 11], au, 2304563134),
aC = aO(aC, aB, aA, az, ay[aH + 12], ax, 1804603682),
az = aO(az, aC, aB, aA, ay[aH + 13], aw, 4254626195),
aA = aO(aA, az, aC, aB, ay[aH + 14], av, 2792965006),
aB = aO(aB, aA, az, aC, ay[aH + 15], au, 1236535329),
aC = aN(aC, aB, aA, az, ay[aH + 1], at, 4129170786),
az = aN(az, aC, aB, aA, ay[aH + 6], ar, 3225465664),
aA = aN(aA, az, aC, aB, ay[aH + 11], aq, 643717713),
aB = aN(aB, aA, az, aC, ay[aH + 0], ap, 3921069994),
aC = aN(aC, aB, aA, az, ay[aH + 5], at, 3593408605),
az = aN(az, aC, aB, aA, ay[aH + 10], ar, 38016083),
aA = aN(aA, az, aC, aB, ay[aH + 15], aq, 3634488961),
aB = aN(aB, aA, az, aC, ay[aH + 4], ap, 3889429448),
aC = aN(aC, aB, aA, az, ay[aH + 9], at, 568446438),
az = aN(az, aC, aB, aA, ay[aH + 14], ar, 3275163606),
aA = aN(aA, az, aC, aB, ay[aH + 3], aq, 4107603335),
aB = aN(aB, aA, az, aC, ay[aH + 8], ap, 1163531501),
aC = aN(aC, aB, aA, az, ay[aH + 13], at, 2850285829),
az = aN(az, aC, aB, aA, ay[aH + 2], ar, 4243563512),
aA = aN(aA, az, aC, aB, ay[aH + 7], aq, 1735328473),
aB = aN(aB, aA, az, aC, ay[aH + 12], ap, 2368359562),
aC = aM(aC, aB, aA, az, ay[aH + 5], ao, 4294588738),
az = aM(az, aC, aB, aA, ay[aH + 8], an, 2272392833),
aA = aM(aA, az, aC, aB, ay[aH + 11], am, 1839030562),
aB = aM(aB, aA, az, aC, ay[aH + 14], al, 4259657740),
aC = aM(aC, aB, aA, az, ay[aH + 1], ao, 2763975236),
az = aM(az, aC, aB, aA, ay[aH + 4], an, 1272893353),
aA = aM(aA, az, aC, aB, ay[aH + 7], am, 4139469664),
aB = aM(aB, aA, az, aC, ay[aH + 10], al, 3200236656),
aC = aM(aC, aB, aA, az, ay[aH + 13], ao, 681279174),
az = aM(az, aC, aB, aA, ay[aH + 0], an, 3936430074),
aA = aM(aA, az, aC, aB, ay[aH + 3], am, 3572445317),
aB = aM(aB, aA, az, aC, ay[aH + 6], al, 76029189),
aC = aM(aC, aB, aA, az, ay[aH + 9], ao, 3654602809),
az = aM(az, aC, aB, aA, ay[aH + 12], an, 3873151461),
aA = aM(aA, az, aC, aB, ay[aH + 15], am, 530742520),
aB = aM(aB, aA, az, aC, ay[aH + 2], al, 3299628645),
aC = aL(aC, aB, aA, az, ay[aH + 0], ak, 4096336452),
az = aL(az, aC, aB, aA, ay[aH + 7], aj, 1126891415),
aA = aL(aA, az, aC, aB, ay[aH + 14], ai, 2878612391),
aB = aL(aB, aA, az, aC, ay[aH + 5], ah, 4237533241),
aC = aL(aC, aB, aA, az, ay[aH + 12], ak, 1700485571),
az = aL(az, aC, aB, aA, ay[aH + 3], aj, 2399980690),
aA = aL(aA, az, aC, aB, ay[aH + 10], ai, 4293915773),
aB = aL(aB, aA, az, aC, ay[aH + 1], ah, 2240044497),
aC = aL(aC, aB, aA, az, ay[aH + 8], ak, 1873313359),
az = aL(az, aC, aB, aA, ay[aH + 15], aj, 4264355552),
aA = aL(aA, az, aC, aB, ay[aH + 6], ai, 2734768916),
aB = aL(aB, aA, az, aC, ay[aH + 13], ah, 1309151649),
aC = aL(aC, aB, aA, az, ay[aH + 4], ak, 4149444226),
az = aL(az, aC, aB, aA, ay[aH + 11], aj, 3174756917),
aA = aL(aA, az, aC, aB, ay[aH + 2], ai, 718787259),
aB = aL(aB, aA, az, aC, ay[aH + 9], ah, 3951481745),
aC = aT(aC, aG),
aB = aT(aB, aF),
aA = aT(aA, aE),
az = aT(az, aD)
}
var ag = aJ(aC) + aJ(aB) + aJ(aA) + aJ(az);
return ag.toLowerCase()
}
三.總結
sign=加密函數(_m_h5_tk+"&"+t+"&"+appkey+"&"+data)
后續還有掃碼登錄淘寶的博客,
