<<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記錄的指針程序
這樣也達到了必須計算才能跟蹤程序流程的目的,隱藏了程序的真實控制流。