众所周知在AMD64环境上,32的程序,我们可以使用CS段切换至x64环境,可以执行x64指令 0x33段选择器(天门) - 恶意软件技术 (malwaretech.com)
当然切换环境后,也是能在调试器里正常工作的,如果手动中断在环境里,调试器引擎可能需要支持x64指令,否则无法正常工作
那么我们正常运行,应该怎么样才能被检测呢, 这就要说个特殊的指令,int3 int 3 (KiBreakpointTrap)
为什么说是特殊呢,因为配合切cs可以达到出其不意的效果
在正常环境下 切cs后使用int3,会得到一个STATUS_BREAKPOINT异常,如果没有注册异常接管,会崩溃。
如果在不支持x64引擎的调试器里运行,则什么都不会发生,但STATUS_BREAKPOINT异常依旧会有,内核会分发这个异常 但调试器好像不会接收到这个异常,程序正常工作
CE是例外 可以正常运行
当然像ICEBP UD2等指令不会发生这种情况
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑以上纯属胡扯,虽然我也不知道怎么回事
push 0x33
call Label1
Label1:
add dword [esp], 0x05
retf
int3
call Label2
Label2:
mov dword [esp+0x04], 0x00000023
add dword [esp], 0x0D
retf
call Label5
nop
nop
nop
jmp Label5
Label5:
push ebp
mov ebp,esp
push 0x33
call Label3
Label3:
add dword [esp], 0x05
retf
call Label4
Label4:
mov dword [esp+0x04], 0x00000023
add dword [esp], 0x0D
retf
mov esp,ebp
pop ebp
ret
Label5;
测试调试器: x32dbg,ollydbg,windbg。 都会引发这种情况

关键点
(ContextFrame.SegCs & 0xfff8)== KGDT64_R3_CODE && GetProcessWoW64Process(PsGetCurrentProcess()) != NULL && ExceptionRecord->ExceptionCode== STATUS_BREAKPOINT
ExceptionRecord->ExceptionCode = STATUS_WX86_BREAKPOINT;