jshook 中文文档 下载 App

crypto 加密解密——AES / DES / RSA / MD5 / SHA 一网打尽

支持的算法

类别算法方法名
消息摘要MD5crypto.md5(input)
SHA-1crypto.sha1(input)
SHA-256crypto.sha256(input)
SHA-512crypto.sha512(input)
对称加密AEScrypto.aesEncrypt / aesDecrypt
DEScrypto.desEncrypt / desDecrypt
非对称加密RSAcrypto.rsaEncrypt / rsaDecrypt
基础转换Base64base64.encode / base64.decode
Hexcrypto.toHex / crypto.fromHex

消息摘要(不可逆)

var hash = crypto.md5('hello world');
console.log('MD5: ' + hash);

var sha = crypto.sha256('hello world');
console.log('SHA-256: ' + sha);

输入是字符串,输出也是字符串(十六进制格式)。

AES 对称加密

var key = '1234567890abcdef';  // 16 字节 key(AES-128)
var iv = 'fedcba9876543210';   // 16 字节 IV

var encrypted = crypto.aesEncrypt('你好,JsHook', key, iv);
console.log('加密后: ' + encrypted);

var decrypted = crypto.aesDecrypt(encrypted, key, iv);
console.log('解密后: ' + decrypted);

key 和 IV 长度取决于模式:

RSA 非对称加密

// 公钥加密
var encrypted = crypto.rsaEncrypt('消息内容', publicKey);
// 私钥解密
var decrypted = crypto.rsaDecrypt(encrypted, privateKey);

密钥格式取决于 JsHook 内部实现,通常支持 PEM 格式字符串。

Base64

var encoded = base64.encode('hello world');
console.log(encoded);  // aGVsbG8gd29ybGQ=

var decoded = base64.decode(encoded);
console.log(decoded);  // hello world

Base64 同时在 crypto 模块和独立的 base64 模块中提供。

典型使用场景

抓取网络请求解密

目标应用用 AES 加密请求体,密钥硬编码在 Java 代码里。Hook 拿到 key 后用 crypto 模块解密看看真实内容:

Java.perform(function () {
    var RequestEncryptor = Java.use('com.example.net.RequestEncryptor');
    RequestEncryptor.encrypt.implementation = function (plainText) {
        // 调用原加密,同时用 crypto 模块解密看看
        var encrypted = this.encrypt(plainText);
        var decrypted = crypto.aesDecrypt(encrypted, myKey, myIV);
        console.log('[+] 加密前: ' + plainText);
        console.log('[+] 加密后: ' + encrypted);
        console.log('[+] crypto 解密验证: ' + decrypted);
        return encrypted;
    };
});

验证签名

目标应用对请求做了签名(MD5/SHA + salt),Hook 拿到参与签名的参数和 salt,用 crypto 模块复现签名过程验证逻辑:

var signStr = params + mySalt;
var sign = crypto.md5(signStr);
console.log('[+] 计算出的签名: ' + sign);

加密方向注意

JS 层的 crypto 模块运行在 Frida 注入的同一进程里,可以访问目标应用的内存。它的价值在于帮助你快速复现应用内部的加密逻辑,而不是提供比应用本身更强的加密能力。