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

  #19  
Старый 07.12.2006, 00:21
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


По умолчанию

уря, все работает =)

повторил подвиг криса касперски и написал программулину, которая лочит KeBugCheck и KeBugCheckEx, просто делая ret.
После явного вызова KeBugCheckEx процесс продолжает выполняться.
При исключении поток виснет в ринг 0, но винда все равно продолжает относительно стабильно работать.

Кому интересно - вот код.
Программа при первом запуске ставит блокировку на KeBugCheckEx (записывает просто RET по адресу точки входа, хотя там слегка сложнее. KeBugCheckEx & KeBugCheck вызывают спец. внутреннюю функцию, которая и выполняет всю работу. Вот лок ставится именно на нее, чтобы вызовы и KeBugCheckEx и KeBugCheck и прямые вызовы этой функции шли лесом), при втором вызывает явно KeBugCheckEx и выводит в окошке результат:
Код:
int flag=-1;
DWORD bugcheck=0;

//
// WARNING! This routine should be executed in KERNEL MODE ONLY
//
void R0_DISCOVER_AND_EXECUTE()
{
	__try
	{
		bugcheck = (DWORD)R0_GetProcAddress("KeBugCheckEx");
		g_Address = (bugcheck + 0x1B) + *(DWORD*) (bugcheck + 0x17);

#define OPCODE 0x000018C2
		// Is hook already set?
		if(*(DWORD*)g_Address == OPCODE) // yes, hook is already set
		{
			__asm
			{
				push 4
				push 3
				push 2
				push 1
				push 0x2e
				mov eax, bugcheck
				call eax
			}
			flag = 0;
			return;
		}

		// Hook is not set, set it now!
		*(DWORD*)g_Address = OPCODE; // RETN 18h
		
		flag = 1;
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		flag = -1;
	}
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	g_KernBase = ring0_GetKernelBase();
	if(!g_KernBase)
		return MessageBox(0, "Couldn't discover kernel base address", "Error", MB_OK|MB_ICONWARNING);

	ring0_execute(R0_DISCOVER_AND_EXECUTE);
	switch(flag)
	{
	case -1:
		return MessageBox(0, "ring0 function failed because of exception", 0, MB_ICONERROR);
	case 1:
		return MessageBox(0, "Hook set successfully", "Done", MB_ICONINFORMATION);
	case 0:
		return MessageBox(0, "KeBugCheckEx call passed successfully!", "It works =)", MB_ICONINFORMATION);
	}

	return 0;
}
остальной код R0_GetProcAddress и код ring0.c взять у автора

Последний раз редактировалось _Great_; 07.12.2006 в 00:42..
 
Ответить с цитированием