Win64 驱动内核编程-19.HOOK-SSDT】的更多相关文章

HOOK SSDT 在 WIN64 上 HOOK SSDT 和 UNHOOK SSDT 在原理上跟 WIN32 没什么不同,甚至说 HOOK 和 UNHOOK 在本质上也没有不同,都是在指定的地址上填写一串数字而已 (填写代理函数的地址时叫做 HOOK,填写原始函数的地址时叫做 UNHOOK).不过实现起来还是很大不同的. 一 . HOOK SSDT 要挂钩 SSDT,必然要先得到 ServiceTableBase 的地址.和 SSDT 相关的两个结构体 SYSTEM_SERVICE_TABLE…
UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的.于是,有了以下思路: 1.获得内核里 KiServiceTable 的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(变量名称:NtosBase) 3.获得内核文件在 PE32+结构体里的映像基址(变量名称:NtosImageBase) 4.在自身进程里加载内核文件并取得映射地址(变量名称:NtosInProcess)…
SHADOW SSDT HOOK HOOK 和 UNHOOK SHADOW SSDT 跟之前的 HOOK/UNHOOK SSDT 类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了. 一.获得 w KeServiceDescriptorTableShadow的地址 这个跟获得 KeServiceDescriptorTable 差不多,唯一不同就是特征码: ULONGLONG GetKeServiceDescri…
SSDT 学习资料:http://blog.csdn.net/zfdyq0/article/details/26515019 学习资料:WIN64内核编程基础 胡文亮 SSDT(系统服务描述表),刚开始接触什么进程保护XXX啥的,都是看到在说SSDT(虽然说目前很多杀软都已经采用稳定简单的回调姿势了).这次就弄清楚两个问题: 如何在内核里动态获得 SSDT 的基址: 如何在内核里动态获得 SSDT 函数的地址: 在 WIN32 下,第一个问题就根本不是问题,因为 KeServiceDescrip…
Ring0 InLineHook 和UnHook 如果是要在R0里hook,作者的建议是InLine HOOK,毕竟SSDT HOOK 和 SHADOW SSDT HOOK比较麻烦,不好修改.目前R3的InLine HOOK 我比较喜欢的是 MINI HOOK ENGINE,但是今天要解决的是R0的InLine HOOK问题. 下面说下InLine HOOK的思路: 一 . 实现  RING0 INLINE HOOK 无论是用户态 Inline Hook 还是内核级 Inline Hook,都要…
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程相关的 NATIVE API 而已(当然了,本文所说的进程操作,还包括对线程和 DLL 模块的操作).本文包括 10 个部分:分别是:枚举进程.暂停进程.恢复进程.结束进程.枚举线程.暂停线程.恢复线程.结束线程.枚举 DLL 模块.卸载 DLL 模块. 1.枚举进程.进程就是活动起来的程序.每一个…
内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool.RtlMoveMemory. RtlFillMemory.ExFreePool.它们的原型分别是: 需要注意的是,RtlFillMemory 和 memset 的原型不同.ExAllocatePool 和 malloc 的原型也不同.前者只是参数前后调换了一下位置,但是后者则多了一个参数:Pool…
内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 DriverObject 就是使用双向链表给串起来的,遍历这个链表就可以枚举内核里所有的驱动.示例代码如下 //传入驱动自身的 DriverObject VOID EnumDriver(PDRIVER_OBJECT pDriverObject) { PKLDR_DATA_TABLE_ENTRY entry…
驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. 驱动程序Hello World 之前总结了驱动环境的搭建,这里就直接继续之前搭建好的环境创建项目,打开vs2015创建一个驱动项目: 写代码之前先配置下编译选项: 然后添加一个项目文件main.c(注意后缀是.c,前面名字无所谓可以不叫main),里面的内容如下(下面模板代码来源于网络,作者:胡文亮…
无HOOK监控进线程句柄操作 在 NT5 平台下,要监控进线程句柄的操作. 通常要挂钩三个API:NtOpenProcess.NtOpenThread.NtDuplicateObject.但是在 VISTA SP1 以及之后的系统中,我们可以完全抛弃 HOOK 方案了,转而使用一个标准的 API:ObRegisterCallbacks.下面做一个监视进线程句柄操作的程序,并实现保护名为 CALC.EXE 的进程不被结束. 首先介绍一下 ObRegisterCallbacks 这个函数.此函数的前…
枚举与删除注册表回调 注册表回调是一个监控注册表读写的回调,它的效果非常明显,一个回调能实现在SSDT 上 HOOK 十几个 API 的效果.部分游戏保护还会在注册表回调上做功夫,监控 service 键的子键,实现双层拦截驱动加载(在映像回调那里还有一层).而在卡巴斯基等 HIPS 类软件里,则用来监控自启动等键值. 注册表回调在 XP 系统上貌似是一个数组,但是从 WINDOWS 2003 开始,就变成了一个链表.这个链表的头称为 CallbackListHead,可在 CmUnRegist…
突破WIN7的PatchGuard WIN64 有两个内核保护机制,KPP 和 DSE.KPP 阻止我们 PATCH 内核,DSE 拦截我们加载驱动.当然 KPP 和 DSE 并不是不可战胜的,WIN7X64 出来不久,FYYRE 就发布了破解内核的工具,后来有个叫做 Feryno 的人又公开了源代码. 要实现突破 DSE 和 PatchGuard,必须修改两个文件,winload.exe 以及ntoskrnl.exe. 细节就不说了,大体思路就是在winload.exe改一个地方,ntoskr…
对抗与枚举MiniFilter MiniFilter 是目前杀毒软件用来实现"文件系统自我保护"和"文件实时监控"的方法. 由于 MiniFilter 模型简单,开发快捷,通用性好,以前用 FSD HOOK 或者标准过滤驱动来实现相关功能的杀软纷纷改用 MiniFilter,比如卡巴斯基.不过,枚举 MiniFilter 就跟之前枚举回调的方法不太相同了,因为 MiniFilter 的框架不在 NTOSKRNL 里,自成一套系统,有专用的 API.不过"自…
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们. 钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件. 钩子的类型: (1) 键盘钩子和低级键盘钩子可以监视各种键盘消息. (2) 鼠标钩子和低级鼠标钩子可以监视…
强制结束进程 依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情.同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品.作为学习和破解的话当然可以尝试各种hook.目前来说很多杀软进程保护都是通过回调了保护的,简单,稳定,安全.So,强制结束进程会比当年简单很多. 首先就是上一个最基本的驱动里结束进程的方法: 1.直接调用ZwTerminateProcess去结束进程,这个是公开导出的函数,也就是说它很稳定.不要小看这个东西,我测试过很多杀软.目前停…
X64枚举和隐藏内核模块 在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中的 InLoadOrderLinks 双向链表:隐藏内核模块的通用方法是把指定的驱动对象从 KLDR_DATA_TABLE_ENTRY中的 InLoadOrderLinks 双向链表上摘除. X64内核模块枚举(注意是在R3) #include <stdio.h> #include <Window…
 MINIFILTER(文件保护) 使用 HOOK 来监控文件操作的方法有很多,可以在 SSDT 上 HOOK 一堆和 FILE 有关的函数,也可以对 FSD 进行 IRP HOOK,不过这些方法既不方便,也不安全.微软推荐的文件操作过滤方法是使用过滤驱动,在 VISTA 之后,推荐使用 MINIFILTER (字面翻译是迷你过滤器).MINIFILTER 基于标准的文件过滤驱动,但是微软把它封装得很好,使得大家不用注意太多细节,而专注于对 IRP 的过滤. 之前一直在看一些细节和各种配置文件设…
回调监控模块加载 模块加载包括用户层模块(.DLL)和内核模块(.SYS)的加载.传统方法要监控这两者加在必须 HOOK 好几个函数,比如 NtCreateSection 和 NtLoadDriver 等,而且这些方法还不能监控未知的驱动加载方法.其实为了监控模块加载而HOOK API 是非常傻的,因为微软已经提供了一对标准的 API 实现此功能.它们 分别是 PsSetLoadImageNotifyRoutine 和 PsRemoveLoadImageNotifyRoutine,可以设置/取消…
系统调用.WOW64与兼容模式 这种东西都是偏向于概念的,我就把资料上的东西整理下粘贴过来,资料来源于胡文亮,感谢这位前辈. WIN64 的系统调用比 WIN32 要复杂很多,原因很简单,因为 WIN64 系统可以运行两种 EXE,而且 WIN32EXE 的执行效率并不差(据我本人用 3DMARK06 实测,在一台电脑上分别安装 WIN7X86 和WIN7X64,使用同样版本的显卡驱动,3DMARK06在 WIN7X86 的系统得分比在 WIN7X64 系统的得分高 3%左右,性能损失还算少),…
内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 API,不能用 WIN32API.在讲解具体的代码之前,先讲解一下文件系统的流程,让大家对整个文件系统有个大概的了解. 假设我们要读写一个文件,无论在 RING3 调用 ReadFile,还是在 RING0 调用 NtReadFile,它们最终会转换为 IRP,发送到 文件系统驱动(具体哪个驱动和分区类型相关,…
WFP驱动监控网络 WFP 是微软推出来替代 TDI HOOK.NDIS HOOK 等拦截网络通信的方案,WFP 的框架非常庞大,在 RING3 和 RING0 各有一套类似的函数,令人兴奋的是,即使在 R3 使用 WFP,也可以做到全局拦截访问网络.由于 WFP 的范围太广,实在难以一言概括,感兴趣的朋友可以自行到 MSDN 上查看微软对它的官方概述.本文的目的,是给大家理顺 WFP 的框架,并利用 WFP 拦截指定进程访问网络,或拦截对指定 IP 地址/端口的访问. 一个标准的 WFP 程序…
回调监控注册表 在 WIN32 平台上,监控注册表的手段通常是 SSDT HOOK.不过用 SSDT HOOK 的方式监控注册表实在是太麻烦了,要 HOOK 一大堆函数,还要处理一些 NT6 系统有而 NT5 系统没有的函数.下面我就来介绍一种完胜 SSDT HOOK 监控注册表的方法,效果跟 SSDT HOOK 一样好.这个方法就是使用微软推荐的注册表监控函数:CmRegisterCallbak.此函数其实在 XP 系统上就有了,不过那时功能不完善,只能简单的禁止或允许,无法获得完整的注册表修…
内核里操作注册表 RING0 操作注册表和 RING3 的区别也不大,同样是"获得句柄->执行操作->关闭句柄"的模式,同样也只能使用内核 API 不能使用 WIN32API.不过内核里有一套 RTL 函数,把 Zw系列的注册表函数进行了封装,也就是说,只剩下"执行操作"这一步了. 接下来说说注册表的本质.注册表其实是文件,它存储在 c:\windows\system32\config 这个目录下(打开目录,看到那几个带锁图标的文件就是.为什么带锁?因为…
内核里操作字符串 字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花 样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*.WCHAR*.ANSI_STRING.UNICODE_STRING.当然,内核里使用频率最多的是 UNICODE_STRING,其次是 WCHAR*,再次是 CHAR*,而 ANSI_STRING,则几乎没见过有什么内核函数使用. 但其实这四种字符串也不是完全独立的,ANSI_STRING可以看成是CHAR*的安全性扩展,UNICO…
驱动开发环境及其双机调试环境搭建 开发环境搭建 使用工具:vs2015,Windows 10 SDK_10.0.14393,WDK10.0.14393.0 (1)安装VS2015  随便一个版本吧,我安装的企业版 (2)安装WDK10.0.14393 安装WDK (3)安装Windows 10 SDK_10.0.14393.安装SDK,这个首先可以尝试从VS配置更新里安装. 控制面板->卸载程序->vs2015->更改 选上这个SDK,然后更新.注意这个地方很有可能更新失败,我在公司一次…
枚举与删除映像回调 映像回调可以拦截 RING3 和 RING0 的映像加载.某些游戏保护会用此来拦截黑名单中的驱动加载,比如 XUETR.WIN64AST 的驱动.同理,在反游戏保护的过程中,也可以拦截游戏驱动的加载. 跟进程/线程回调类似,映像回调也存储在数组里.这个数组的"符号名"是PspLoadImageNotifyRoutine.我们可以在 PsSetLoadImageNotifyRoutine 中找到它: 实现的代码如下: ULONG64 FindPspLoadImageN…
枚举与删除线程回调 进程回调可以监视进程的创建和退出,这个在前面的章节已经总结过了.某些游戏保护的驱动喜欢用这个函数来监视有没有黑名单中的程序运行,如果运行则阻止运行或者把游戏退出.而线程回调则通常用来监控远程线程的建立,如果发现有远程线程注入到了游戏进程里,则马上把游戏退出.现在来详细讲解如何绕过这个两个监控. 我们注册的进程回调,会存储在一个名为 PspCreateProcessNotifyRoutine 的数组里. PspCreateProcessNotifyRoutine 可以理解成一个…
强制解锁文件 强制解锁因其他进程占用而无法删除的文件. 1.调用 ZwQuerySystemInformation 的 16 功能号来枚举系统里的句柄 2.打开拥有此句柄的进程并把此句柄复制到自己的进程 3.用 ZwQueryObject 查询句柄的类型和名称 4.如果 发现此句柄的类型是文件句柄, 名称和被锁定的文件一致,就关闭此句柄 5.重复 2.3.4 步,直到遍历完系统里所有的句柄 第4步中因为是要解锁其他进程占用的文件所以有如下细节: 1.用 KeStackAttachProcess"…
强制读写受保护的内存 某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的). 方案1(R3):直接修改别人内存 最基本的也最简单的就是直接通过WriteProcessMemory 和 ReadProcessMemory对没有进行保护的程序的内存进行修改,一些单机游戏辅助什么的可能会有这种简单方式修改其他进程内存. 方案2(R3): 注入 通过注入的方式想办法进入宿主进程,然后修改他的内存.这里的话姿势就很多了,远程代码注入,A…
64位驱动里内嵌汇编 讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行. 获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内存内容,再把内存内容复制出来.或者是去我看的资料上的那个作者提供的一个工具: http://www.vbasm.com/thread-5651-1-1.html)直接把汇编编程机器码. 内嵌的汇编子程序有返回值以及 给汇编子程序传入参数 首先是使用 typedef 定义一下你的汇编子程序的原型,然后…