これは、2022 年に私が JS リバース エンジニアリングをどのようにして習得できたかを示す一例です。 URL: (感度解除処理) aHR0cHM6Ly93d3cuZ2R0di5jbi9hdWRpb0NoYW5uZWxEZXRhaWwvOTE=
逆分析:
1. 各 XHR GET リクエストによって送信されるヘッダーには次のものが含まれます。
{
"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. Web サイトの JS ファイルは webpack の形式です。キー暗号化ロジックを確認します。
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: デバイス UUID。文字列を入力するだけですが、Web サイトでは「WEB_」で始まる必要があります (例: WEB_9527-3547-709394)。
(5) X-ITOUCHTV-Ca-Signature: これは重要な署名値です。
l.default.stringify((0, o.default)(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX"))
このコード行の前にある l.default は無視できるため、次のように理解されます。 o.default(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX");
長い文字列がキーであり、m 値とキーは o.default メソッドによって暗号化されます。
mって何ですか?上記の行は明確に書かれています。
var m = "".concat(t, "\n").concat(n, "\n").concat(d, "\n").concat(_);
m は、t、n、d、および _ の値を連結した文字です。ブレークポイントの追跡を通じて、t はリクエストの送信方法 (GET、POST、OPTION など)、n は URL リンク、d はタイムスタンプ、「_」の場合は空の文字列、次に、各サブ文字の文字列が改行で連結されるため、この行は m = t + '\n' + n + '\n' + d + '\n' に簡略化できます。
4. アルゴリズム分析:
ブレークポイントを通じて上記の o.default メソッドを追跡します。o の値は、WebPack を通じて呼び出されるシリアル番号 1305 のメソッドである「o = a(n(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)
プレーンテキストとキーを入力すると、生成された結果のペアは、開発者ツールに表示されるリクエスト ヘッダーの X-ITOUCHTV-Ca-Signature と一致します。幸いなことに、Web サイトは暗号化アルゴリズムを魔法のように変更しないため、次に Python The hmac を使用します。ライブラリと Base64 ライブラリの暗号化コードは自然に作成されます。
2023 年 10 月 19 日更新:
最近、この Web サイトの .js ファイルが変更されました。上記の暗号化ロジックはすべての .js ファイルで見つかりません。代わりに、暗号化は wasm モジュール (WebAssembly) を通じて実行され、リバース エンジニアリングの難易度がさらに高くなります。 。
wasmのリバースエンジニアリングやインストルメンテーション解析を通じて、wasmはただの張り子の虎であることが分かりましたが、暗号化アルゴリズムはHmacSHA256のままで変更されておらず、キーとX-ITOUCHTV-Ca-Keyの値が変わっているだけです。
ソース コードが必要な友人は、私 (+V: Scott373519) まで連絡してください。
参照元:
Python は HmacSHA256 を使用し、base64_sha256+base64 で暗号化します - CSDN ブログ