
07.12.2006, 00:21
|
|
Флудер
Регистрация: 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..
|
|
|