通过SSDT UnHOOK 函数HOOK

Win64 驱动内核编程-19.HOOK-SSDT HOOK SSDT     在 WIN64 上 HOOK SSDT 和 UNHOOK SSDT 在原理上跟 WIN32 没什么不同,甚至说 HOOK 和 UNHOOK 在本质上也没有不同,都是在指定的地址上填写一串数字而已 (填写代理函数的地址时叫做 HOOK,填写原始函数的地址时叫做 UNHOOK)。不过实现起来还是很大不同的。 一 、 HOOK SSDT     要挂钩 SSDT,必然 阅读详情

一、在用户空间修改系统服务调度表(SSDT)
SSDT位于内核空间,如果要修改SSDT的入口函数,rootkit都是通过驱动程序的方式载入再修改的。然而在用户空间可以通过直接读写/device/physicalmemory来修改SSDT的入口。(译注:修改SSDT入口是可以在用户空间进行,只是SSDT的入口函数必须是在内核空间,所以一般rootkit都是把修改后的程序放在驱动程序中,以便直接加载到内核空间。)

Mark Russinovich在Sysinternals发表了Physmem工具,通过使用/device/physicalmemory来查看物理内存。在"Playing with Windows /dev/(k)mem"文章中详细描述了如何通过/device/physicalmemory读写内核内存。在"Process Hide"文章中描述如何通过直接操作/device/physicalmemory进行进程的隐藏。

以下的步骤描述了如何在管理员权限下用户空间程序获取对/device/phisicalmemory的读写。

1、尝试用ntdll.dll的输出函数NtOpenSection,设置标志为SECTION_MAP_READ | SECTION_MAP_WRITE来获取/device/physicalmemory的句柄。由于系统管理员不具有对内核内存进行SECTION_MAP_WRITE的权限,所以一般情况下都会失败。

2、用NtOpenSection,设置标志为SECTION_MAP_READ | WRITE_DAC来获取/device/physicalmemory的句柄。使用WRITE_DAC标志,将能够对/device/physicalmemory添加新的DACL。

3、给/device/phisicalmemory添加一个DACL,使得系统管理员具有SECTION_MAP_WRITE权限。

4、再次尝试1步骤。

在进行完上述流程以后,用户空间的程序将成功获取/device/physicalmemory的句柄。在用户空间的程序中必须把物理内存页映射到虚拟内存,才能够直接对物理内存进行写操作,这里可以通过NtMapViewOfSection完成。在物理内存映射到虚拟内存以后,用户空间程序就可以像它本身自己分配的内存一样,进行读写操作。

ntStatus = _NtMapViewOfSection(
 hPhyMem,        // /device/physicalmemory的句柄
 (HANDLE)-1,
 virtualAddr,       // 输出参数,虚拟内存中映射物理内存的地址
 0,
 *length,
 &viewBase,     // 输入/输出参数,需要映射的物理内存地址
 length,              // 输入/输出参数,需要映射的物理内存长度
 ViewShare,
 0,
 PAGE_READWRITE   // 读写权限
 );
 

二、定位系统服务调度表的内存地址
为了在用户空间程序中修改SSDT的入口函数,必须把找到SSDT的物理内存并将其映射到虚拟内存空间。SSDT的地址可以从KeServiceDescriptorTable结构体的成员KiServiceTable中找到。在找到SSDT的地址以前,必须先定位KeServiceDescriptorTable的地址。虽然KeServiceDescriptorTable的地址在不同版本的Windows和Serivce Pack中都会变化。但KeServiceDescriptorTable是ntosknl.exe的输出符号,在用户空间程序中仍然可以获取它的可靠值。首先,按照正确的内存对齐方式把ntoskrnl.exe载入内存,通过搜索ntoskrnl.exe的输出表定位KeServiceDescriptorTable的地址。

将获取的KeServiceDescriptorTable的地址转换为物理地址,将对应的物理地址映射到虚拟内存中。为了转换KeServiceDescriptorTable的偏移地址转换到物理地址,必须先找到保护模式下虚拟内核的基地址,这可以直接用ZwQuerySystemInformation来获取,需要设定第一个参数为SystemModuleInformation。这样,包含KeServiceDescriptorTable的物理地址就可以通过如下公式进行计算:
PhyMemAddrKeServiceDescriptorTable =
 KernelVirtualBaseAddr + OffsetAddrKeServiceDescriptorTable - 0x80000000
这里都假定保护模式下的虚拟内存是从0x80000000开始。

这之后,通过读取KeServiceDescriptorTable结构体中的第一个成员ServiceDescriptor[0].KiServiceTable,就能够获取SSDT的地址。这里获取的SSDT地址还必须转换为物理地址,公式如下:
PhyMemAddrServiceTable = VirtualMemAddrServiceTable - 0x80000000

KiServiceTable的虚拟内存地址还用来定义ntoskrnl.exe中的原SSDT地址,公式如下:
OffsetAddrServiceTable = VirtualMemAddrServiceTable - KernelVirtualBaseAddr

在SDTrestore工具发布后,90210在rootkit.com提出了一种定位KiServiceTable更有效的办法。该技术主要基于KeServiceDescriptorTable是在KiInitSystem函数中通过下面的指令初始化:
mov ds:KeServiceDescriptorTable, offset KiServiceTable
可以通过搜索ntoskrnl.exe的重定位表找到这条指令。使用重定位表的搜索如上的指令比在整个ntoskrnl.exe的程序区中搜索,更加有效和可靠。一旦找到这条指令,KiServiceTable的偏移地址就找到了。

三、恢复系统服务调度表的入口函数
把包含SSDT的内核物理内容映射以后,对运行内核中的SSDT入口函数和从ntoskrnl.exe磁盘映像的原SSDT入口函数进行对比。由于在运行内核中SSDT入口函数是一个绝对虚拟地址的函
数指针,所以在比较以前必须转换为偏移地址,转换公式如下:
OffsetAddrOfFuncPtr = VirtualMemAbsAddrOfFuncPtr - KernelVirtualBaseAddr

如果某个入口函数的偏移地址和ntoskrnl.exe的原始地址不同,就表示该入口被Hook。被Hook的入口函数可以用ntoskrnl.exe的原始地址进行恢复。当然需要把ntoskrnl.exe的偏移地址转换为绝对虚拟地址。 

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

相关推荐

黑苹果安装工具以及DSDT,ssdt修改工具

包含工具: ACPI Patcher DSDT Auto Patcher DSDT Editor DSDTFixer DSDTSE.app DSDTSE-for-Windows Everest GPU-Z iDSDT IORegistryExplorer.app Kext Helper b7 Kext Utility Kext Wizard.app Lizard Marvin's AMD Ulitily SystemInfo.app

Defeating Native API Hooker

一、在用户空间修改系统服务调度表(SSDT)SSDT位于内核空间,如果要修改SSDT的入口函数,rootkit都是通过驱动程序的方式载入再修改的。然而在用户空间可以通过直接读写/device/physicalmemory来修改SSDT的入口。(译注:修改SSDT入口是可以在用户空间进行,只是SSDT的入口函数必须是在内核空间,所以一般rootkit都是把修改后的程序放在驱动程序中,以便直接加载到内

1739

黑苹果dsdt修改详解,几分钟会修改,不求人!

好东西!玩黑苹果的你,你懂的。不用再五国菊花,-v删删删

内核层 SSDT Hook

31 30 29 28 19 18 17 16 15 6 5 4 3 2 1 0 PG CD NW AM WP NE ET TS EM MP PE 将WP位从1改为0来关闭写保护。可以通过将 ZwOpenProcess 的第二个参数改为0(访问权限为拒绝访问)来保护进程。2.在函数找SSDT表的路上jmp到新的SSDT表(360是这样的)SSDT表的物理页是只读的,想修改SSDT表需要先对寄存器进行操作。通过 SSDT Hook 保护进程。

星星我啊,已经很努力在学习了, 有人一起学习吗?Ziansec-1 376

UnhookSSDT_delphi_tool_

powerful unhook tool in kernel mode

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

深度剖析:内核 SSDT 钩子技术

本文深度解析Windows内核SSDT钩子技术原理与应用。SSDT是连接用户模式API与内核模式实现的关键调度机制,通过修改SSDT函数指针可重定向系统调用。文章详解了SSDT结构、服务ID计算、CR0写保护绕过等核心技术,并呈现钩子安装全流程。在高级应用方面,介绍了跳板式钩子和过滤链式钩子两种模式,最后给出进程保护、文件防篡改和注册表保护三大实战案例。通过保存原始函数地址和CR0寄存器操作,该技术可实现系统调用的监控与拦截,具有重要的安全防护价值。

liulilittle的博客 1240

(project generation have a problem)STM32CubeMX生成工程一直报错项目生成有问题[玄学三步解]

解决办法 第一步,检查自己是不是真的配置的不对,JAVA安装没,pack路径设置的对不对,这里有一位前辈的博文写的非常好,附加链接https://blog.youkuaiyun.com/ybhuangfugui/article/details/52225736#commentBox 第二步,如果按照前辈的博文设置的都一模一样,还是不对,想我下图这样。 那你来对地方了 方法很简单,你把你生成工程文件的路径彻底的...

展桑博客-BenjieBlog 2922

修改SSDT做简单的进程保护

*By 炉子[0GiNr]http://atleast.blog.cfan.com.cnhttp://0ginr.com*/M$真是照顾菜鸟 居然会给个SSDT,而且居然还把KSDT(KeServiceDescrīptorTable)导出了(当然,不排除这是M$的无奈之举,因为M$是不推荐programmer Hook他的API的,但是如果不对API做hook,那么许多事情都很难完成,这使得M$不

1938

程序自动化填写网页表单数据

如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。

Y 2426

window部署open claw(使用wsl-Ubuntu-docker部署)

本文详细介绍了在Windows 11系统下通过WSL2+Docker部署OpenClaw的完整流程。首先需要满足硬件配置要求并开启虚拟化功能,然后依次完成WSL2安装配置、Docker Desktop安装、OpenClaw镜像拉取等步骤。重点说明了端口映射、socat转发配置及openclaw.json文件修改方法。最后通过验证WSL2内网IP和端口访问服务。该方案具有最佳兼容性,能有效避免Windows环境下的依赖冲突问题。

Kmoyic的博客 2763

Win64 驱动内核编程-20.UnHook SSDT

UNHOOKSSDT 要恢复SSDT,首先要获得SSDT各个函数的原始地址,而SSDT各个函数的原始地址,自然是存储在内核文件里的。于是,有了以下思路: 1.获得内核里KiServiceTable的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(...

墨鱼菜鸡 374

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

RootKit hook之[二] SSDT hook

<br />谈到ssdt hook,先前有堕落天才的一篇文章《http://bbs1.pediy.com/showthread.php?p=285856#poststop"]SSDT Hook的妙用-对抗ring0 inline hook 》大家如果对基本概念不了解的话,可以看看这篇文章。另外,有一篇博客上也绘声绘色的描述了它。简单说说SSDT 。<br /><br /> 今天我们透过一个实例看看它的应用,这个实例来源于sudami前面发出的一篇文章<br />一VBS病毒过IS和微点了,无语...

kansa1988的专栏 466

【考试大纲】中级多媒体应用设计师考试大纲

中级多媒体应用设计师考试大纲

邓邓子的博客 382

Windows 11 安装 JDK 11:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 11 的完整流程,包括从 Oracle 官网下载压缩包、解压到自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章还包含一个专为 JDK 11 新特性设计的测试程序,涵盖 Lambda 表达式 var 语法、HTTP 客户端 API、字符串增强方法等,帮助读者确认安装版本正确无误,适合初学者和需要多版本 JDK 共存的开发者参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2781

谈谈NP和HS的通用unhook

谈谈NP和HS的通用unhook祝各位新年快乐  一边听音乐一边写代码真的很舒服阿很舒服先简单说以下,NP和HS都hook了以下一些SSDT什么是SSDT?我不想说那些复杂的理论,希望以简单的事实帮助介绍先向大S道歉,下文如有冒犯,还请大S原谅 怎么说呢,SSDT本身就是一个地址表,我们当他是个地址簿,也就是写了每个人的地址的记录表今天,偶想给大S送新年礼物,怎么送到大S家里呢?就得查看地址簿

cn_jevons的专栏 2229

Amazon SES 移出沙盒完整指南 & 高通过率模板

AWS SES沙盒模式转正式模式申请指南 申请正式模式需通过AWS审核,常见被拒原因包括邮件用途不清晰、缺少退订机制或发送量不合理。人工申诉需登录AWS Support Center提交服务限额提升请求,填写详细的公司信息、邮件用途及合规措施。 高通过率申诉模板需包含: 公司信息:名称、网址及与AWS的合作情况。 邮件规范:明确类型(交易/营销)、退订链接及退信处理机制。 发送计划:合理预估发送量,确保合规。 关键点:真实信息、用途清晰、退订机制完善、发送量合理。首次被拒可修改后重新提交。

xianyinsuifeng的博客 329

YJX_Driver_032_自写驱动保护XX进程

1、 自写驱动保护XX进程(HOOK SSDT)  A、构建自己的内核函数(用来替换对应的内核函数)  C、Hook和UnHook函数构建  D、修改EXE和SYS对应源代码实现所谓保护  E、测试效果 【135】以28课的代码为例 新建一个hook.h单元   【200】实际上选用 第29/30课 的代码也是可以的     【380】hook.h 里面的代码: “ #pragm...

weixin_30914981的博客 207

jre9下载 jdk9

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HOOK SSDT

<br />NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ) { DriverObject->DriverUnload = OnUnload; Hook(); return STATUS_SUCCESS; } // 此处修改SSDT中的NtOpenProcess服务地址 V

Rootkit ﹏ 816

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

getssdtserviceid_C/C++知识点之SSDTinlinehook(64位)

本文主要向大家介绍了 C/C++知识点之SSDTinlinehook(64位),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。源码:https://github.com/haidragon/SSDTHOOK_win7x64/tree/master/SSDTHOOK_win7x64SSDT表的查找:https://blog.youkuaiyun.com/zfdyq0/article/deta...

weixin_39946313的博客 299

【原创】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
上一篇: Win2K下驱动程序的动态加载
下一篇: 城里城外看SSDT
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值