上面的示例显示了对SEH处理程序的设置,指向SEH Frame的指针放在处理程序链的开头,然后产生int 3h中断。如果应用程序未被调试,则控制将被传送到SEH处理程序,g_isDebuggerPresent值将被设置为FALSE。 ContextRecord-> Eip + = 1行更改执行流程中下一条指令的地址,这将导致执行int 3h后的指令。然后代码返回原始SEH处理程序,清除堆栈,并检查调试器是否存在。
如何避开SEH检查
虽然不存在一个普遍的方法,但还是有一些技术,能够实现这一点。我们来看看利用调用堆栈如何导致SEH处理程序调用:
- 0:000> kn
- # ChildEBP RetAddr
- 00 0059f06c 775100b1 AntiDebug!ExceptionRoutine
- 01 0059f090 77510083 ntdll!ExecuteHandler2+0x26
- 02 0059f158 775107ff ntdll!ExecuteHandler+0x24
- 03 0059f158 003b11a5 ntdll!KiUserExceptionDispatcher+0xf
- 04 0059fa90 003d7f4e AntiDebug!main+0xb5
- 05 0059faa4 003d7d9a AntiDebug!invoke_main+0x1e
- 06 0059fafc 003d7c2d AntiDebug!__scrt_common_main_seh+0x15a
- 07 0059fb04 003d7f68 AntiDebug!__scrt_common_main+0xd
- 08 0059fb0c 753e7c04 AntiDebug!mainCRTStartup+0x8
- 09 0059fb20 7752ad1f KERNEL32!BaseThreadInitThunk+0x24
- 0a 0059fb68 7752acea ntdll!__RtlUserThreadStart+0x2f
- 0b 0059fb78 00000000 ntdll!_RtlUserThreadStart+0x1b
接着我们就要分析每个被称为SEH处理程序的代码,如果保护是基于SEH处理程序的多次呼叫,则很难就行反调试了。
VEH(向量化异常处理)
VEH是从Windows XP开始引入的,虽然它是SEH的一个变体,但两者彼此独立运行, VEH优先权高于SHE,只有VEH不处理某个异常的时候,异常处理权才会到达SEH.。当添加新的VEH处理程序时,SEH链不受影响,因为VEH处理程序的列表存储在ntdll!LdrpVectorHandlerList非导出的变量中。 VEH和SEH机制非常相似,唯一的区别是记录功能被用于设置和删除VEN处理程序。添加和删除VEH处理程序以及VEH处理函数的原函数签名如下:
- PVOID WINAPI AddVectoredExceptionHandler(
- ULONG FirstHandler,
- PVECTORED_EXCEPTION_HANDLER VectoredHandler
- );
- ULONG WINAPI RemoveVectoredExceptionHandler(
- PVOID Handler
- );
- LONG CALLBACK VectoredHandler(
- PEXCEPTION_POINTERS ExceptionInfo
- );
- The _EXCEPTION_POINTERS structure looks like this:
- typedef struct _EXCEPTION_POINTERS {
- PEXCEPTION_RECORD ExceptionRecord;
- PCONTEXT ContextRecord;
- } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
在处理程序中收到控制权后,系统会收集当前进程的上下文并通过ContextRecord参数进行传递。以下就是一个使用向量异常处理的反调试保护代码:
- LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo)
- {
- PCONTEXT ctx = ExceptionInfo->ContextRecord;
- if (ctx->Dr0 != 0 || ctx->Dr1 != 0 || ctx->Dr2 != 0 || ctx->Dr3 != 0)
- {
- std::cout << "Stop debugging program!" << std::endl;
- exit(-1);
- }
- ctx->Eip += 2;
- return EXCEPTION_CONTINUE_EXECUTION;
- }
- int main()
- {
- AddVectoredExceptionHandler(0, ExceptionHandler);
- __asm int 1h;
- return 0;
- }
(编辑:PHP编程网 - 黄冈站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|