首页
社区
课程
招聘
[求助]HOOK SSDT,执行MmBuildMdlNonePagePool就蓝屏
发表于: 2012-5-14 17:25 7063

[求助]HOOK SSDT,执行MmBuildMdlNonePagePool就蓝屏

2012-5-14 17:25
7063
Windbg显示PAGE_FAULT_IN_NONPAGED_AREA (50);我是刚接触内核编程技术,因为这个问题在网上搜了很久,也看了许多,但就弄不明白原因,不会解决。发个帖子求助。

下面是我的代码:

NTSTATUS DriverEntry(
    IN OUT PDRIVER_OBJECT   DriverObject,
    IN PUNICODE_STRING      RegistryPath
    )
{
    BOOLEAN        fSymbolicLink = FALSE;
    PDEVICE_OBJECT pdoDeviceObj = 0;
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    pdoGlobalDrvObj = DriverObject;

    // Create the device object.
    if(!NT_SUCCESS(status = IoCreateDevice(
        DriverObject,
        0,
        &usDeviceName,
        FILE_DEVICE_UNKNOWN,
        FILE_DEVICE_SECURE_OPEN,
        FALSE,
        &pdoDeviceObj
        )))
    {
        // Bail out (implicitly forces the driver to unload).
        return status;
    };

    // Now create the respective symbolic link object
    if(!NT_SUCCESS(status = IoCreateSymbolicLink(
        &usSymlinkName,
        &usDeviceName
        )))
    {
        IoDeleteDevice(pdoDeviceObj);
        return status;
    }
        fSymbolicLink = TRUE;
    // NOTE: You need not provide your own implementation for any major function that
    //       you do not want to handle. I have seen code using DDKWizard that left the
    //       *empty* dispatch routines intact. This is not necessary at all!
    DriverObject->MajorFunction[IRP_MJ_CREATE] =
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = DRIVER1_DispatchCreateClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DRIVER1_DispatchDeviceControl;
    DriverObject->DriverUnload = DRIVER1_DriverUnload;

  
    // Map the memory into our domain to change the permissions on the MDL
//    g_pmdlSystemCall = IoAllocateMdl(KeServiceDescriptorTable.ServiceTableBase,
  //      KeServiceDescriptorTable.NumberOfServices * 4,
    //    FALSE, FALSE, NULL);
    g_pmdlSystemCall = IoAllocateMdl(KeServiceDescriptorTable.ServiceTableBase,
        KeServiceDescriptorTable.NumberOfServices * 4,
        FALSE, FALSE, NULL);

    if (g_pmdlSystemCall == NULL)
    {
        status = STATUS_UNSUCCESSFUL;
        goto __failed;
    }

    MmBuildMdlForNonPagedPool(g_pmdlSystemCall);//这句就坏了
    // Change the flags of the MDL
    g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    MappedSystemCallTable = (LONG*)MmMapLockedPages(g_pmdlSystemCall, KernelMode);

    // HOOK ZwQueryDirectoryFile 并保存原 ZwQueryDirectoryFile 函数地址
//    HOOK_SYSCALL(ZwQueryDirectoryFile, HookZwQueryDirectoryFile, OriginalZwQueryDirectoryFile);
        OriginalZwQueryDirectoryFile = (PFN_ZwQueryDirectoryFile)InterlockedExchange((PLONG)&MappedSystemCallTable[SYSCALL_INDEX(ZwQueryDirectoryFile)], (LONG)HookZwQueryDirectoryFile);
    g_bHooked = TRUE;

    if (NT_SUCCESS(status))
        {
        return status;
        }

__failed:
    if (fSymbolicLink)
        IoDeleteSymbolicLink(&usSymlinkName);

    if (pdoDeviceObj)
        IoDeleteDevice(pdoDeviceObj);

    return status;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
设置MDL->Flags |= MDL_MAPPED_TO_SYSTEM_VA标志,就可以
2012-5-14 18:47
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
把要hook的函数定义一下就行了,记得加上NTSYSAPI.
2012-5-15 01:52
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
上面两位的解释不对.说来我的情况有点特殊.这些代码起初在.c文件里面,编了makefile和resource文件,用WDK7000的编译环境就可以编过去,也可以执行;后来我用VS创建了个Driver项目,然后把这些代码移到cpp文件里面......开始编译不通过,后来好不容易编译通过了,又连接不通过,又搞阿搞阿,总算连接成功了。现在运行不通过。谁能帮下我,给我分析一下错误原因。我可以提供全套源代码。自己摸索搞这个好辛苦啊!!看到有个“麦罗科菲”讲座,请问能不能在上海办个班,我要参加!!!
2012-5-15 09:14
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
发来吧,我有点时间
2012-5-15 09:16
0
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
g_pmdlSystemCall = IoAllocateMdl(KeServiceDescriptorTable.ServiceTableBase,
KeServiceDescriptorTable.NumberOfServices * 4,
FALSE, FALSE, NULL);

windbg 跟下 KeServiceDescriptorTable 的值是否正确;

我也才初学几天。 希望不要介意
2012-5-15 13:17
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
你都说了是CPP,你改成.C文件
2012-5-15 13:21
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请下载附件Test.rar,我是VC2008+DDK7600的环境。
上传的附件:
2012-5-15 13:31
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
9
MmMapLockedPages(g_pmdlSystemCall, KernelMode);出了问题
换成
MappedSystemCallTable = (PLONG)MmMapLockedPagesSpecifyCache(g_pmdlSystemCall,KernelMode,MmCached,NULL,FALSE,LowPagePriority);

上面的函数已经被废弃了,虽然内部也使用下面那个,但是设置的第五个参数不一样,废弃的函数会写入TRUE,WDK要求驱动程序必须设置FALSE,所以就蓝了...个人见解
2012-5-15 16:31
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
没解决,依然蓝屏。我的代码是执行到 MmBuildMdlForNonPagedPool(g_pmdlSystemCall);//这句就坏了,还没执行到MappedSystemCallTable = MmMapLockedPagesSpecifyCache(....... 这句。
2012-5-21 11:13
0
雪    币: 127
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
MmProbeAndLockPages, 别乱用 mmbuildfornonpagedpool
2012-5-21 11:47
0
游客
登录 | 注册 方可回帖
返回
//