加密算法逆向与HOOK技术实战

1. 密码学基础与逆向特征识别

1.1 算法分类与模式特征

常见算法指纹库

python 复制代码
# 算法特征识别字典  
CRYPTO_SIGNATURES = {  
    "AES": {  
        "init": ["AES/ECB", "AES/CBC", "AES/GCM"],  
        "key_len": [128, 256],  
        "iv_required": True  
    },  
    "RSA": {  
        "init": ["RSA/ECB/PKCS1Padding"],  
        "key_spec": ["RSAPublicKey", "RSAPrivateKey"]  
    },  
    "HMAC": {  
        "digest": ["HmacSHA256", "HmacMD5"]  
    }  
}  
1.1.1 对称加密特征
  • AES-CBC模式逆向要点

    • 定位IvParameterSpec初始化

    • 追踪Cipher.getInstance("AES/CBC/PKCS5Padding")调用

    • 识别密钥扩展过程(PBKDF2/Scrypt)

1.1.2 非对称加密特征
  • RSA-OAEP模式识别

    • 查找Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")

    • 分析密钥存储方式(Keystore vs 硬编码)


2. 静态逆向分析技术

2.1 密钥定位策略

2.1.1 硬编码密钥提取
java 复制代码
// 典型密钥硬编码模式  
public class Config {  
    private static final String SECRET_KEY = "A3F8D9E1B5C72A";  
    private static final byte[] IV = {0x01, 0x02...};  
}  

自动化扫描脚本

python 复制代码
def find_hardcoded_keys(code):  
    patterns = [  
        r'String\s+\w+\s*=\s*"[A-F0-9]{16,}"',  
        r'byte\[\]\s+\w+\s*=\s*\{0x[0-9A-F]{2}(,\s*0x[0-9A-F]{2}){7,}\}'  
    ]  
    return re.findall('|'.join(patterns), code)  
2.1.2 动态密钥推导分析

PBKDF2算法逆向流程

  1. 定位SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")

  2. 提取盐值(Salt)生成逻辑

  3. 分析迭代次数参数

  4. 追踪派生密钥使用路径


3. 动态HOOK技术实战

3.1 Java层HOOK方案

3.1.1 Cipher类监控
python 复制代码
Java.perform(() => {  
    const Cipher = Java.use('javax.crypto.Cipher');  
    Cipher.doFinal.overload('[B').implementation = function(input) {  
        console.log(`AES Input: ${hexdump(input)}`);  
        const result = this.doFinal(input);  
        console.log(`AES Output: ${hexdump(result)}`);  
        return result;  
    };  
});  
3.1.2 密钥工厂监控
javascript 复制代码
const SecretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');  
SecretKeySpec.$init.overload('[B', 'java.lang.String').implementation = function(key, algo) {  
    console.log(`Key Spec Created: ${hexdump(key)} | Algorithm: ${algo}`);  
    return this.$init(key, algo);  
};  

3.2 Native层HOOK方案

3.2.1 OpenSSL函数拦截
javascript 复制代码
const SSL_write = Module.findExportByName('libssl.so', 'SSL_write');  
Interceptor.attach(SSL_write, {  
    onEnter: function(args) {  
        this.ssl = args[0];  
        this.data = args[1];  
        this.len = args[2];  
    },  
    onLeave: function(retval) {  
        console.log(`SSL Write: ${hexdump(this.data, this.len.toInt32())}`);  
    }  
});  
3.2.2 自定义加密库破解
cpp 复制代码
// 目标函数原型  
void custom_encrypt(char* data, int len, char key[16]);  
javascript 复制代码
const encrypt_addr = Module.findExportByName('libenc.so', 'custom_encrypt');  
Interceptor.attach(encrypt_addr, {  
    onEnter: function(args) {  
        console.log(`Key: ${hexdump(args[2], 16)}`);  
        this.encrypted = Memory.dup(args[0], args[1].toInt32());  
    },  
    onLeave: function(retval) {  
        console.log(`Encrypted: ${hexdump(this.encrypted, args[1].toInt32())}`);  
    }  
});  

4. 协议逆向工程

4.1 请求响应加解密

典型流程逆向步骤

  1. 抓取原始请求/响应数据包

  2. 定位加密入口(JSON序列化前后)

  3. 追踪加密模式与密钥传递链

  4. 重构加解密原型代码

案例:某IoT设备协议

python 复制代码
# 重构后的解密函数  
def iot_decrypt(ciphertext: bytes, key: bytes) -> bytes:  
    iv = ciphertext[:16]  
    cipher = AES.new(key, AES.MODE_CBC, iv)  
    return unpad(cipher.decrypt(ciphertext[16:]))  

5. 白盒密码分析

5.1 密钥隐藏技术破解

字符串混淆对抗方案

java 复制代码
// 原密钥生成  
String key = decodeStr(new byte[]{0x12, 0x34...});  

// 动态Hook获取  
Java.use("com.example.Crypto").decodeStr.implementation = function(arr) {  
    const result = this.decodeStr(arr);  
    console.log(`Decoded Key: ${result}`);  
    return result;  
};  

5.2 代码虚拟化对抗

VMP保护逆向策略

  1. 定位虚拟机入口函数

  2. 分析字节码调度逻辑

  3. Hook解释器核心函数

javascript 复制代码
const opcode_handler = Module.findExportByName('libvmp.so', 'handle_opcode');  
Interceptor.attach(opcode_handler, {  
    onEnter: function(args) {  
        const opcode = args[0].toInt32();  
        console.log(`VMP Opcode: 0x${opcode.toString(16)}`);  
    }  
});  

6. 自动化逆向框架

6.1 密钥追踪系统设计

python 复制代码
class KeyTracer:  
    def __init__(self, apk):  
        self.apk = apk  
        self.keys = []  

    def trace(self):  
        # 静态分析定位密钥相关代码  
        for cls in self.apk.classes:  
            if "Crypto" in cls.name:  
                self._analyze_crypto_class(cls)  

    def _analyze_crypto_class(self, cls):  
        # 具体分析逻辑...  

6.2 智能模式匹配引擎

bash 复制代码
rules:  
  - name: AES_KEY_DERIVATION  
    pattern: |  
      SecretKeyFactory\.getInstance\("PBKDF2WithHmacSHA256"\)  
      .*generateSecret\(.*\)  
    action: LOG_KEY  

7. 反HOOK对抗技术

7.1 环境检测防御

检测Frida特征

cpp 复制代码
__attribute__((constructor)) void detect_frida() {  
    if (access("/data/local/tmp/frida-server", F_OK) == 0) {  
        exit(0);  
    }  
}  

7.2 动态代码混淆

指令级混淆方案

cpp 复制代码
; 原始指令  
LDR R0, [R1]  
ADD R0, R0, #1  
STR R0, [R1]  

; 混淆后  
MOV R3, #1  
LDR R0, [R1]  
ADD R0, R0, R3  
STR R0, [R1]  
NOP  
BX LR  

8. 企业级实战案例

8.1 金融APP加密协议逆向

破解流程

  1. 使用jadx定位com.xxx.security

  2. 分析SecureSession初始化过程

  3. Hook SSLContext.init获取密钥材料

  4. 提取并验证RSA公钥证书

  5. 重写Python请求模拟器

关键代码

python 复制代码
from cryptography.hazmat.primitives import serialization  
from requests import Session  

class FinancialAPI(Session):  
    def __init__(self, pub_key):  
        self.pub_key = pub_key  
        # 证书加载...  

    def _sign_request(self, data):  
        # 使用逆向得到的签名逻辑...  
        return signed_data  
相关推荐
weixin_440784113 小时前
【HandlerThread实现原理】
android·java·开发语言
天空'之城3 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
XR1234567883 小时前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟3 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
迷迭香yy4 小时前
集合竞价数据挖掘实战:用Python构建开盘信号识别系统
人工智能·python·数据挖掘
現実君4 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1234 小时前
SpringDAO的用法
java·开发语言·数据库
李昊哲小课6 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
格林威7 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
初级代码游戏8 小时前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift