JS逆向——AES加密逆向分析
JS逆向——AES加密逆向分析
一. 分析思路
- networks抓包分析得到关键发送的报文
- ctrl+shift+f查找关键字符所在的的JS文件,实现定位js文件的功能
- 在js代码当中下断点进行动态调试分析,逐步分析得到加密和处理函数的流程
- 使用python模拟加密流程得到结果
二. 具体实现
1. 抓包分析
使用chrome浏览器得到发送的login文件报文,对应有username和password两个关键字。其中username是明文传递,而password则是使用加密后的base编码传递。
2. 动态分析
使用ctrl+shift+p搜索关键字password,定位到关键加密函数
定位到关键加密函数_etd2函数,传递的参数包括password.val()和一个salt值。下断点查看实际这两个数值是多少,password即为输入的123456,salt值则为一个确定数值。
继续跟踪,找到_etd2函数,调用了encryptAES函数,传递的参数为password和salt。
继续跟踪,找到encryptAES函数,调用了_gas函数和_rds函数,然后返回最后的加密内容。
_rds函数:通过随机数返回一段特定长度的字符串,字符串的内容限制为大小写字母和数字
_gas函数:实际加密函数,实现对于数据进行pkcs7填充,CBC模式的AES加密
到这里,整个加密流程已经很清晰了,下一步就是找到所有参数进行实际加密。
3. python脚本模拟加解密
动态调试得到所有参数信息
编写python脚本进行加解密:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64
def _aes_encrypt(data, key, iv):
# AES key must be either 16, 24, or 32 bytes long
# AES-256 is used in this example, so key must be 32 bytes
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted_data = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
# Convert to base64 for safe transmission
return base64.b64encode(encrypted_data).decode('utf-8')
def _aes_decrypt(encrypted_data, key, iv):
# AES key must be either 16, 24, or 32 bytes long
# AES-256 is used in this example, so key must be 32 bytes
# Decode base64 first
encrypted_data = base64.b64decode(encrypted_data)
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
return decrypted_data.decode('utf-8')
# Example usage
key0 = "z0hOHHyXMP01Bay1" # 32 bytes key for AES-256
iv0 = "jGSmNQMxdXxFG3Sf"
data = "3ambMji4rMym3bjarYWThwx6aRcBzMwiZzneBXMXYmFW6cbM5FnGJPnJQT4fsNdp123456"
key = key0.encode('utf-8')
iv = iv0.encode('utf-8')
encrypted = _aes_encrypt(data, key, iv)
print("Encrypted:", encrypted)
decrypted = _aes_decrypt(encrypted, key, iv)
print("Decrypted:", decrypted)
运行结果如下:
加密得到的结果相同并且可成功解密,逆向结束。