классический пример
Как нам откомпилировать? И главное во что? На самостоятельную программу оно как-то не тянет… А давайте попробуем заточить ассемблерную вставку? В большинстве Си компиляторов она оформляется как: "__asm{…ассемблерный код…}", однако, непосредственно осуществить этот замысел не получится! Ведь наш "подопечный" ассемблерный листинг, как и большинство других демонстрационных прогарам, содранных с наглядно-агитационных пособий, представляет собой нечто промежуточное между псевдокодом и рабочей программой.
Во-первых, метка debugger_is_present не определена и вставлена чисто для наглядности, во-вторых, установить обработчик структурных исключений мы установили, флаг трассировки — взвели, а вот о том, что после завершения проверки на отладчик все необходимо вернуть обратно — забыли! Поэтому, перед употреблением, листинг необходимо слегка доработать, например, так:
main()
{
int a; // через эту переменную мы возвратим значение eax
__asm{ // ассемблерная вставка — начало
push offset my_seh
push dword ptr fs:[0]
mov fs:[0],esp
pushf
or dword ptr[esp],100h ;set trap flag
popf
xor eax,eax
my_seh:
pop dword ptr fs:[0] ; восстанавливаем старый обработчик
add esp,4 ; восстанавливаем стек
mov a,eax ; возвращаем результат в переменной а
} ; ассемблерная вставка - конец
// проверка переменной a на равенство нулю
printf("%s\n",a?"no debugger":"under debugger");
}