(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è)你在斷點(diǎn)處
// 查看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以便查看
// 導(dǎo)出key(這需要原始的CryptoKey是可導(dǎo)出的)
crypto.subtle.exportKey('raw', key).then(exportedKey => {
console.log('Exported key:', new Uint8Array(exportedKey)); // 將導(dǎo)出的密鑰轉(zhuǎn)換為Uint8Array以便查看
}).catch(error => {
console.error('Key export failed:', error);
});
// 調(diào)用原始的decrypt函數(shù)進(jìn)行解密
const result = await originalDecrypt.apply(this, arguments);
// 在解密之后執(zhí)行你的代碼
console.log('Data decrypted.');
// 返回解密結(jié)果
return result;
};
})();
我們需要的參數(shù)如下嫉嘀,通過腳本可以斷點(diǎn)并獲取值:
- iv = b'...' # 初始化向量(從JavaScript中獲燃粑辍)
- encrypted_data = b'...' # 要解密的數(shù)據(jù)(從JavaScript中獲取瓣俯,也可以從接口獲取)
- 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)