基于异常处理的逻辑跳转逆向
字数 1073 2025-09-23 19:27:38
基于异常处理的逻辑跳转逆向分析技术文档
一、技术概述
本技术文档详细分析基于异常处理机制(Structured Exception Handling, SEH)实现的程序保护技术,重点研究通过除0异常触发和catch块跟踪的组合式逆向分析方法。该技术适用于处理使用try-catch机制隐藏核心逻辑的保护方案。
二、环境配置要求
2.1 逆向分析工具
- IDA Pro反汇编工具(需配置GBK编码支持)
- 调试器(支持SEH异常处理跟踪)
- Z3约束求解器(Python库)
2.2 编码配置
- 在IDA中手动设置GBK编码:Edit → Strings → String encoding → GBK
- 确保正确显示中文字符串(如asc_41C6F8对应的"请输入序列号:")
三、异常处理机制分析
3.1 try块结构分析
loc_401342:
mov [ebp+msexc.registration.TryLevel], 0 ; 初始化异常登记结构
test esi, esi ; 检查esi寄存器值
jz short loc40135D ; 若esi=0则跳转
push eax
call loc401354 ; 调用异常触发函数
3.2 除0异常触发函数
loc401354:
pop eax ; 平衡栈结构
sub eax, 0 ; 冗余指令(混淆用途)
sub esi, eax ; esi = esi - eax
div esi ; 关键指令:若esi=0触发异常(c0000094)
四、逆向分析过程
4.1 异常触发条件
- esi寄存器值必须为非零,否则跳过异常触发
- 通过
div esi指令实现异常触发(除数为零时)
4.2 except块分析(loc_401379)
mov esp, [ebp+msexc.oldesp] ; 恢复栈指针
lea edx, [ebp+var3C] ; 获取输入数据起始地址
lea ecx, [edx+1] ; 计算起始地址+1
; 计算输入数据长度循环
loc401382:
mov al, [edx]
inc edx
test al, al
jnz short loc401382
sub edx, ecx ; 得到数据长度
4.3 数据加密处理算法
loc401391:
movzx eax, [ebp+ecx+var3C] ; 读取输入字节
add ax, 9 ; 加法加密:值+9
mov word_41F300[ecx*2], ax ; 存储到目标地址
inc ecx
cmp ecx, edx
jl short loc401391 ; 循环处理所有字节
五、调试技巧
5.1 断点设置策略
- 直接在except块(loc_401379)设置断点
- 避免在异常触发前设置断点导致程序卡死
- 利用异常自动跳转机制,让程序自行跳转到except块
5.2 关键数据跟踪
- 输入数据存储位置:[ebp+var3C]
- 处理结果存储位置:word_41F300
- 数据长度存储在edx寄存器中
六、Z3约束求解应用
6.1 算法逆向建模
将加密算法转化为Z3约束条件:
from z3 import *
# 创建求解器实例
solver = Solver()
# 假设已知加密后的目标值
target_values = [t1, t2, t3, ..., tn] # 从word_41F300获取
# 创建输入变量
input_vars = [BitVec(f'in_{i}', 8) for i in range(len(target_values))]
# 添加约束条件
for i in range(len(target_values)):
# 加密算法:input + 9 = target
solver.add(input_vars[i] + 9 == target_values[i])
6.2 序列号求解
# 检查可满足性
if solver.check() == sat:
model = solver.model()
# 提取输入序列号
serial = ''.join(chr(model[var].as_long()) for var in input_vars)
print("序列号:", serial)
else:
print("无解")
七、实战注意事项
7.1 常见问题处理
- 中文显示问题:确保IDA正确配置GBK编码
- 异常处理识别:注意识别try-catch结构的汇编特征
- 栈平衡维护:异常处理中注意esp的恢复操作
7.2 效率优化
- 优先在except块设置断点,避免跟踪异常触发过程
- 利用Z3求解器自动化处理加密算法
- 结合静态分析和动态调试提高效率
八、技术总结
本技术通过分析SEH异常处理机制,结合以下关键点实现逆向分析:
- 识别try块初始化特征(TryLevel字段设置)
- 分析异常触发条件(esi寄存器检查和div指令)
- 在except块设置断点避免跟踪异常触发
- 提取加密算法(字节级加法加密)
- 使用Z3约束求解器反向计算原始输入
该方法适用于类似结构的异常保护方案,具有较强的通用性和实用性。
文档基于实际逆向工程案例编写,适用于Windows平台SEH异常处理机制的分析