易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 292|回复: 4

[求助] 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,  cserfGlobalGroupMask
        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链表
//摘除模块链表
就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2018-6-26 01:20 易语言论坛 易语言导航

Powered by 看流星社区 X3.2

©2011-2016 最好的辅助编程技术论坛

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