
驱动内核编程
文章平均质量分 80
京城一十三
你在凝视深渊的时候 深渊也在凝视着你
展开
-
Win64 驱动内核编程-34.对抗与枚举MiniFilter
对抗与枚举MiniFilterMiniFilter是目前杀毒软件用来实现“文件系统自我保护”和“文件实时监控”的方法。由于MiniFilter模型简单,开发快捷,通用性好,以前用FSDHOOK或者标准过滤驱动来实现相关功能的杀软纷纷改用MiniFilter,比如卡巴斯基。不过,枚举MiniFilter就跟之前枚举回调的方法不太相同了,因为MiniFilter的...原创 2017-04-04 14:44:32 · 4995 阅读 · 1 评论 -
Win64 驱动内核编程-33.枚举与删除对象回调
枚举与删除对象回调对象回调存储在对应对象结构体里,简单来说,就是存储在ObjectType.CallbackList这个双向链表里。但对象结构体在每个系统上都不一定相同。比如WIN7X64的结构体如下:ntdll!_OBJECT_TYPE+0x000TypeList:_LIST_ENTRY+0x010Name:_UNICODE_STRING+0...原创 2017-04-04 14:09:01 · 5447 阅读 · 0 评论 -
Win64 驱动内核编程-32.枚举与删除注册表回调
枚举与删除注册表回调注册表回调是一个监控注册表读写的回调,它的效果非常明显,一个回调能实现在SSDT上HOOK十几个API的效果。部分游戏保护还会在注册表回调上做功夫,监控service键的子键,实现双层拦截驱动加载(在映像回调那里还有一层)。而在卡巴斯基等HIPS类软件里,则用来监控自启动等键值。 注册表回调在XP系统上貌似是一个数组,但是从WIN...原创 2017-04-04 13:11:33 · 2576 阅读 · 0 评论 -
Win64 驱动内核编程-31.枚举与删除映像回调
枚举与删除映像回调 映像回调可以拦截RING3和RING0的映像加载。某些游戏保护会用此来拦截黑名单中的驱动加载,比如XUETR、WIN64AST的驱动。同理,在反游戏保护的过程中,也可以拦截游戏驱动的加载。 跟进程/线程回调类似,映像回调也存储在数组里。这个数组的“符号名”是PspLoadImageNotifyRoutine。我们可以在PsSetLoadImag...原创 2017-04-04 12:50:14 · 2150 阅读 · 0 评论 -
Win64 驱动内核编程-30.枚举与删除线程回调
枚举与删除线程回调 进程回调可以监视进程的创建和退出,这个在前面的章节已经总结过了。某些游戏保护的驱动喜欢用这个函数来监视有没有黑名单中的程序运行,如果运行则阻止运行或者把游戏退出。而线程回调则通常用来监控远程线程的建立,如果发现有远程线程注入到了游戏进程里,则马上把游戏退出。现在来详细讲解如何绕过这个两个监控。我们注册的进程回调,会存储在一个名为PspCreateProc...原创 2017-04-04 12:12:35 · 4648 阅读 · 1 评论 -
Win64 驱动内核编程-29.强制解锁文件
强制解锁文件强制解锁因其他进程占用而无法删除的文件。1.调用ZwQuerySystemInformation的16功能号来枚举系统里的句柄2.打开拥有此句柄的进程并把此句柄复制到自己的进程3.用ZwQueryObject查询句柄的类型和名称4.如果发现此句柄的类型是文件句柄,名称和被锁定的文件一致,就关闭此句柄5.重复2、3、4步,直到遍历完系统...原创 2017-04-03 19:17:27 · 3721 阅读 · 0 评论 -
Win64 驱动内核编程-28.枚举消息钩子
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子:钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。 钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。原创 2017-04-01 00:42:32 · 4821 阅读 · 4 评论 -
Win64 驱动内核编程-27.强制读写受保护的内存
强制读写受保护的内存 某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的)。 方案1(R3):直接修改别人内存最基本的也最简单的就是直接通过WriteProcessMemory 和 ReadProcessMemory对没有进行保护的程序的内存进行修改,一些单机游戏辅助什么的可能会有这种简单方式修改其他进原创 2017-03-31 00:06:24 · 19925 阅读 · 6 评论 -
Win64 驱动内核编程-26.强制结束进程
强制结束进程 依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情。同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品。作为学习和破解的话当然可以尝试各种hook。目前来说很多杀软进程保护都是通过回调了保护的,简单,稳定,安全。So,强制结束进程会比当年简单很多。首先就是上一个最基本的驱动里结束进程的方法: 1.直接调用ZwTer原创 2017-03-29 00:37:32 · 5230 阅读 · 0 评论 -
Win64 驱动内核编程-25.X64枚举和隐藏内核模块
X64枚举和隐藏内核模块 在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中的 InLoadOrderLinks 双向链表;隐藏内核模块的通用方法是把指定的驱动对象从 KLDR_DATA_TABLE_ENTRY中的 InLoadOrderLinks 双向链表上摘除。X原创 2017-03-26 19:32:32 · 4800 阅读 · 2 评论 -
Win64 驱动内核编程-24.64位驱动里内嵌汇编
64位驱动里内嵌汇编 讲道理64位驱动是不能直接内链汇编的,遇到这种问题,可以考虑直接把机器码拷贝到内存里,然后直接执行。获得机器码的方式,可以写好代码之后,直接通过vs看反汇编,然后根据地址在看内存内容,再把内存内容复制出来。或者是去我看的资料上的那个作者提供的一个工具:http://www.vbasm.com/thread-5651-1-1.html)直接把汇编编程机器码。原创 2017-03-26 18:19:00 · 2303 阅读 · 0 评论 -
Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook
Ring0InLineHook和UnHook如果是要在R0里hook,作者的建议是InLineHOOK,毕竟SSDTHOOK和SHADOWSSDTHOOK比较麻烦,不好修改。目前R3的InLineHOOK我比较喜欢的是MINIHOOKENGINE,但是今天要解决的是R0的InLineHOOK问题。下面说下InLineHOOK的思路:一、实现...原创 2017-03-26 18:06:44 · 5260 阅读 · 2 评论 -
Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
SHADOWSSDTHOOKHOOK和UNHOOKSHADOWSSDT跟之前的HOOK/UNHOOKSSDT类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了。一、获得wKeServiceDescriptorTableShadow的地址这个跟获得KeServi...原创 2017-03-26 11:51:05 · 4956 阅读 · 0 评论 -
Win64 驱动内核编程-21.DKOM隐藏和保护进程
DKOM隐藏和保护进程主要就是操作链表,以及修改节点内容。DKOM 隐藏进程和保护进程的本质是操作 EPROCESS 结构体,不同的系统用的时候注意查下相关定义,确定下偏移,下面的数据是以win7 64为例。关 注 两 个 成 员 : ActiveProcessLinks 和 Flag 。ActiveProcessLinks 把各个EPROCESS 结构体连接成“双向链表”,ZwQ原创 2017-03-23 23:08:09 · 13808 阅读 · 3 评论 -
Win64 驱动内核编程-20.UnHook SSDT
UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的。于是,有了以下思路:1.获得内核里 KiServiceTable 的地址(变量名称:KiServiceTable)2.获得内核文件在内核里的加载地址(变量名称:NtosBase)3.获得内核文件在 PE32+结构体里的映像基址(变量名原创 2017-03-23 00:21:18 · 1679 阅读 · 0 评论 -
Win64 驱动内核编程-19.HOOK-SSDT
HOOK SSDT 在 WIN64 上 HOOK SSDT 和 UNHOOK SSDT 在原理上跟 WIN32 没什么不同,甚至说 HOOK 和 UNHOOK 在本质上也没有不同,都是在指定的地址上填写一串数字而已(填写代理函数的地址时叫做 HOOK,填写原始函数的地址时叫做 UNHOOK)。不过实现起来还是很大不同的。一 、 HOOK SSDT 要挂钩 SSDT,必然原创 2017-03-19 15:16:11 · 4959 阅读 · 2 评论 -
Win64 驱动内核编程-18.SSDT
SSDT 学习资料:http://blog.youkuaiyun.com/zfdyq0/article/details/26515019 学习资料:WIN64内核编程基础 胡文亮 SSDT(系统服务描述表),刚开始接触什么进程保护XXX啥的,都是看到在说SSDT(虽然说目前很多杀软都已经采用稳定简单的回调姿势了)。这次就弄清楚两个问题: 如何在内核里动态获得 SSDT 的基址;原创 2017-03-19 15:05:45 · 2262 阅读 · 0 评论 -
Win64 驱动内核编程-17. MINIFILTER(文件保护)
MINIFILTER(文件保护) 使用 HOOK 来监控文件操作的方法有很多,可以在 SSDT 上 HOOK 一堆和 FILE 有关的函数,也可以对 FSD 进行 IRP HOOK,不过这些方法既不方便,也不安全。微软推荐的文件操作过滤方法是使用过滤驱动,在 VISTA 之后,推荐使用 MINIFILTER (字面翻译是迷你过滤器)。MINIFILTER 基于标准的文件过滤驱动,但是微软原创 2017-03-18 15:19:43 · 10527 阅读 · 2 评论 -
Win64 驱动内核编程-16.WFP网络监控驱动(防火墙)
WFP驱动监控网络 WFP 是微软推出来替代 TDI HOOK、NDIS HOOK 等拦截网络通信的方案,WFP 的框架非常庞大,在 RING3 和 RING0 各有一套类似的函数,令人兴奋的是,即使在 R3 使用 WFP,也可以做到全局拦截访问网络。由于 WFP 的范围太广,实在难以一言概括,感兴趣的朋友可以自行到 MSDN 上查看微软对它的官方概述。本文的目的,是给大家理顺 WFP原创 2017-03-14 23:23:31 · 11490 阅读 · 5 评论 -
Win64 驱动内核编程-15.回调监控注册表
回调监控注册表 在 WIN32 平台上,监控注册表的手段通常是 SSDT HOOK。不过用 SSDT HOOK的方式监控注册表实在是太麻烦了,要 HOOK 一大堆函数,还要处理一些 NT6 系统有而 NT5 系统没有的函数。下面我就来介绍一种完胜 SSDT HOOK 监控注册表的方法,效果跟 SSDT HOOK 一样好。这个方法就是使用微软推荐的注册表监控函数:CmRegisterC原创 2017-03-13 22:48:43 · 4839 阅读 · 0 评论 -
Win64 驱动内核编程-14.回调监控文件
回调监控文件 使用 ObRegisterCallbacks 实现保护进程,其实稍微 PATCH 下内核,这个函数还能实现文件操作监视。但可惜只能在 WIN7X64 上用。因为在 WIN7X64 上 PATCH 对象结构的成员(ObjectType->TypeInfo.SupportsObjectCallbacks)是合法的,在 WIN8X64 以及之后系统上会触发 PATCHGUARD。原创 2017-03-12 12:42:53 · 3773 阅读 · 0 评论 -
Win64 驱动内核编程-13.回调监控模块加载
回调监控模块加载 模块加载包括用户层模块(.DLL)和内核模块(.SYS)的加载。传统方法要监控这两者加在必须 HOOK 好几个函数,比如 NtCreateSection 和 NtLoadDriver等,而且这些方法还不能监控未知的驱动加载方法。其实为了监控模块加载而HOOK API 是非常傻的,因为微软已经提供了一对标准的 API 实现此功能。它们分别是 PsSetLoadIm原创 2017-03-12 00:11:23 · 4623 阅读 · 2 评论 -
Win64 驱动内核编程-12.回调监控进线程创建和退出
回调监控进线程创建和退出 两个注册回调的函数:PsSetCreateProcessNotifyRoutine 进程回调PsSetCreateThreadNotifyRoutine 线程回调分别对应的回调函数类型:VOID MyCreateProcessNotify( IN HANDLE ParentId, IN HANDLE ProcessId, IN BOOLEA原创 2017-03-12 00:06:31 · 4241 阅读 · 1 评论 -
Win64 驱动内核编程-11.回调监控进线程句柄操作
无HOOK监控进线程句柄操作 在 NT5 平台下,要监控进线程句柄的操作,通常要挂钩 3 个 API:NtOpenProcess、NtOpenThread、NtDuplicateObject。但是在 VISTA SP1 以及之后的系统中,我们可以完全抛弃 HOOK 方案了,转而使用一个标准的 API:ObRegisterCallbacks。下面做一个监视进线程句柄操作的程序,并实现保原创 2017-03-12 00:02:28 · 5203 阅读 · 2 评论 -
Win64 驱动内核编程-10.突破WIN7的PatchGuard
突破WIN7的PatchGuard WIN64 有两个内核保护机制,KPP 和 DSE。KPP 阻止我们 PATCH 内核,DSE 拦截我们加载驱动。当然 KPP 和 DSE 并不是不可战胜的,WIN7X64 出来不久,FYYRE 就发布了破解内核的工具,后来有个叫做 Feryno 的人又公开了源代码。 要实现突破 DSE 和 PatchGuard,必须修改两个文件,winlo原创 2017-03-09 00:12:39 · 3424 阅读 · 1 评论 -
Win64 驱动内核编程-9.系统调用、WOW64与兼容模式
系统调用、WOW64与兼容模式 这种东西都是偏向于概念的,我就把资料上的东西整理下粘贴过来,资料来源于胡文亮,感谢这位前辈。 WIN64 的系统调用比 WIN32 要复杂很多,原因很简单,因为 WIN64 系统可以运行两种 EXE,而且 WIN32EXE 的执行效率并不差(据我本人用 3DMARK06 实测,在一台电脑上分别安装 WIN7X86 和WIN7X64,使用同样版本的原创 2017-03-09 00:10:42 · 1739 阅读 · 0 评论 -
Win64 驱动内核编程-8.内核里的其他常用
内核里的其他常用1.遍历链表。内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖葫芦一样给串了起来。所以遍历双向链表能获得很多重要的内核数据。举个简单的例子,驱动对象 DriverObject 就是使用双向链表给串起来的,遍历这个链表就可以枚举内核里所有的驱动。示例代码如下//传入驱动自身的 DriverObjectVOID EnumDriver(PDRIVER原创 2017-03-05 17:43:11 · 1264 阅读 · 0 评论 -
Win64 驱动内核编程-7.内核里操作进程
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点。但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程相关的 NATIVE API 而已(当然了,本文所说的进程操作,还包括对线程和 DLL 模块的操作)。本文包括 10 个部分:分别是:枚举进程、暂停进程、恢复进程、结束进程、枚举线程、暂停线原创 2017-03-05 17:40:21 · 4808 阅读 · 0 评论 -
Win64 驱动内核编程-6.内核里操作注册表
内核里操作注册表RING0 操作注册表和 RING3 的区别也不大,同样是“获得句柄->执行操作->关闭句柄”的模式,同样也只能使用内核 API 不能使用 WIN32API。不过内核里有一套 RTL 函数,把 Zw系列的注册表函数进行了封装,也就是说,只剩下“执行操作”这一步了。接下来说说注册表的本质。注册表其实是文件,它存储在 c:\windows\system32\config这个原创 2017-03-04 22:55:35 · 1573 阅读 · 0 评论 -
Win64 驱动内核编程-5.内核里操作文件
内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是“获得文件句柄->读/写/删/改->关闭文件句柄”的模式。当然了,只能用内核 API,不能用 WIN32API。在讲解具体的代码之前,先讲解一下文件系统的流程,让大家对整个文件系统有个大概的了解。 假设我们要读写一个文件,无论在 RING3 调用 ReadFile,还是在 RING0 调用原创 2017-03-04 22:49:46 · 2435 阅读 · 1 评论 -
Win64 驱动内核编程-4.内核里操作字符串
内核里操作字符串字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*、WCHAR*、ANSI_STRING、UNICODE_STRING。当然,内核里使用频率最多的是 UNICODE_STRING,其次是 WCHAR*,再次是 CHAR*,而 ANSI_STRING,则几乎没见过有什么内核函数使用。原创 2017-03-04 22:42:16 · 1643 阅读 · 0 评论 -
Win64 驱动内核编程-3.内核里使用内存
内核里使用内存内存使用,无非就是申请、复制、设置、释放。在 C 语言里,它们对应的函数是:malloc、memcpy、memset、free;在内核编程里,他们分别对应 ExAllocatePool、RtlMoveMemory、RtlFillMemory、ExFreePool。它们的原型分别是: 需要注意的是,RtlFi原创 2017-03-04 22:38:43 · 4729 阅读 · 1 评论 -
Win64 驱动内核编程-2.基本框架(安装.通讯.HelloWorld)
驱动安装,通讯,Hello World开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回。驱动程序Hello World之前总结了驱动环境的搭建,这里就直接继续之前搭建好的环境创建项目,打开vs2015创建一个驱动项目:写代码之前先配置下编译选项:然原创 2017-02-26 14:04:15 · 4497 阅读 · 3 评论 -
Win64 驱动内核编程-1.环境搭建
驱动开发环境及其双机调试环境搭建开发环境搭建使用工具: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配置更新里安装。控制面板-原创 2017-02-26 13:53:27 · 4481 阅读 · 2 评论