某拍App算法so层逆向分析
字数 1071 2025-08-22 18:37:22

某拍App算法so层逆向分析教学文档

1. 数字签名基础

数字签名是指只有信息的发送者才能产生的别人无法伪造的一段数字串,同时也是对信息发送者真实性的有效证明。数字签名通过单向函数对信息进行处理,用于认证信息来源并核实信息在传送过程中是否发生变化。

目前应用最广泛的三种签名算法:

  • Rabin签名
  • DSS签名
  • RSA签名

2. 抓包分析

初步分析发现签名算法疑似使用MD5加密。

3. 静态分析流程

3.1 定位关键代码

  1. 通过搜索sig定位到代码区域(注意会有多个结果,需结合封包内容分析)
  2. 观察到Arg7.put的几个参数在封包中都是加密的
  3. 跟踪到generatorSig方法

3.2 分析native方法

  1. 发现代码载入了so文件(release_sig
  2. nativeGeneratorSig方法在Java层没有实现体
  3. 确认算法实现在so文件中

3.3 so文件静态分析

  1. 在IDA中查找nativeGeneratorSig函数
  2. 跟踪到GeneratorSIG方法
  3. 发现参数经过MD5_Calculate函数处理
  4. 确认MD5加密过程:
    • 参数传入MD5加密函数
    • 经过格式化字节流处理
    • 返回加密结果

4. 动态调试过程

4.1 设置断点

  1. 在MD5加密处设置断点(可捕获未加密明文)
  2. 寄存器说明:
    • R0-R3:传参寄存器
    • R0:也可用作返回结果

4.2 捕获明文

  1. 从寄存器中获取未加密明文示例:
    update/h5_zip01108985730222.1.02.2056.9.5MTAccountWebUIqA#QH=M+Ns&q+Z&J1561214990711Tw5AY783H@EU3#XC
    

4.3 获取密文

  1. 根据静态分析,密文存储在result中
  2. 在IDA中找到对应位置
  3. 重命名关键函数(如将sub_77CF4B18重命名为sprintf
  4. 将断点设置在循环外部避免陷入循环
  5. 运行到断点处获取加密值示例:
    7d12ef85fa0c66c7a549d8cd9336f22c
    

5. 验证过程

  1. 将捕获的明文进行MD5加密
  2. 对比动态调试获取的密文
  3. 确认两者一致,验证分析正确性

6. 关键点总结

  1. 签名算法定位:通过封包特征定位sig相关代码
  2. JNI分析:识别native方法并定位so实现
  3. IDA静态分析:
    • 查找关键函数
    • 跟踪加密流程
    • 识别MD5相关函数
  4. 动态调试技巧:
    • 寄存器监控
    • 断点设置策略
    • 循环处理技巧
  5. 验证方法:独立计算MD5比对结果

7. 工具使用建议

  1. 抓包工具:Charles/Fiddler
  2. 反编译工具:JEB/JADX
  3. 静态分析:IDA Pro
  4. 动态调试:IDA Pro调试器或GDB
  5. MD5计算工具:在线工具或本地计算工具

8. 扩展思考

  1. 如何识别其他加密算法(如AES、SHA等)
  2. 对抗so加固的方法
  3. 自动化分析脚本开发思路
  4. 算法还原后的重实现方法
某拍App算法so层逆向分析教学文档 1. 数字签名基础 数字签名是指只有信息的发送者才能产生的别人无法伪造的一段数字串,同时也是对信息发送者真实性的有效证明。数字签名通过单向函数对信息进行处理,用于认证信息来源并核实信息在传送过程中是否发生变化。 目前应用最广泛的三种签名算法: Rabin签名 DSS签名 RSA签名 2. 抓包分析 初步分析发现签名算法疑似使用MD5加密。 3. 静态分析流程 3.1 定位关键代码 通过搜索 sig 定位到代码区域(注意会有多个结果,需结合封包内容分析) 观察到 Arg7.put 的几个参数在封包中都是加密的 跟踪到 generatorSig 方法 3.2 分析native方法 发现代码载入了so文件( release_sig ) nativeGeneratorSig 方法在Java层没有实现体 确认算法实现在so文件中 3.3 so文件静态分析 在IDA中查找 nativeGeneratorSig 函数 跟踪到 GeneratorSIG 方法 发现参数经过 MD5_Calculate 函数处理 确认MD5加密过程: 参数传入MD5加密函数 经过格式化字节流处理 返回加密结果 4. 动态调试过程 4.1 设置断点 在MD5加密处设置断点(可捕获未加密明文) 寄存器说明: R0-R3:传参寄存器 R0:也可用作返回结果 4.2 捕获明文 从寄存器中获取未加密明文示例: 4.3 获取密文 根据静态分析,密文存储在result中 在IDA中找到对应位置 重命名关键函数(如将 sub_77CF4B18 重命名为 sprintf ) 将断点设置在循环外部避免陷入循环 运行到断点处获取加密值示例: 5. 验证过程 将捕获的明文进行MD5加密 对比动态调试获取的密文 确认两者一致,验证分析正确性 6. 关键点总结 签名算法定位:通过封包特征定位 sig 相关代码 JNI分析:识别native方法并定位so实现 IDA静态分析: 查找关键函数 跟踪加密流程 识别MD5相关函数 动态调试技巧: 寄存器监控 断点设置策略 循环处理技巧 验证方法:独立计算MD5比对结果 7. 工具使用建议 抓包工具:Charles/Fiddler 反编译工具:JEB/JADX 静态分析:IDA Pro 动态调试:IDA Pro调试器或GDB MD5计算工具:在线工具或本地计算工具 8. 扩展思考 如何识别其他加密算法(如AES、SHA等) 对抗so加固的方法 自动化分析脚本开发思路 算法还原后的重实现方法