
28.01.2010, 12:22
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
С нами:
10943066
Репутация:
1236
|
|
+ еще одна ВЕЩЬ...
Код:
/*
*
* многие протекторы проверяют отладочные регистры на предмет наличия аппаратных
* точек останова (hardware breakpoint).
* конечноже, в ассемблере есть инструкции работы с этими регистрами, такие как mov eax, dr0
* или mov dr0, eax и тд. но то что нам на руку - все они являются превилигированными
* и напрямую могут вызываться лишь в режиме ядра. в ином случае такой код будет
* вызывать программные исключения и при отсутствии обработчика - крах программы.
* поэтому все они используют функцию GetThreadContext() для получения информации
* о текущем состоянии регистров (и прочей информации) потока. используя один регистр,
* из 4х доступных для потока, под перехват и модификацию GetThreadContext(), как приведено в
* примере ниже, мы полностью исключим возможность обнаружения перехвата.
*/
PHARDWARE_HOOK_ENTRY phheGetThreadContext;
BOOL WINAPI xGetThreadContext(HANDLE h, LPCONTEXT ctx)
{
BOOL rc, dofake = FALSE;
if(ctx->ContextFlags & CONTEXT_DEBUG_REGISTERS){
dofake = TRUE;
dprintf("*** debug test detected ***");
}
rc = ((BOOL(WINAPI*)(HANDLE, LPCONTEXT))phheGetThreadContext->trampoline)(h, ctx);
if(dofake){
ctx->Dr0 = 0;
ctx->Dr1 = 0;
ctx->Dr2 = 0;
ctx->Dr3 = 0;
ctx->Dr7 = 0;
}
return rc;
}
__________________
 
snow white world wide
|
|
|