看流星社区

 找回密码
 注册账号
查看: 8112|回复: 10

[悬赏求助] WIN10驱动断链会蓝屏?

[复制链接]

该用户从未签到

发表于 2018-2-27 12:11:54 | 显示全部楼层 |阅读模式
10流星币

typedef struct _NON_PAGED_DEBUG_INFO
{
     USHORT      Signature;
     USHORT      Flags;
     ULONG       Size;
     USHORT      Machine;
     USHORT      Characteristics;
     ULONG       TimeDateStamp;
     ULONG       CheckSum;
     ULONG       SizeOfImage;
     ULONGLONG   ImageBase;
} NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
typedef struct _KLDR_DATA_TABLE_ENTRY
{
     LIST_ENTRY InLoadOrderLinks;
     PVOID ExceptionTable;
     ULONG ExceptionTableSize;
     // ULONG padding on IA64
     PVOID GpValue;
     PNON_PAGED_DEBUG_INFO NonPagedDebugInfo;
     PVOID DllBase;
     PVOID EntryPoint;
     ULONG SizeOfImage;
     UNICODE_STRING FullDllName;
     UNICODE_STRING BaseDllName;
     ULONG Flags;
     USHORT LoadCount;
     USHORT __Unused5;
     PVOID SectionPointer;
     ULONG CheckSum;
     // ULONG padding on IA64
     PVOID LoadedImports;
     PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;//这个结构  Blackbone 上抠的
     
     
    PKLDR_DATA_TABLE_ENTRY entry = (PKLDR_DATA_TABLE_ENTRY)(pDriverObject->DriverSection);
    //断链
    INT64 P1 = (INT64)entry->InLoadOrderLinks.Flink;
    INT64 P2 = (INT64)entry->InLoadOrderLinks.Blink;
    entry->InLoadOrderLinks.Flink->Blink =(PLIST_ENTRY) P2;
    entry->InLoadOrderLinks.Blink->Flink =(PLIST_ENTRY) P1;
    entry->InLoadOrderLinks.Flink = (PLIST_ENTRY)entry;
    entry->InLoadOrderLinks.Blink = (PLIST_ENTRY)entry;   
     
断链代码应该没问题的吧?
他不是加载后就马上蓝屏,而是几率性的蓝屏,有时候十几分钟,有时候几个小时才蓝.
什么原因啊?
是WIN10的什么安全机制导致的?
但是感觉是某些条件下才出发的.
蓝屏代码 critical_structure_corruption
有时候还是 page_fault_in_nonpaged_area

该用户从未签到

发表于 2018-2-27 12:12:12 | 显示全部楼层
会蓝屏。critical_structure_corruption  就是PATCHGUARD

该用户从未签到

发表于 2018-2-27 12:12:24 | 显示全部楼层
x64没过PG,搞进程隐藏断链一类的事,蓝到你怀疑人生...

该用户从未签到

发表于 2018-2-27 12:13:06 | 显示全部楼层

特征码自己找  忘了这个哪个系统的了

#include  "HideDiver.h"
#pragma  warning(disable  :  4047)   

typedef  NTSTATUS(__fastcall  *MiProcessLoaderEntry)(PVOID  pDriverSection,  int  bLoad);

MiProcessLoaderEntry  g_pfnMiProcessLoaderEntry  =  NULL;

PVOID  GetCallPoint(PVOID  pCallPoint)
{
        ULONG  dwOffset  =  0;
        ULONG_PTR  returnAddress  =  0;
        LARGE_INTEGER  returnAddressTemp  =  {  0  };
        PUCHAR  pFunAddress  =  NULL;

        if  (pCallPoint  ==  NULL  ||  !MmIsAddressValid(pCallPoint))
                return  NULL;

        pFunAddress  =  pCallPoint;
        //  函数偏移   
        RtlCopyMemory(&dwOffset,  (PVOID)(pFunAddress  +  1),  sizeof(ULONG));

        //  JMP向上跳转   
        if  ((dwOffset  &  0x10000000)  ==  0x10000000)
        {
                dwOffset  =  dwOffset  +  5  +  pFunAddress;
                returnAddressTemp.QuadPart  =  (ULONG_PTR)pFunAddress  &  0xFFFFFFFF00000000;
                returnAddressTemp.LowPart  =  dwOffset;
                returnAddress  =  returnAddressTemp.QuadPart;
                return  (PVOID)returnAddress;
        }
        returnAddress  =  (ULONG_PTR)dwOffset  +  5  +  pFunAddress;
        return  (PVOID)returnAddress;
}

PVOID  GetUndocumentFunctionAddress(IN  PUNICODE_STRING  pFunName,  IN  PUCHAR  pStartAddress,  IN  UCHAR*  pFeatureCode,  IN  ULONG  FeatureCodeNum,  ULONG  SerSize,  UCHAR  SegCode,  ULONG  AddNum,  BOOLEAN  ByName)
{
        ULONG  dwIndex  =  0;
        PUCHAR  pFunAddress  =  NULL;
        ULONG  dwCodeNum  =  0;

        if  (pFeatureCode  ==  NULL)
                return  NULL;

        if  (FeatureCodeNum  >=  15)
                return  NULL;

        if  (SerSize  >  0x1024)
                return  NULL;

        if  (ByName)
        {
                if  (pFunName  ==  NULL  ||  !MmIsAddressValid(pFunName->Buffer))
                        return  NULL;

                pFunAddress  =  (PUCHAR)MmGetSystemRoutineAddress(pFunName);
                if  (pFunAddress  ==  NULL)
                        return  NULL;
        }
        else
        {
                if  (pStartAddress  ==  NULL  ||  !MmIsAddressValid(pStartAddress))
                        return  NULL;

                pFunAddress  =  pStartAddress;
        }

        for  (dwIndex  =  0;  dwIndex  <  SerSize;  dwIndex++)
        {
                __try
                {
                        if  (pFunAddress[dwIndex]  ==  pFeatureCode[dwCodeNum]  ||  pFeatureCode[dwCodeNum]  ==  SegCode)
                        {
                                dwCodeNum++;

                                if  (dwCodeNum  ==  FeatureCodeNum)
                                        return  pFunAddress  +  dwIndex  -  dwCodeNum  +  1  +  AddNum;

                                continue;
                        }

                        dwCodeNum  =  0;
                }
                __except  (EXCEPTION_EXECUTE_HANDLER)
                {
                        return  0;
                }
        }

        return  0;
}

NTSTATUS  HideDriver(PDRIVER_OBJECT  pTargetDriverObject)
{
        UNICODE_STRING  usRoutie  =  {  0  };
        PUCHAR  pAddress  =  NULL;

        UCHAR  code[3]  =
                "\xD8\xE8";

        UCHAR  code2[10]  =
                "\x48\x8B\xCB\xE8\x60\x60\x60\x60\x8B";

        /*
        PAGE:000000014052ABE4  48  8B  D8                                                                            mov          rbx,  rax
        PAGE:000000014052ABE7  E8  48  17  F7  FF                                                                call        MiUnloadSystemImage
        */

        if  (pTargetDriverObject  ==  NULL)
                return  STATUS_INVALID_PARAMETER;

        RtlInitUnicodeString(&usRoutie,  L"MmUnloadSystemImage");

        pAddress  =  GetUndocumentFunctionAddress(&usRoutie,  NULL,  code,  2,  0x30,  0x90,  1,  TRUE);

        if  (pAddress  ==  NULL)
        {
                DbgPrint("MiUnloadSystemImage  1  faild!\n");
                return  STATUS_UNSUCCESSFUL;
        }

        pAddress  =  GetCallPoint(pAddress);

        if  (pAddress  ==  NULL)
        {
                DbgPrint("MiUnloadSystemImage  2  faild!\n");
                return  STATUS_UNSUCCESSFUL;
        }

        /*
        PAGE:000000014049C5CF  48  8B  CB                                                                            mov          rcx,  rbx
        PAGE:000000014049C5D2  E8  31  29  C2  FF                                                                call        MiProcessLoaderEntry
        PAGE:000000014049C5D7  8B  05  A3  BC  F0  FF                                                          mov          eax,  cs:PerfGlobalGroupMask
        PAGE:000000014049C5DD  A8  04                                                                                  test        al,  4
        */

        pAddress  =  GetUndocumentFunctionAddress(NULL,  pAddress,  code2,  9,  0x300,  0x60,  3,  FALSE);

        if  (pAddress  ==  NULL)
        {
                DbgPrint("MiProcessLoaderEntry  1  faild!\n");
                return  STATUS_UNSUCCESSFUL;
        }

        g_pfnMiProcessLoaderEntry  =  (MiProcessLoaderEntry)GetCallPoint(pAddress);

        if  (g_pfnMiProcessLoaderEntry  ==  NULL)
        {
                DbgPrint("MiProcessLoaderEntry  2  faild!\n");
                return  STATUS_UNSUCCESSFUL;
        }

        //DbgBreakPoint();

        DbgPrint("0x%p\n",  g_pfnMiProcessLoaderEntry);

        /*////////////////////////////////隐藏驱动/////////////////////////////////*/
        g_pfnMiProcessLoaderEntry(pTargetDriverObject->DriverSection,  0);

        pTargetDriverObject->DriverSection  =  NULL;
        /*/////////////////////////////////////////////////////////////////////////*/

        //  破坏驱动对象特征
        pTargetDriverObject->DriverStart  =  NULL;
        pTargetDriverObject->DriverSize  =  NULL;
        pTargetDriverObject->DriverUnload  =  NULL;
        pTargetDriverObject->DriverInit  =  NULL;
        pTargetDriverObject->DeviceObject  =  NULL;
        return  STATUS_SUCCESS;
}

该用户从未签到

发表于 2018-2-27 12:13:39 | 显示全部楼层
pTargetDriverObject->DriverSection =  NULL;  这个一样蓝到怀疑人生。如果只想让pch扫不到的话:
//摘除驱动目录链表
//摘除设备目录链表
//摘除TypeList链表
//摘除模块链表
就可以了
  • TA的每日心情
    无聊
    8 小时前
  • 发表于 2019-1-16 11:06:21 | 显示全部楼层
    初来乍到,认真回复

    该用户从未签到

    发表于 2019-3-8 21:58:38 | 显示全部楼层
    666666666666666666666666666666666666666666666666666

    该用户从未签到

    发表于 2019-3-8 22:02:05 | 显示全部楼层
    666666666666666666666666666666666666666666666666666

    该用户从未签到

    发表于 2019-3-8 22:03:09 | 显示全部楼层
    666666666666666666666666666666666666666666666666666

    该用户从未签到

    发表于 2019-3-8 22:05:40 | 显示全部楼层
    666666666666666666666666666666666666666666666666666
    点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
    您需要登录后才可以回帖 登录 | 注册账号

    本版积分规则

    小黑屋|手机版|Archiver|看流星社区 |网站地图

    GMT+8, 2024-4-25 19:00

    Powered by Kanliuxing X3.4

    © 2010-2019 kanliuxing.com

    快速回复 返回顶部 返回列表