上面的示例表现了对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;
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|