某拠点ネットワークのHMAC暗号化とwasmモジュール暗号化のJS逆解析

これは、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 ブログ

おすすめ

転載: blog.csdn.net/Scott0902/article/details/133939126