Tesla.Angela 发表于 2011-4-12 18:48:03

[原创开源]Win64反蓝屏【效果不好】

本帖子部分代码由comodo的某工程师提供,特此感谢。

PatchGuard引发蓝屏的方式:KeBugCheckEx(0x109,0x0,0x0,0x0,0x7);
我的反蓝屏方法:
让执行蓝屏的线程在KeBugCheckEx中死循环。这种方法的缺点很严重,就是极耗费CPU(几乎独占一个核心)。
PVOID GetFunctionAddr(PCWSTR FunctionName)
{
        UNICODE_STRING UniCodeFunctionName;
        RtlInitUnicodeString( &UniCodeFunctionName, FunctionName );
        return MmGetSystemRoutineAddress( &UniCodeFunctionName );   
}

void WPOFFx64()
{
        UINT64 cr0=__readcr0();
        cr0 &= 0xfffffffffffeffff;
        __writecr0(cr0);
        _disable();
}

void WPONx64()
{
        UINT64 cr0=__readcr0();
        cr0 |= 0x10000;
        _enable();
        __writecr0(cr0);
}

VOID AntiBugCheck_1() //SUCCESS
{
        //KeBugCheckEx
        //fffff800`03c81f00 48894c2408    mov qword ptr ,rcx
        UCHAR fuckcode={0};
        KIRQL OldIrql;
        ULONG jmpcode;
        //get address
        PVOID bcaddr = GetFunctionAddr(L"KeBugCheckEx");
        //set memory
        memset(fuckcode,0x90,210);
        memset((PVOID)((UINT64)fuckcode+201),0xE9,1);
        //calc shellcode
        jmpcode=(ULONG)((ULONG64)bcaddr-((ULONG64)bcaddr+201)-5);
        memcpy(fuckcode+202,&jmpcode,4);
        //patch
        WPOFFx64();
        OldIrql = KeRaiseIrqlToDpcLevel();
        RtlMoveMemory(bcaddr,fuckcode,210);
        KeLowerIrql(OldIrql);
        WPONx64();
}

Tesla.Angela 发表于 2011-8-9 13:45:33

其实,可以调用KeWaitForSingleObject来解决永远死循环的问题,而不用NOP+JMP,提示完毕。

testid 发表于 2011-11-1 08:28:08

好帖子要顶一下。

mysmartid 发表于 2013-2-18 09:52:02

感谢分享

kk1025 发表于 2013-4-11 16:49:24

Tesla.Angela 发表于 2011-8-9 13:45 static/image/common/back.gif
其实,可以调用KeWaitForSingleObject来解决永远死循环的问题,而不用NOP+JMP,提示完毕。 ...

感謝提示

jgyolm 发表于 2014-5-9 20:32:48

let me kankan

jgyolm 发表于 2014-5-9 20:33:06

let me kankan
页: [1]
查看完整版本: [原创开源]Win64反蓝屏【效果不好】