<<IDA pro权威指南>> p348页,另一种技巧常用于面向Windows的恶意软件中,它配置一个异常处理程序,并有意触发一个异常,然后在处理异常时操纵进程的寄存器状态。
下面的例子被tElock反逆向工程工具用于隐藏程序的真实控制流。
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处理程序的指针
而这个刚好满足_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记录的指针
这样也达到了必须计算才能跟踪程序流程的目的,隐藏了程序的真实控制流。
时间: 2024-10-11 11:50:33