基于异常处理的逻辑跳转逆向
字数 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 常见问题处理

  1. 中文显示问题:确保IDA正确配置GBK编码
  2. 异常处理识别:注意识别try-catch结构的汇编特征
  3. 栈平衡维护:异常处理中注意esp的恢复操作

7.2 效率优化

  • 优先在except块设置断点,避免跟踪异常触发过程
  • 利用Z3求解器自动化处理加密算法
  • 结合静态分析和动态调试提高效率

八、技术总结

本技术通过分析SEH异常处理机制,结合以下关键点实现逆向分析:

  1. 识别try块初始化特征(TryLevel字段设置)
  2. 分析异常触发条件(esi寄存器检查和div指令)
  3. 在except块设置断点避免跟踪异常触发
  4. 提取加密算法(字节级加法加密)
  5. 使用Z3约束求解器反向计算原始输入

该方法适用于类似结构的异常保护方案,具有较强的通用性和实用性。


文档基于实际逆向工程案例编写,适用于Windows平台SEH异常处理机制的分析

基于异常处理的逻辑跳转逆向分析技术文档 一、技术概述 本技术文档详细分析基于异常处理机制(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块结构分析 3.2 除0异常触发函数 四、逆向分析过程 4.1 异常触发条件 esi寄存器值必须为非零,否则跳过异常触发 通过 div esi 指令实现异常触发(除数为零时) 4.2 except块分析(loc_ 401379) 4.3 数据加密处理算法 五、调试技巧 5.1 断点设置策略 直接在except块(loc_ 401379)设置断点 避免在异常触发前设置断点导致程序卡死 利用异常自动跳转机制,让程序自行跳转到except块 5.2 关键数据跟踪 输入数据存储位置:[ ebp+var3C ] 处理结果存储位置:word_ 41F300 数据长度存储在edx寄存器中 六、Z3约束求解应用 6.1 算法逆向建模 将加密算法转化为Z3约束条件: 6.2 序列号求解 七、实战注意事项 7.1 常见问题处理 中文显示问题 :确保IDA正确配置GBK编码 异常处理识别 :注意识别try-catch结构的汇编特征 栈平衡维护 :异常处理中注意esp的恢复操作 7.2 效率优化 优先在except块设置断点,避免跟踪异常触发过程 利用Z3求解器自动化处理加密算法 结合静态分析和动态调试提高效率 八、技术总结 本技术通过分析SEH异常处理机制,结合以下关键点实现逆向分析: 识别try块初始化特征(TryLevel字段设置) 分析异常触发条件(esi寄存器检查和div指令) 在except块设置断点避免跟踪异常触发 提取加密算法(字节级加法加密) 使用Z3约束求解器反向计算原始输入 该方法适用于类似结构的异常保护方案,具有较强的通用性和实用性。 文档基于实际逆向工程案例编写,适用于Windows平台SEH异常处理机制的分析