Путеводитель по написанию вирусов под Win32

         

Win98/NT: обнаружение отладчиков уровня приложения (IsDebuggerPresent)


Этой API-функция нет в Win95, поэтому вам нужно будет убедиться в ее наличии. Также она работает только с отладчиками уровня приложения (например, TD32). И она работает прекрасно. Давайте посмотрим, что о ней написано в справочнике по Win32 API.

-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-· Функция IsDebuggerPresent сообщает, запущен ли вызвавший ее процес в контексте отладчика. Эта функция экспортируется из KERNEL32.DLL.

BOOL IsDebuggerPresent(VOID)

Параметры ---------

У этой функции нет параметров.

Возвращаемое значение ---------------------

¤ Если текущий процесс запущен в контексте отладчика, возвращаемое значение не равно нулю.

¤ Если текущий процесс не запущен в контексте отладчика, возвращаемое значение равно нулю. -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·

Пример, демонстрирующий этот API, очень прост. Вот он.

;---[ CUT HERE ]-------------------------------------------------------------

.586p .model flat

extrn GetProcAddress:PROC extrn GetModuleHandleA:PROC

extrn MessageBoxA:PROC extrn ExitProcess:PROC

.data

szTitle db "IsDebuggerPresent Demonstration",0 msg1 db "Application Level Debugger Found",0 msg2 db "Application Level Debugger NOT Found",0 msg3 db "Error: Couldn't get IsDebuggerPresent.",10 db "We're probably under Win95",0

@IsDebuggerPresent db "IsDebuggerPresent",0 K32 db "KERNEL32",0

.code

antidebug1: push offset K32 ; Получаем базовый адрес KERNEL32 call GetModuleHandleA or eax,eax ; Проверяем на ошибки jz error

push offset @IsDebuggerPresent ; Теперь проверяем наличие push eax ; IsDebuggerPresent. Если call GetProcAddress ; GetProcAddress возвращает ошибку, or eax,eax ; то мы считаем, что находимся в jz error ; Win95

call eax ; Вызываем IsDebuggerPresent

or eax,eax ; Если результат не равен нулю, нас jnz debugger_found ; отлаживают

debugger_not_found: push 0 ; Показываем "Debugger not found" push offset szTitle push offset msg2 push 0 call MessageBoxA jmp exit

error: push 00001010h ; Показываем "Error! We're in Win95" push offset szTitle push offset msg3 push 0 call MessageBoxA jmp exit

debugger_found: push 00001010h ; Показываем "Debugger found!" push offset szTitle push offset msg1 push 0 call MessageBoxA

exit: push 00000000h ; Выходим из программы call ExitProcess

end antidebug1

;---[ CUT HERE ]-------------------------------------------------------------

Разве не красиво? Micro$oft сделала за нас всю работу :). Но, конечно, не ожидайте, что этот метод будет работать с SoftICE ;).



Содержание раздела