前言

  • UEH(Unstructured Exception Handling)通常指的是不通过结构化异常处理(SEH)机制的异常处理方式。SEH 是传统的 Windows 异常处理模型,使用 __try 和 __except 来捕获异常。与之相对的是 VEH,它是更底层的异常处理机制,允许开发者更精细地控制异常的捕获和处理。
  • VEH(Vectored Exception Handling)通过 AddVectoredExceptionHandler 函数将异常处理程序添加到操作系统的异常处理链中。VEH 是 非结构化异常处理(Unstructured Exception Handling,UEH) 的一种实现方式,因此,有时人们也把 VEH 称为一种 UEH。
  • SEH(Structured Exception Handling):通过 __try 和 __except 语句捕获和处理异常,适用于 C/C++ 程序。SEH 是一种更高级、结构化的异常处理方式。
  • VEH是全局共享的,工作在用户层;SEH是线程局部的,同时存在于内核层和用户层;UEH作为最后的异常处理手段,主要用于内存转储,且在调试状态下不触发。

eg

首先补上缺失的dll,可以运行了

静态分析查看,初步确认是异常处理,但是一个一个查看因为回调逻辑很乱

SM4特征

动调跟进

大小写,取出第一次变表 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/

AddVectoredExceptionHandler(0, Handler); API,异常处理函数注册了VEH(向量化异常处理器)

继续调试这里触发内存写异常

内存写异常后会调用VEH,进入了Handler_0,

SetUnhandledExceptionFilter(TopLevelExceptionFilter); API,异常处理函数注册了UEH(顶层异常处理器)

步入SetUnhandledExceptionFilter, 有未处理的异常

进入SM4加密 SEH (SEH是线程局部的,同时存在于内核层和用户层)

返回到正常流程,继续触发异常

调试终止

异常未被处理会继续调用UEH(顶层异常处理器),但是UEH作为最后的异常处理手段,在调试状态下不触发。所以当程序处于被调试状态时,不会调用UEH。进入不了TopLevelExceptionFilter,反调试。已经不重要了

通过之前静态分析可知最后TopLevelExceptionFilter是

把SM4的加密输出进行base变种编码

那么正确的表应该是yzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/abcdefghijklmnopqrstuvwx

通过修改ip,让程序进入TopLevelExceptionFilter跑出变了的str2 1ATIOpkOyWSvGm/YOYFR4!!

大小写->BOX->SM4->BASE->比较,很清楚了

最后用工具梭哈~~