В самом начале, мы рассматривали функцию IsDebuggerPresent(подробности в Части 0), но я говорил о недостатках этой функции(недостатков больше чем приемуществ). Самое простое это через дизассемблер посмотреть где находится вызов этой функции и просто заNOPить это место. Да и обойти проблем нет. Сегодня мы будем использовать те же байты что и эта функция. Только делать это будем мы без палива. Чем хорошо данный метод?Его довольно сложно увидеть не вооружённым глазом, потому что тут не вызываются функции. Есть конечно переход, только этот переход ещё надо найти! На это раз будем кодить на Ассемблере, но я лично буду делать проект на c++ с ассемблерными вставками.
Листинг 1.1
#include "stdafx.h"
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int all;
__asm
{
mov eax,fs:[30h]
mov eax,[eax+2]
mov all,eax
}
if (all != -65536)
MessageBoxA(GetForegroundWindow(),"Hello,hacker","Message",MB_OK);
return 0;
}
Помните, чтобы обезвредить IsDebuggerPresent, мы шли в fs:[30] и меняли 1 на 0. Тут мы считываем информацию из fs:[30], затем переходим загружаем данные, которые находятся по адресу [eax+2], там и есть то что нам надо, а именно отлаживается программа или нет. Теперь загружаем в переменную то что у нас есть в eax(Этот способ немного другой, мы могли конечно и не выходя из ассемблера всё это провернуть, но для оригенальности поступим так:))
Если прога не отлаживается, то в регистре eax, должно быть число -65536(Этот способ проверял на OllyDbg и на стандартном отладчике в Студии). А если там другое число, то программа выдаст то что и должна – «Hello,hacker».
Но этот приём можно снова убрать заменой байтика в fs:[30]. В дальнейшем будем рассматривать трюки, которые нельзя так просто обойти.