Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- push offset my_she ; назначаем свой обработчик структурных исключений
- push dword ptr fs:[0] ; сохраняем старый обработчик в цепочке
- mov fs:[0],esp ; регистрируем новый обработчик
- pushf ; толкаем в стек флаги
- or dword ptr[esp],100h ; взводим трассировочный бит
- popf ; выталкиваем обновленный бит в регистр флагов,
- ; заставляя ЦП возбуждать исключение на каждой команде
- xor eax,eax ; без отладчика после xor возбуждается исключение и
- ; управление получает my_seh, а в eax будет не нуль
- ; под отладчиком исключение молчаливо "съедается"
- my_seh:
- test eax,eax ; если отладчика нет, eax != 0
- jnz debugger_is_present
- -------
- c++
- 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");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement