从JS逆向到Python DES解码

写教程比较麻烦的地方是提供一个可行的事例,对于逆行来说,这里可能会碰触到合法合规的问题。毕竟逆向和破解是分不开的。因此本文中相关的JS逆向,只能空口说说,任何截图可能会出现意想不到的问题。本文主要是讲解如何使用开发者工具调试和分析网站的数据访问控制,加密手段等。

对于网站调试,Chrome的开发者工具是个好东西(Firefox和Edge的也很好用)。例如A网站向服务器发起一个获取密钥的操作。通过开发者工具的网络检查数据包,通过源代码中的XHR断点,追踪XHR调用和返回,可以大致找到JS对数据的后续操作。

标准Python DES解密

DES加密解密是一个比较标准开发流程。但是在实际使用过程中,可能还是会遇到一些情况。例如,使用JS逆向发现网站使用CryptoJS进行解密操作。例如:

function decryptByDES(encryptData, key) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var plainData = CryptoJS.DES.decrypt({
        ciphertext: CryptoJS.enc.Base64.parse(encryptData)
    }, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return plainData.toString(CryptoJS.enc.Utf8);
}

以上前段代码片段是使用密钥解密一个加密的字符串。DES加密解密一般需要4个参数:

  • 密钥:一个8字节/64位的字符串
  • VI:一个8字节/64位的字符串,这个是可选的
  • 加密类型:上例中为ECB,这个选项有还包括CBC等多个不同类型
  • 加密解密数据:数据

这里需要提一句使用CryptoJS加解密使用的Key如果超过8字节的话,实际只使用前8个字节。但是使用Python包Crypto.Cipher,如果key超过8字节就会报错。以下是一个Python的解密实现:

response = requests.post(url, headers=headers, verify=False, allow_redirects=False)
response.raise_for_status()
response.encoding = response.apparent_encoding
unicodeText = response.text
key = key[:8].encode("utf-8") #截取8字节密钥
cipher = DES.new(key, DES.MODE_CBC)
data = base64.b64decode(unicodeText)
decrypted_data = cipher.decrypt(data)
#unpad
padLength = decrypted_data[-1] * -1
decrypted_data = decrypted_data[:padLength]
data = ujson.loads(decrypted_data)

加解密PADDING

关于数据填充,通常有ZeroPadding、PKCS7Padding、PKCS5Pading。其中PKCS7Padding是OpenSSL加密算法的默认填充算法。上面CryptoJS包中的解密算法会自动解除填充。而Python代码需要自己实现。更多数据填充的问题,可以参考这篇文章

Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。