shadow ssdt学习笔记(二)

Windows内核新手上路2——挂钩shadow SSDT <br />Windows内核新手上路2——挂钩shadow SSDT<br />         文章核心内容:安全软件窗口保护、安全输入、截屏保护的一些思路。挂钩NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUserPostMessage、NtUserMessageCall、NtUserSetWindowL 阅读详情
三。如何hook
似乎这个问题并不大,shadow ssdt和ssdt本质上都是1个地址表,最为简单的方法是把你的函数替换地址表的对应项,具体hook代码甚至可以完全照抄ssdt的,这里只说1下几个偶遇到的小问题
1。win32k.sys不是常在内存的,如果不是GUI线程,shadow ssdt地址无效
解决办法:
1。在driverdispatch中hokk
driverdispatch是位于执行driveriocontrol的线程上下文的
我们使用1个GUI线程去driveriocontrol

2。attachtoprocess
通常 我们使用cerss.exe
Copy code

    HANDLE GetCsrPid()
    {
        HANDLE                        Process, hObject;
        HANDLE                        CsrId = (HANDLE)0;
        OBJECT_ATTRIBUTES            obj;
        CLIENT_ID                    cid;
        UCHAR                        Buff[0x100];
        POBJECT_NAME_INFORMATION      ObjName = (PVOID)&Buff;
        PSYSTEM_HANDLE_INFORMATION_EX Handles;
        ULONG                        r;

        Handles = GetInfoTable(SystemHandleInformation);

        if (!Handles) return CsrId;

        for (r = 0; r < Handles->NumberOfHandles; r++)
        {
            if (Handles->Information[r].ObjectTypeNumber == 21) //Port object
            {
                InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
             
                cid.UniqueProcess = (HANDLE)Handles->Information[r].ProcessId;
                cid.UniqueThread  = 0;

                if (NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
                {
                    if (NT_SUCCESS(ZwDuplicateObject(Process,
                                                    (HANDLE)Handles->Information[r].Handle,
                                                    NtCurrentProcess(),
                                                    &hObject,
                                                      0, 0, DUPLICATE_SAME_ACCESS)))
                    {
                        if (NT_SUCCESS(ZwQueryObject(hObject,
                                                    ObjectNameInformation,
                                                        ObjName,
                                                    0x100, NULL)))
                        {
                            if (ObjName->Name.Buffer &&
                                !wcsncmp(L"\\Windows\\ApiPort", ObjName->Name.Buffer, 20))
                            {
                                CsrId = (HANDLE)Handles->Information[r].ProcessId;
                            }
                        }

                        ZwClose(hObject);
                    }

                    ZwClose(Process);
                }
            }
        }

        ExFreePool(Handles);

        return CsrId;
    }



然后我们KeAttachProcess
Copy code

      ntStatus = PsLookupProcessByProcessId(GetCsrPid(), &EProcess);

            if (!NT_SUCCESS( ntStatus ))
      {

      DbgPrint("PsLookupProcessByProcessId()\n");
                  return ntStatus;
      }

            KeAttachProcess(EProcess);



3.使用MDL映射一块不分页内存,设置成可以写入
不分页内存  ExAllocatePool(NonPagedPool
即为不会被切换到pagefile的内存,是常驻在物理内存的,比较希缺,使用完毕以后记住释放掉
参考regmon的代码
Copy code

    PVOID *
    RegmonMapServiceTable(
      SERVICE_HOOK_DESCRIPTOR **ServiceIsHooked
      )
    {
      *ServiceIsHooked = (SERVICE_HOOK_DESCRIPTOR*)
                  ExAllocatePool(NonPagedPool, KeServiceDescriptorTable->TableSize);

      if( *ServiceIsHooked )
      {
        RtlZeroMemory(*ServiceIsHooked, KeServiceDescriptorTable->TableSize);

        KeServiceTableMdl = MmCreateMdl(0, KeServiceDescriptorTable->ServiceTable, KeServiceDescriptorTable->TableSize << 2);

        if( KeServiceTableMdl )
        {
            MmBuildMdlForNonPagedPool(KeServiceTableMdl);

            KeServiceTableMdl->MdlFlags |= 1;

            return (PVOID*)MmMapLockedPages(KeServiceTableMdl, KernelMode);
        }
      }

      return NULL;
    };



看起来shadowssdt何hook本身并没有什么难度
只要正确定位了地址,hook起来和ssdt完全一样
unhook不在重复 完全抄ssdt的代码即可

四。checkhook
hook用的人多了 难免出现重复hook的情况 为了实现和别人的东西和平共处,最好hook之前做个检测
hook的方法是固定的,就那么2种 改地址表 或者inline hook,我们分别来对待
1。修改地址表的hook
  这个对付起来几乎不用特别对待,只是你保存的OldFunc是其他的程序hook函数所在的地址,判断方法很简单,看看这个地址在不在win32k的模块里面,和平共处的办法是你的myfunc里面call别人的hook函数,当然 如果你不想要别人的hook了,直接搜索到原始地址call之也是可行的
另外说1下 在别人的函数里面搜索原始地址 用MmIsAddressValid+ismodulewin32k
可以判断(这个办法好像是在mj文章里面看到的 记不清了)
2。inlinehook
这个比较麻烦了 如果是修改前面5个字节还好,直接替换处理都可以不改变
麻烦是函数中间地方被hook,盲目修改可能直接BSOD了,这个需要1个反汇编引擎来帮助分析代码字节长度,海风大大的hooklib很不错 可以完成这个功能

五,简单说1下restore
Copy code

    pWin32k = GetModuleHandle("win32k.sys");
    SdtRVA = &KeServiceDescriptorTable->win32k.ServiceTable - pWin32k ;
    w32kCopy = LoadPeFile("win32k.sys");
    ProcessRelocs(w32kCopy, pWin32k);
    memcpy(&KeServiceDescriptorTable->win32k.ServiceTable, w32kCopy + SdtRVA, SdtSize);

不过 其实可以不用ProcessRelocs处理
因为你可以使用lordpe查看1下 win32k.sys的默认基址就是系统加载的基址
可以不需要ProcessRelocs,不过为了更加方便和通用,这么做也可以的

休息去咯--- 

Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健) SHADOWSSDTHOOK HOOK和UNHOOKSHADOWSSDT跟之前的HOOK/UNHOOKSSDT类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了。 一、获得wKeServiceDescriptorTableShadow的地址 这个跟获得KeServi... 阅读详情

相关推荐

深入解析Hook Shadow SSDT技术与源码实现

Hook技术是一种在软件运行时,改变或控制其他程序执行的技术手段。它允许开发者“挂钩”到系统、库或应用的某些部分,并插入自定义代码以执行额外的操作。通过这种方式,开发者可以观察和控制函数调用、消息传递或事件处理等。在系统编程中,Hook技术常用于调试、监控、扩展功能等场景。系统编程指的是编写运行在操作系统内核级别或接近内核级别的软件,如驱动程序、系统服务、操作系统组件等。这些程序通常是用C或C++等底层语言编写,并需要对操作系统的工作原理有深入了解。

weixin_33240461的博客 775

【原创】shadow ssdt学习笔记(二)

三。如何hook 似乎这个问题并不大,shadow ssdt和ssdt本质上都是1个地址表,最为简单的方法是把你的函数替换地址表的对应项,具体hook代码甚至可以完全照抄ssdt的,这里只说1下几个偶遇到的小问题 1。win32k.sys不是常在内存的,如果不是GUI线程,shadow ssdt地址无效 解决办法: 1。在driverdispatch中hokk driverdispatc

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1454

深入解析Shadow SSDT服务函数原始地址获取技术

回顾这场长达二十年的攻防拉锯战,你会发现:SSDT Hook 曾经是 Rootkit 的标配技能;Shadow SSDT 的出现标志着微软开始推行纵深防御理念;PatchGuard 让“默认拒绝”成为内核设计的新哲学;如今的终端安全早已超越单一技术点,走向体系化对抗。而对于我们这些技术人员来说,理解这些底层机制的意义远不止于“炫技”。当你知道不仅是一个隐藏的结构,更是现代操作系统自我保护思想的具体体现时,你会更加敬畏每一行代码背后的工程智慧。

weixin_35257663的博客 1026

X64ssdt 枚举函数偏移地址

emmmmm 这个其实  和Windows x86差不多~~~~~ 这里参考了 看雪论坛分享的 资料  作者是 Tesla.Angela(GDUT.HWL)  下面是代码  #include &lt;ntddk.h&gt; #include &lt;windef.h&gt; #pragma intrinsic(__readmsr) typedef struct _SYSTEM_SERVIC...

qq_41071646的博客 686

Windows内核SSDT Hook技术详解

SSDT(System Service Descriptor Table)是指系统服务描述表,它是Windows操作系统中用于管理系统服务调用的重要数据结构。SSDT定义了系统服务的入口点,允许系统和应用程序通过系统调用来访问各种服务。每个服务都有一个相应的索引号,通过这个索引,操作系统可以根据需要调用相应的服务。系统服务描述表(System Service Descriptor Table, SSDT)是Windows操作系统中用于存储系统服务函数地址的数据结构。

weixin_28681379的博客 1172

R0层获取ShadowSSDT函数原始地址实例

本实例由VS2008开发,在提供了一套驱动开发框架的同时,又演示了如何获取Shadow SSDT表函数原始地址的办法。 主要函数:ULONG GetShadowSSDT_Function_OriAddr(ULONG index); 原理说明: 根据特征码搜索导出函数KeAddSystemServiceTable来获取Shadow SSDT基址,以及通过ZwQuerySystemInformation()函数获取win32k.sys基址,然后解析PE定位到Shadow SSDT在win32k.sys的偏移地址,并通过进一步计算来得到Shadow SSDT表函数的原始地址。 这里只测试了三个函数:(460)NtUserMessageCall、(475)NtUserPostMessage和(502)NtUserSendInput,具体使用时可以举一反三,网上完整的源代码实例并不太多,希望可以帮到真正有需要的朋友。 系统环境: 在WinXP SP3系统 + 瑞星杀毒软件 打印输出: [ LemonInfo : Loading Shadow SSDT Original Address Driver... ] [ LemonInfo : 创建“设备”值为:0 ] [ LemonInfo : 创建“设备”成功... ] [ LemonInfo : 创建“符号链接”状态值为:0 ] [ LemonInfo : 创建“符号链接”成功... ] [ LemonInfo : 驱动加载成功... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 开始... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP Enter IRP_MJ_DEVICE_CONTROL... ] [ LemonInfo : 获取ShadowSSDT表 (460)NtUserMessageCall 函数的“当前地址”为:0xB83ECFC4,“起源地址”为:0xBF80EE6B ] [ LemonInfo : 获取ShadowSSDT表 (475)NtUserPostMessage 函数的“当前地址”为:0xB83ECFA3,“起源地址”为:0xBF8089B4 ] [ LemonInfo : 获取ShadowSSDT表 (502)NtUserSendInput 函数的“当前地址”为:0xBF8C31E7,“起源地址”为:0xBF8C31E7 ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP_MJ_DEVICE_CONTROL 成功执行... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 结束... ] [ LemonInfo : UnLoading Shadow SSDT Original Address Driver... ] [ LemonInfo : 删除“符号链接”成功... ] [ LemonInfo : 删除“设备”成功... ] [ LemonInfo : 驱动卸载成功... ]

Win10 x64 KeServiceDescriptorTable SSDT 偏移计算理解

Win10 x64 KeServiceDescriptorTable SSDT 偏移计算理解引言站在巨人的肩膀上实现代码通用的偏移计算方法 引言 很久没写博客了,水个博客,KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow的原理我就不写了,百度很多,主要这篇写如何定位x64下未导出的KeServiceDescriptorTable。 站在巨人的肩膀上 前辈们在之前已经找到了一个计算公式,通过读取msr寄存器的0xC0000082读取到

Doub1's Blog 2279

银河麒麟v10-arm版离线安装Portainer

银河麒麟v10-arm版离线安装Portainer

q_hsolucky的博客 3050

shadow ssdt学习笔记(一)(二)

作 者: zhuwg时 间: 2007-12-22,22:01链 接: http://bbs.pediy.com/showthread.php?t=569551。取得shadow ssdt真实地址系统只提供了KeServiceDescriptorTable导出KeServiceDescriptorTableShadow是个未导出结构定义Copy code    typedef struct _SY

1246

carsim与simulink联合仿真学习笔记(二)——使用C-class车模做driver model仿真(5 driver sensors)

Driver model 在carsim的Simulink库中自带外部驾驶员模型,打开后如图所示: 然后打开carsim中对应的数据集,如图所示: 具体仿真步骤不在赘述,注意到这里选择的是E-Class车模,那么如果我想选择C-Class车型进行仿真呢?点三角选择车型可以看到: 马赛克部分是我后来建的,如过没有使用过是没有马赛克部分的。那么既然这里没有C-class,又该怎么办呢? 创建C-...

xufuqiang2017的博客 4116

微信自动化进阶:Python识别特定消息并自动回复(基于win32api控件操作)

本文详细介绍了如何使用Python和win32api实现微信消息的智能监控与自动回复。通过精准识别聊天记录中的特定关键词,结合多级匹配策略和性能优化技巧,构建稳定高效的自动化回复系统,适用于企业客服、个人助手等场景。

weixin_42663213的博客 441

【原创】shadow ssdt学习笔记(一)(二)

http://bbs.pediy.com/showthread.php?t=56955 标 题: 【原创】shadow ssdt学习笔记(一)(二) 作 者: zhuwg 时 间: 2007-12-22,22:01:29 链 接: http://bbs.pediy.com/showthread.php?t=56955 1。取得shadow 

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1674

Zynq UltraScale+ RFSoC实战:用XCZU49DR开发板实现雷达信号处理全流程

本文详细介绍了如何利用Xilinx Zynq UltraScale+ RFSoC系列中的XCZU49DR开发板,高效实现雷达信号处理全流程。文章深入剖析了该芯片集成的射频直采ADC/DAC、可编程逻辑与Arm多核处理器的异构计算优势,并通过实战案例展示了从环境搭建、硬件链路设计到软件优化的完整开发路径,为相控阵雷达等高性能应用提供了单芯片解决方案。

weixin_29291863的博客 575

二探win10 x64 SSDT(驱动学习笔记六)

二探win10 x64 SSDT0x0 C0000082的通解背景介绍寻找SSDT代码实现 0x0 C0000082的通解 背景介绍 在上一篇学习笔记中,我们曾说过,在win10 x64 1809专业版上 通过C0000082 MSR寄存器,我所得到的地址并非是nt!KiSystemCall64,而是nt!KiSystemCall64Shadow。 因此,我的权宜之计是读取地址后取一个偏移量将开...

rep_Su的博客 3526

基于C++的MMC仿真与PSCAD建模

MMC是一种基于模块化设计的多电平换流器,通常由若干个基本单元(子模块)组成。每个子模块包含一个电容和两个开关,通过控制开关的开闭,实现输出电压的级联和多电平化。高效率:由于开关频率较低,开关损耗小,效率高。高可靠性:模块化设计使得故障模块易于更换,提高了系统的可靠性。灵活扩展:可以通过增加或减少子模块的数量,方便地调整输出电压和功率。PSCAD(Power Systems Computer Aided Design)是广泛应用于电力系统仿真的专业软件,具有强大的建模和仿真能力。

qq_38334677的博客 295

Open3D 计算点云配准的旋转和平移误差

通过计算旋转误差和平移误差来量化配准结果与真实变换之间的偏差。

点云侠的博客 250

两种方法获取shadow ssdt

<br />ULONG GetShadowSsdtCurrentAddresses( PSSDT_ADDRESS AddressInfo, PULONG Length ) { PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableShadow = NULL; ULONG NumberOfService = 0; ULONG ServiceId = 0; PKAPC_STA

kedebug 2018

R语言做一个 GM (1,1)灰色预测模型

累加生成是GM(1,1)模型的另一个重要步骤,它通过构造累加生成序列,把非线性非平稳时间序列转化为线性平稳时间序列。GM(1,1)是一种基于灰色系统理论的预测模型,通常用于中小样本的非线性、非平稳时间序列数据分析。灰色预测模型的核心是灰度处理,将原始时间序列转化为灰色时间序列。这里使用R语言中的diff函数对时间序列进行一次差分,然后对结果取累加和得到灰度序列。以上是GM(1,1)灰色预测模型在R语言中的实现步骤。需要注意的是,GM(1,1)模型适用于中小样本的时间序列预测,对于长期预测效果可能较差。

Mrrunsen的博客 3841

shadow ssdt学习笔记

1。取得shadow ssdt真实地址系统只提供了KeServiceDescriptorTable导出KeServiceDescriptorTableShadow是个未导出结构定义Copy code    typedef struct _SYSTEM_SERVICE_TABLE    {          PNTPROC  ServiceTable;  // array of entry

sea 2336

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

模型的主要参数,如变换器的层数、三平面的维度、NeRF模型的具体细节和主要训练配置,在表1中详细说明。TripoSR的算法流程结合了先进的数据处理、模型设计和训练技术,使其能够在不到0.5秒的时间内从单张图像中快速生成详细的3D网格。总体而言,TripoSR是一个强大的3D重建工具,它在速度和质量上都表现出色,但也需要考虑到其对计算资源的需求和在处理极端复杂场景时可能遇到的挑战。:通过精心策划的训练数据集和多样化的数据渲染技术,TripoSR提高了模型的泛化能力和对真实世界图像的适应性。

Christo的博客 1946

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WinObjEx64服务表查看器:SSDT与Shadow SSDT深度解析

WinObjEx64是一款功能强大的Windows Object Manager命名空间探索工具,它不仅能让你深入了解系统对象结构,还提供了对核心服务表的查看功能,包括SSDT(系统服务描述符表)和Shadow SSDT。本文将带你全面了解这两个关键系统组件,以及如何使用WinObjEx64进行高效分析。 ## 什么是SSDT和Shadow SSDT? SSDT(System Service

gitblog_00731的博客 1118

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Hook Shadow SSDT

作 者: sislcb时 间: 2008-06-02,23:21链 接: http://bbs.pediy.com/showthread.php?t=65931网上很多文章都有关于SSDT的完整的实现,但是没有关于Shadow SSDT的完整实现,目前最好的文章是《shadow ssdt学习笔记 by zhuwg》,我这里的程序也很多参考了他的文章,在这里谢谢了。我这里给出一个hook shado

1478

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

getssdtserviceid_两种方法获取shadow ssdt

ULONGGetShadowSsdtCurrentAddresses(PSSDT_ADDRESS AddressInfo,PULONG Length){PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableShadow=NULL;ULONG NumberOfService= 0;ULONG ServiceId= 0;PKAPC_STATE...

weixin_31849265的博客 193
上一篇: shadow ssdt学习笔记(一)
下一篇: 驱动监控进程的创建
M-先生
博客等级 码龄17年 60粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值