dragonltx
驱动牛犊
驱动牛犊
  • 注册日期2010-02-25
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分38分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2210回复:1

Hook SSDT蓝屏

楼主#
更多 发布于:2010-05-04 15:09
// 储存旧的函数地址
    RealRegOpenKey  = (ZWOPENKEY)(SYSTEMSERVICE(ZwOpenKey));
    RealRegQueryKey   = (ZWQUERYKEY)(SYSTEMSERVICE(ZwQueryKey));
    RealRegQueryValueKey   = (ZWQUERYVALUEKEY)(SYSTEMSERVICE(ZwQueryValueKey));
    RealRegEnumerateValueKey   = (ZWENUMERATEVALUEKEY)(SYSTEMSERVICE(ZwEnumerateValueKey));
    RealRegEnumerateKey  = (ZWENUMERATEKEY)(SYSTEMSERVICE(ZwEnumerateKey));
    RealRegCloseKey   = (ZWCLOSE)(SYSTEMSERVICE(ZwClose));
    RealRegFlushKey   = (ZWFLUSHKEY)(SYSTEMSERVICE(ZwFlushKey));
    RealRegDeleteKey   = (ZWDELETEKEY)(SYSTEMSERVICE(ZwDeleteKey));
    RealRegSetValueKey   = (ZWSETVALUEKEY)(SYSTEMSERVICE(ZwSetValueKey));
    RealRegCreateKey   = (ZWCREATEKEY)(SYSTEMSERVICE(ZwCreateKey));
    RealRegDeleteValueKey   = (ZWDELETEVALUEKEY)(SYSTEMSERVICE(ZwDeleteValueKey));
    RealRegLoadKey   = (ZWLOADKEY)(SYSTEMSERVICE(ZwLoadKey));
    RealRegUnloadKey   = (ZWUNLOADKEY)(SYSTEMSERVICE(ZwUnloadKey));

    // 把SSDT隐射到我们的区域,以便修改它为可写属性
    g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
    if(!g_pmdlSystemCall)
        return STATUS_UNSUCCESSFUL;
    MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
    // 改变MDL的Flags属性为可写,既然可写当然可读,可执行
    g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);
    // 用了宏,把原来的Zw*替换成我们的New*函数。至此已完成了我们的主要两步,先突破了SSDT的保护,接着用宏更改了目标函数,下来就剩下具体的过滤任务了
    
    HOOK_SYSCALL( ZwOpenKey, HookRegOpenKey,RealRegOpenKey);
    HOOK_SYSCALL( ZwQueryKey, HookRegOpenKey,RealRegQueryKey);
    HOOK_SYSCALL( ZwQueryValueKey, HookRegQueryValueKey,RealRegQueryValueKey);  
    HOOK_SYSCALL( ZwEnumerateValueKey, HookRegEnumerateValueKey,RealRegEnumerateValueKey);
    HOOK_SYSCALL( ZwEnumerateKey, HookRegEnumerateKey,RealRegEnumerateKey);
    HOOK_SYSCALL( ZwClose, HookRegCloseKey,RealRegCloseKey);
    HOOK_SYSCALL( ZwFlushKey, HookRegFlushKey,RealRegFlushKey);
    HOOK_SYSCALL( ZwDeleteKey, HookRegDeleteKey,RealRegDeleteKey);
    HOOK_SYSCALL( ZwSetValueKey, HookRegSetValueKey,RealRegSetValueKey);
    HOOK_SYSCALL( ZwCreateKey, HookRegCreateKey,RealRegCreateKey);
    HOOK_SYSCALL( ZwDeleteValueKey, HookRegDeleteValueKey,RealRegDeleteValueKey);
    HOOK_SYSCALL( ZwLoadKey, HookRegLoadKey,RealRegLoadKey);
    HOOK_SYSCALL( ZwUnloadKey, HookRegUnloadKey,RealRegUnloadKey);
    
    IsHooked                                                        = TRUE;
怎么第一句就蓝屏了??把OpenKey的原始地址保存给RealRegOpenKey怎么蓝屏了??哪位大牛指点下!!!!
yvqvan
驱动牛犊
驱动牛犊
  • 注册日期2008-10-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分47分
  • 威望362点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-05-21 18:31
你把其他代码贴上咯!看你上面的,没有错的。
游客

返回顶部