這是我2022年學(xué)做JS逆向成功的例子,URL:(脫敏處理)aHR0cHM6Ly93d3cuZ2R0di5jbi9hdWRpb0NoYW5uZWxEZXRhaWwvOTE=
逆向分析:
1、每次XHR的GET請求攜帶的headers包括:
{
"X-ITOUCHTV-Ca-Timestamp": "1697608868940",
"X-ITOUCHTV-Ca-Signature": "hGlre/JKwbHvCWLpO5JQdUHF7nP4HiaA5ya1DenJToA=",
"X-ITOUCHTV-Ca-Key": "89541443007807288657755311869534",
"X-ITOUCHTV-CLIENT": "WEB_PC",
"X-ITOUCHTV-DEVICE-ID": "WEB_1c2f8b90-6bd8-11ee-96e0-5bc8d7091aa8"
}
2、該網(wǎng)站的JS文件采用webpack形式。找出關(guān)鍵的加密邏輯:
this.s = function(t, n, a) {
var s = i.default.getUser
, u = i.default.getJWT
, c = i.default.getDeviceId
, d = (new Date).getTime()
, f = {}
, p = ""
, _ = "";
a && (p = (0,
r.default)(a),
_ = l.default.stringify(p));
var m = "".concat(t, "\n").concat(n, "\n").concat(d, "\n").concat(_);
return f = {
"Content-Type": "application/json",
"X-ITOUCHTV-Ca-Timestamp": d,
"X-ITOUCHTV-Ca-Signature": l.default.stringify((0,
o.default)(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX")),
"X-ITOUCHTV-Ca-Key": "89541443007807288657755311869534",
"X-ITOUCHTV-CLIENT": "WEB_PC",
"X-ITOUCHTV-DEVICE-ID": e.__DEVICEID__ || c()
},
u() && (f.Authorization = u()),
s() && s().pk && (f["X-ITOUCHTV-USER-PK"] = s().pk),
e.__X_FORWARDED_FOR__ && (f["X-Forwarded-For"] = e.__X_FORWARDED_FOR__),
f
};
3、初步分析:
(1)X-ITOUCHTV-Ca-Timestamp很明顯是時間戳。
(2)X-ITOUCHTV-Ca-Key這個值是固定的"89541443007807288657755311869534",可以寫死。
(3)"X-ITOUCHTV-CLIENT": "WEB_PC"也是固定寫死的。
(4)X-ITOUCHTV-DEVICE-ID:設(shè)備UUID,隨便擼一串字符串都可以,但該網(wǎng)站要求一定要以 "WEB_"開頭,比如:WEB_9527-3547-709394。
(5)X-ITOUCHTV-Ca-Signature:這是至關(guān)重要的簽名值。
l.default.stringify((0,?o.default)(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX"))
這一行代碼前面的 l.default 可以不管了,因此理解為:o.default(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX");
其中長串字符是密鑰,通過 o.default 方法把 m 值和密鑰進(jìn)行加密。
m 是什么?上面幾行已寫清楚了:
var m = "".concat(t, "\n").concat(n, "\n").concat(d, "\n").concat(_);
m 是由 t、n、d、_值串聯(lián)起來的字符。通過斷點(diǎn)跟蹤,可以得知:t 是發(fā)送請求的方式(GET、POST、OPTION之類),n 是URL鏈接,d 是時間戳,至于“_”嘛,是個空字符串,然后每個子字符串以換行符拼接,因此這一行可以簡化成?m = t + '\n' + n + '\n' + d + '\n'。
4、算法分析:
通過斷點(diǎn)跟蹤上面提及的 o.default 方法,o 值來源于“o = a(n(1305))”,是通過WebPack調(diào)取第序列號為1305的方法,可以看到
function(e, _t, n) {
var r;
e.exports = (r = n(43),
n(393),
n(285),
r.HmacSHA256)
},
也就是使用HmacSHA256算法加密,然后輸出BASE64字符串。
找一個Python的HmacSHA256的加密代碼嘗試一下:
import hmac
from base64 import b64encode
from hashlib import sha256
key = '。。。。。。' # HMAC-SHA256加密的密鑰
text = '。。。。。。' # 加密前的明文字符串
signature = str(b64encode(hmac.new(key.encode('utf-8'), text.encode('utf-8'), digestmod=sha256).digest()), 'utf-8')
print(signature)
輸入明文、密鑰,生成的結(jié)果結(jié)果對碰上了,跟開發(fā)者工具里看到的請求頭的X-ITOUCHTV-Ca-Signature一致,幸好該網(wǎng)站沒有魔改加密算法,因此接下來用Python的 hmac 庫和 base64 庫加密代碼就水到渠成了。
2023年10月19日更新:
最近該網(wǎng)站的.js文件作了修改,在所有.js文件里已經(jīng)找不到上述提到的加密邏輯了,而是通過wasm模塊(WebAssembly)進(jìn)行加密,逆向的難度進(jìn)一步增強(qiáng)。
我通過逆向wasm、插樁分析,最后得知wasm只是紙老虎,加密算法依然是HmacSHA256而且沒有被魔改,只是密鑰以及 X-ITOUCHTV-Ca-Key 的值變了。
需要源代碼的朋友歡迎聯(lián)系我(+V:Scott373519)。
參考來源:文章來源:http://www.zghlxwxcb.cn/news/detail-721340.html
Python使用HmacSHA256并用base64加密_sha256+base64-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-721340.html
到了這里,關(guān)于JS逆向分析某枝網(wǎng)的HMAC加密、wasm模塊加密的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!