Антиотладочные приёмы. Часть 2. Возвращение джедая.

Сегодня, мы возвратимся к истокам, То есть к тому, от чего начали. Героем дня, будет функция CheckRemoteDebuggerPresent, которая похожа на IsDebuggerPresent, но так сказать, более усовершенствованная. Впервые она появилась только в Windows XP SP1, поэтому как говориться, делайте выводы сами. Эта функция считает из структуры EPROCESS, значение ProcessDebugPort , которое в случае отладки равно семи. Так чем же она отличается от функции IsDebuggerPrestent, кроме как то что принимает два параметра?Главное отличие то, что можно так «контролировать» не только текущий процесс программы, но и любой другой. И это может кому — то показаться удобней. Да и стандартным обходом(см. Обход IsDebuggerPresent)её не обойти. Да и вообще, внутренности у этих функций разные. Поэтому, эта функция с точки зрения безопасности, надёжнее чем IsDebuggerPresent(хотя на самом деле, тут нет никакой безопасности). Ну теперь напишем небольшую программку, которая будет использовать эту функцию:

Листинг 1.1

#include "stdafx.h"

#include

#include

int _tmain(int argc, _TCHAR* argv[])

{

BOOL po = FALSE;//Отладка дебаггера не активна

CheckRemoteDebuggerPresent(GetCurrentProcess(),&po);//Загружаем текущий процесс

if (po)//Если 1, значит идёт отладка

MessageBoxA(GetForegroundWindow(),"Hello, hacker","Message",MB_OK);

else //Если 0, значит нет отладки:)

MessageBoxA(GetForegroundWindow(),"Hello, good people","Message",MB_OK);

return 0;

}

Запускаем прогу и видим, что нас назвали «Хорошим человеком», но теперь попробуем запустить под отладчиком, и на это раз программа уже не так к нам приветлива. Ну что ж попробуем изменить эту ситуацию. Конечно, можно просто поймать эту функцию через дизассемблер и изменить в ней, хотя бы один байт. Но мы пойдём по другому пути, мы заменим переход в функции ZwQueryInformationProcess, котрую вызывают многие противоотладочные функции. И внутри видим такой код:

Листинг 1.2

7C85AB18 85C0 TEST EAX,EAX

7C85AB1A 7D 08 JGE SHORT kernel32.7C85AB24

Как раз в регистре eax, хранится информация о том отлаживается приложение или нет. Для того мы не будем запариваться в том что в EAX, а просто изменим JGE на JNZ. Загружаем и смотрим, что нас опять поминают добрым словом «Hello, good people». При желании можно и пропатчить эту функцию, таким образом отфутболить довольно многие антиотладочные функции.

Добавить комментарий