Показать сообщение отдельно

  #5  
Старый 28.01.2010, 12:22
sn0w
Статус пользователя:
Регистрация: 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
 
Ответить с цитированием