<<IDA pro权威指南>> p348页,另一种技巧常用于面向Windows的恶意软件中,它配置一个异常处理程序,并有意触发一个异常,然后在处理异常时操纵进程的寄存器状态。
下面的例子被tElock反逆向工程工具用于隐藏程序的真实控制流。
00535FC2 E8 00000000 call 00535FC700535FC7 5D pop ebp ;相当于ebp = 00535FC700535FC8 8D45 46 lea eax, dword ptr [ebp+46] ;0053600D00535FCB 45 inc ebp00535FCC 50 push eax ; push 后,esp = 0018FB5800535FCD 33C0 xor eax, eax00535FCF 64:FF30 push dword ptr fs:[eax] ; push 后,ESP = 0018FB5400535FD2 64:8920 mov dword ptr fs:[eax], esp ;fs:[0] = 0018FB5400535FD5 90 nop00535FD6 F7F1 div ecx ;引发除0异常00535FD8 0000 add byte ptr [eax], al00535FDA 0000 add byte ptr [eax], al00535FDC 90 nop
执行完 00535FD6后,程序引发异常,堆栈如下:
可以看到0018FB54栈上存放指向一个SEH记录的指针
0018FB58指向一个SE处理程序的指针
而这个刚好满足_EXCEPTION_REGISTRATION_RECORD结构
0:003> dt _EXCEPTION_REGISTRATION_RECORD
ntdll!_EXCEPTION_REGISTRATION_RECORD
+0x000 Next : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 Handler : Ptr32 _EXCEPTION_DISPOSITION
也即0053600D为事先注册的SEH异常处理程序的地址,0018FB5C为指向下一个SEH记录的指针
这样也达到了必须计算才能跟踪程序流程的目的,隐藏了程序的真实控制流。