js hook AES-CBC 并用python代碼代替解密

(function() {
    // 保存原始的decrypt函數(shù)引用
    const originalDecrypt = crypto.subtle.decrypt;

    // 重寫decrypt函數(shù)
    crypto.subtle.decrypt = async function(algorithm, key, data) {
        // 在解密之前執(zhí)行你的代碼
        console.log('Decrypting data...');
        debugger;
        // 假設(shè)你在斷點處
        // 查看algorithm對象
        console.log('Algorithm object:', algorithm);

        // 如果algorithm是AES-CBC,你可以這樣獲取iv
        const iv = algorithm.iv;
        console.log('Initialization Vector (IV):', new Uint8Array(iv)); // 將iv轉(zhuǎn)換為Uint8Array以便查看

        // 查看data
        const encryptedData = new Uint8Array(data);
        console.log('Encrypted data:', encryptedData); // 將data轉(zhuǎn)換為Uint8Array以便查看

        // 導出key(這需要原始的CryptoKey是可導出的)
        crypto.subtle.exportKey('raw', key).then(exportedKey => {
            console.log('Exported key:', new Uint8Array(exportedKey)); // 將導出的密鑰轉(zhuǎn)換為Uint8Array以便查看
        }).catch(error => {
            console.error('Key export failed:', error);
        });
        // 調(diào)用原始的decrypt函數(shù)進行解密
        const result = await originalDecrypt.apply(this, arguments);

        // 在解密之后執(zhí)行你的代碼
        console.log('Data decrypted.');

        // 返回解密結(jié)果
        return result;
    };
})();

我們需要的參數(shù)如下,通過腳本可以斷點并獲取值:

  • iv = b'...' # 初始化向量(從JavaScript中獲?。?/li>
  • encrypted_data = b'...' # 要解密的數(shù)據(jù)(從JavaScript中獲取,也可以從接口獲?。?/li>
  • key = b'...' # 密鑰(從JavaScript中獲取)

轉(zhuǎn)換成python代碼:

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

# JavaScript對象轉(zhuǎn)換為Python字節(jié)序列
iv = bytes([57, 233, 12, 46, 56, 33, 70, 15, 47, 149, 127, 207, 122, 98, 220, 249])  # 替換你hook的值
data = bytes([
    21, 78, 114, 236, 56, 217, 136, 85, 191, 7, 36, 20, 10, 30, 147, 102,
    231, 4, 127, 144, 17, 36, 62, 31, 145, 41, 3, 213, 237, 150, 184, 195,
    108, 187, 30, 241, 205, 52, 5, 91, 225, 54, 138, 63, 59, 57, 211, 169,
    243, 46, 65, 237, 8, 190, 186, 81, 43, 241, 194, 162, 61, 30, 227, 146
])  # 替換你hook的值
key = bytes([74, 53, 219, 97, 50, 91, 239, 53, 232, 81, 58, 18, 137, 197, 11, 220])   # 替換你hook的值

# 創(chuàng)建一個AES-CBC解密器
cipher = AES.new(key, AES.MODE_CBC, iv)

# 解密數(shù)據(jù)并去除填充
try:
    original_data = unpad(cipher.decrypt(data), AES.block_size)
    print('Decrypted data:', original_data)
except ValueError as e:
    print('Unpad error:', e)

但是我們從接口拿到的,一般是base64格式,需要轉(zhuǎn)換成bytes格式:

import base64

# Base64編碼的字符串
base64_data = "1d0KbgHFAg6tvG/pSUlIUfrN6N+5VP+XLB+FH6m/aOfAmDTzelb/77oaBKHP7fsylmvaQr4j1TB3Jn106PPAyHBZNDZWsp0Kh27BCl3Km0jBzoc2Y5LmQjZAR9pAb426"

# 解碼Base64字符串
data = base64.b64decode(base64_data)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容