当前位置: 首页 > article >正文

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

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

1.1 算法分类与模式特征

常见算法指纹库

# 算法特征识别字典  
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 硬编码密钥提取
// 典型密钥硬编码模式  
public class Config {  
    private static final String SECRET_KEY = "A3F8D9E1B5C72A";  
    private static final byte[] IV = {0x01, 0x02...};  
}  

自动化扫描脚本

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类监控
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 密钥工厂监控
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函数拦截
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 自定义加密库破解
// 目标函数原型  
void custom_encrypt(char* data, int len, char key[16]);  
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设备协议

# 重构后的解密函数  
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 密钥隐藏技术破解

字符串混淆对抗方案

// 原密钥生成  
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解释器核心函数

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 密钥追踪系统设计

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 智能模式匹配引擎

rules:  
  - name: AES_KEY_DERIVATION  
    pattern: |  
      SecretKeyFactory\.getInstance\("PBKDF2WithHmacSHA256"\)  
      .*generateSecret\(.*\)  
    action: LOG_KEY  

7. 反HOOK对抗技术

7.1 环境检测防御

检测Frida特征

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

7.2 动态代码混淆

指令级混淆方案

; 原始指令  
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请求模拟器

关键代码

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  


http://www.kler.cn/a/587052.html

相关文章:

  • OpenHarmony子系统开发 - ArkCompiler开发指导
  • matlab 控制系统GUI设计-PID控制超前滞后控制
  • 打靶日记Kioptix Level 4
  • vue项目如何实现条件查询?
  • 贪吃蛇小游戏-简单开发版
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-2-性能调优工具箱
  • 路由器和网关支持边缘计算
  • 无需归一化的Transformers:神经网络设计的突破
  • 单元测试、系统测试、集成测试
  • MySQL数据库知识总结
  • Java 大视界 -- Java 大数据在智能金融资产定价与风险管理中的应用(134)
  • install of jenkins-2.501-1.1.noarch conflicts with file
  • 【redis】hash 类型应用场景
  • 面试系列|蚂蚁金服技术面【2】
  • The workbook already contains a sheet named
  • docker 增加镜像(忘记什么bug了)
  • Linux下的正则表达式应用与sed、printf、awk等命令的使用
  • 大模型架构全景解析:从Transformer到未来计算范式
  • Java 大视界 -- Java 大数据中的异常检测算法在工业物联网中的应用与优化(133)
  • 介绍一下 VexRiscv