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