Ассемблирование без секретов



                  

  

классический пример


Как нам откомпилировать? И главное во что? На самостоятельную программу оно как-то не тянет… А давайте попробуем заточить ассемблерную вставку? В большинстве Си компиляторов она оформляется как: "__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");

}

Содержание  Назад  Вперед