Антиотладочные приёмы. Часть1. Самое главное в ECX

Ну что, будем расти в наших познаниях и продолжать познавать антиотладочные приёмы. Сегодня на очереди будет функция GetThreadContext. Но сегодня не будет того что, просто вызываешь функцию и отладчик палится. Нет, сегодня будет всё сложнее. Но не так, чтобы свесить уши и другие части тела. Для начала идём в MSDN и читаем что пишут про эту функции. Если вкратце, то эта функция нужна для получения потока в контексте указанного потока. Звучит довольно мутно, но я думаю мы скоро со всем разберёмся. Если функция завершиться удачно, то нам возвратится значение всё что угодно, только не ноль. А если наоборот, то ноль. Что-то придумывать сегодня не будем, просто тупо возьмём пример из MSDN (А может и не тупо).

Листинг 1.1

#include "stdafx.h"
#include 
#include 
#include


void newthread(void *data)
{
          // Завершаем текущей поток
          TerminateThread(GetCurrentThread(),1);
}

void changeThreadState()
{
          // Запускаем новый поток
          HANDLE thread = (HANDLE)_beginthread(newthread, 0, NULL );

          //Объявляем структуру CONTEXT
          CONTEXT context;

          BOOL success;

          SuspendThread(thread);

          // Устанавливаем флаги
          context.ContextFlags = (CONTEXT_FULL | CONTEXT_CONTROL);

          success = GetThreadContext(thread, &context);

          // Проверяем поток на ошибки
          assert(success);

          //Выводим инфу
          printf( "eax=%09X, ebx=%09X, ecx=%09Xn",context.Eax, context.Ebx, context.Ecx );

          // Присваиваем значение EAX
          context.Eax = 0x1234BBBB;

          // Присваиваем значение ECX
          context.Ecx = 0x2468ABCD;

          // Применяем изменения
          success = SetThreadContext(thread, &context);

          // Снова проверка
          assert(success);

          // Останавливаем поток
          ResumeThread(thread);
}

int _tmain(int argc, _TCHAR* argv[])
{
          // Вызываем функцию
          changeThreadState();

          // Если нет отладчика, то вы видите это сообщение
          MessageBoxA(GetForegroundWindow(), "Отладчика в системе нет", "Хорошая новость", MB_OK);

          return 0;
}

Если программа отлаживается, то отладчик просто падает в процессе работы. Если отладчик не найден, то программа выполняет свою работу. Этот способ хорош тем, что в нем нет ни одного перехода и это теоретически может остановить крякеров (новичков). На более опытных это не работает.

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