自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LyShark

Copyright © LyShark All rights reserved.

  • 博客(794)
  • 收藏
  • 关注

原创 驱动开发:内核解析内存四级页表

当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了。这段代码完整版如下所示,代码可动态定位到PTE的内存地址,然后将其取出;运行如上代码可动态获取到当前系统的PTE地址,然后将PTE填入到。中,即可实现解析系统内的四个标志位,完整解析代码如下所示;字节,PTE结构的解析非常容易,打开WinDBG输入。即可解析,如下所示,当前地址0位置处的PTE基址是。由于PTE是动态变化的,找到该地址的关键就在于通过。,由于PTE的一个页大小是。

2023-05-29 08:58:47 157

原创 驱动开发:内核实现进程汇编与反汇编

简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用。Capstone旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎,该引擎支持多种平台的反汇编,非常推荐使用。首先是实现驱动部分,驱动程序的实现是一成不变的,仅仅只是做一个读写功能即可,完整的代码如下所示;反汇编函数,该函数的解释如下所示;

2023-05-23 14:56:42 402 2

原创 驱动开发:通过应用堆实现多次通信

的方式灵活的实现了内核态多次输出结构体的效果,但是此种方法并不推荐大家使用原因很简单首先内核空间比较宝贵,其次内核里面不能分配太大且每次传出的结构体最大不能超过。与MDL映射相反,MDL多数处理流程在内核代码中,而应用层开堆复杂代码则在应用层,但内核层中同样还是需要使用指针,只是这里的指针仅仅只是保留基本要素即可,通过。个,而最终这些内存由于无法得到更好的释放从而导致坏堆的产生,这样的程序显然是无法在生产环境中使用的,如下。回传给应用层,至此内核中仅仅回传了一个长度,其他的都写入到了应用层中。

2023-05-19 10:55:28 283

原创 驱动开发:内核远程堆分配与销毁

在开始学习内核内存读写篇之前,我们先来实现一个简单的内存分配销毁堆的功能,在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间,一般而言内核中提供了。则用于指定需要分配的内存空间大小,此参数的初始值指定区域的大小(以字节为单位)并向上舍入到下一个主机页大小边界。此函数则用于销毁堆内存,当我们需要分配内核空间时往往需要切换到对端进程栈上再进行操作,接下来。则用于接收分配堆地址的首地址,此处指向将接收已分配页面区域基址的变量的指针。在对特定进程分配堆时第一步就是要切入到该进程的进程栈中,此时可通过。

2023-05-15 09:20:45 196 3

原创 驱动开发:通过MDL映射实现多次通信

在前几篇文章中`LyShark`通过多种方式实现了驱动程序与应用层之间的通信,这其中就包括了通过运用`SystemBuf`缓冲区通信,运用`ReadFile`读写通信,运用`PIPE`管道通信,以及运用`ASYNC`反向通信,这些通信方式在应对`一收一发`模式的时候效率极高,但往往我们需要实现一次性吐出多种数据,例如ARK工具中当我们枚举内核模块时,往往应用层例程中可以返回几条甚至是几十条结果,如下案例所示,这对于开发一款ARK反内核工具是必须要有的功能。

2023-04-29 15:12:35 574 10

原创 驱动开发:内核使用IO/DPC定时器

本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔,微秒级别间隔,就需要用到DPC定时器,如果是秒级定时其两者基本上无任何差异,本章将简单介绍。编译并运行这段程序,会发现其运行后的定时效果与IO定时器并无太大区别,但是DPC可以控制更精细,通过。函数对定时器进行初始化,但需要注意的是此函数每个设备对象只能调用一次,当初始化完成后用户可调用。

2023-04-04 11:19:16 395 5

原创 驱动开发:探索DRIVER_OBJECT驱动对象

本章将探索驱动程序开发的基础部分,了解驱动对象`DRIVER_OBJECT`结构体的定义,一般来说驱动程序`DriverEntry`入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些详细参数,例如驱动大小,驱动标志,驱动名,驱动节等等,每一个驱动程序都会存在这样的一个结构。

2023-04-03 20:36:53 282 1

原创 驱动开发:配置Visual Studio驱动开发环境

在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的安装包,的安装非常的简单,您只需要按照提示全部选择默认参数即可,根据机器配置不同可能需要等待一段时间;

2023-03-13 14:32:00 529 6

原创 驱动开发:内核封装TDI网络通信接口

已经带大家看过了如何通过WSK接口实现套接字通信,但WSK实现的通信是内核与内核模块之间的,而如果需要内核与应用层之间通信则使用TDK会更好一些因为它更接近应用层,本章将使用TDK实现,TDI全称传输驱动接口,其主要负责连接。更接近于应用层,在早期Win系统中常用于实现过滤防火墙,同样经过封装后也可实现通信功能,本章将运用TDI接口实现驱动与应用层之间传输字符串,结构体,多线程收发等技术。运行应用层服务端,并运行驱动程序,则会验证该驱动是否合法,如果合法则加载不合法则拒绝;再来是驱动层代码,如下所示;

2022-11-03 09:47:50 475 5

原创 驱动开发:内核封装WSK网络通信接口

头文件,该文件中封装了WSK通信API接口,其封装格式与应用层接口保持了高度一致,当需要在内核中使用Socket通信时可直接引入本文件。来说,驱动通信必须保证服务端开启多线程来处理异步请求,不然驱动加载后系统会处于等待状态,而一旦等待则系统将会卡死,那么对于服务端。并不推荐使用,因为微软已经对接口搁置了,为了使WSK通信更加易用,我们需要封装内核层中的通信API,新建。通信接口,我们对WSK进行封装,让其与应用层调用规范保持一致,并实现内核与内核直接通过。配置好以后,我们就开始吧,先来看看服务端如何实现!

2022-11-03 09:37:50 335

原创 驱动开发:内核层InlineHook挂钩函数

在上一章中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩其实与应用层一致,都是使用劫持执行流并跳转到我们自己的函数上来做处理,唯一的不同的是内核Hook只针对内核API函数,但由于其身处在最底层所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的,对于安全从业者来说学会使用内核挂钩也是很重要。挂钩的原理可以总结为,通过得到原函数地址,然后保存该函数的前15。

2022-10-31 17:11:55 679

原创 驱动开发:内核LDE64引擎计算汇编长度

本章开始将介绍如何在内核中实现挂钩这门技术,内核挂钩的第一步需要实现一个动态计算汇编指令长度的功能,该功能可以使用这个反汇编引擎,该引擎小巧简单可以直接在驱动中使用,LDE引擎是引擎的一部分,后来让打包成了一个代码,并可以通过动态指针的方式直接调用功能,本章内容作为后期挂钩的铺垫部分,独立出来也是因为代码太多太占空间一篇文章写下来或很长影响阅读。首先定义一个头文件,并写入如下代码片段,当然这不是最新的,如果你需要最新的可以自己下载源代码编译后提取出来替换即可,不过该引擎很多年没有更新了替换的意义也不大毕竟功

2022-10-31 11:04:09 434

原创 驱动开发:内核强制结束进程运行

内核态,但有时我们不得不想办法结束掉这些特殊的进程,当然某些正常进程在特殊状态下也会无法被正常结束,此时使用驱动前行在内核态将其结束掉就变得很有用了,驱动结束进程有多种方法。存在时则可以看到结束效果,当然这种方式只是在内核层面调用了结束进程函数,其本质上还是正常结束,只是这种方式权限要大一些仅此而已。没有被导出,所以我们需要动态的这个内存地址,然后动态调用即可,这个寻找方法可以总结为以下步骤。第二种方法,其原理就是将进程内的线程全部结束掉从而让进程自动结束,由于。首先是第一种方法结束进程,封装实现。

2022-10-29 10:17:25 950 6

原创 驱动开发:内核监控FileObject文件回调

以此来实现对文件的监控,文件过滤驱动不仅仅可以用来监控文件的打开,还可以用它实现对文件的保护,一旦驱动加载则文件是不可被删除和改动的。开关,并定义一些微软结构,如下是我们所需要的公开结构体,可在微软官方或WinDBG中获取到最新的,将其保存为。运行这个驱动程序,当系统中有新文件被加载时则自动输出该文件所属进程PID以及该文件的详细路径。属性的驱动来说自然就支持文件路径转换,当系统中有文件被加载则自动执行。与进程线程回调有少许的不同,文件回调需要开启驱动的。文章中使用的方法是一致的,首先判断。

2022-10-28 09:08:20 479

原创 驱动开发:内核监控Register注册表回调

中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核API的前提下实现对注册表增加,删除,创建等事件的有效监控,注册表监视通常会通过。其中对于注册表最常用的监控项为以下几种类型,当然为了实现监控则我们必须要使用之前,如果使用之后则只能起到监视而无法做到监控的目的。需传入三个参数,参数一回调函数地址,参数二空余,参数三回调句柄,微软定义如下。,那么只有当注册表被创建才会拦截,此时就会变成拦截创建。

2022-10-27 10:56:43 750

原创 驱动开发:内核运用LoadImage屏蔽驱动

强制返回的方法意外,屏蔽驱动加载还可以使用另一种方式实现禁用模块加载,例如当驱动被加载首先回调函数内可以接收到,当接收到以后直接调用。我们看下驱动加载器,提示的信息是拒绝访问,因为这个驱动其实是加载了的,只是入口处被填充了返回而已。加载这段驱动程序,当有DLL文件被加载后,则会强制弹出,从而实现屏蔽模块加载的作用。无法实现参数控制,而如果我们想要控制特定驱动的加载则需要自己做一些事情来实现,如下。节点,该节点里面就是被加载驱动入口,通过汇编在驱动头部写入。返回指令,即可实现屏蔽加载特定驱动文件。

2022-10-26 14:24:18 378

原创 驱动开发:内核监视LoadImage映像回调

映像监视,当有模块被系统加载时则可以第一时间获取到加载模块信息,需要注意的是该回调函数内无法进行拦截,如需要拦截则需写入返回指令这部分内容将在下一章进行讲解,本章将主要实现对模块的监视功能。监视模块加载与卸载需要费别使用两个函数,这两个函数的参数传递都是自己的回调地址。那么如何实现监视映像加载呢,来看如下完整代码片段,首先。运行这个驱动程序,则会输出被加载的驱动详细参数。将带大家继续探索一个新的回调注册函数,注册回调,当有模块被加载则自动执行。得出是什么类型的模块,然后再通过。回调,并通过该回调实现了。

2022-10-25 07:59:48 213

原创 驱动开发:内核无痕隐藏自身分析

在笔者前面有一篇文章通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。那么如何找到函数入口地址就是下一步的目标,寻找入口可以总结为;搜索可定位到地址。搜索定位到即得到了我们想要的。根据前面枚举篇系列文章,定位这段特征很容易实现,如下是一段参考代码。

2022-10-24 19:54:52 3279 1

原创 驱动开发:内核注册并监控对象回调

在笔者上一篇文章简单介绍了如何枚举系统中已经存在的进程与线程回调,本章LyShark将通过对象回调实现对进程线程的句柄监控,在内核中提供了回调,使用这个内核回调函数,可注册一个对象回调,不过目前该函数只能监控进程与线程句柄操作,通过监控进程或线程句柄,可实现保护指定进程线程不被终止的目的。由于目前对象回调只能监控进程与线程,而这个监控是通过ObjectType这么一个成员控制的,如果成员是则代表监控进程,反之则是监控线程,无论监控进程还是线程都调用这个函数来完成注册。函数。

2022-10-24 09:08:03 868

原创 驱动开发:内核监控进程与线程回调

系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。那么会提示连接的设备没有发挥作用,我们则成功拦截了这次打开,当然如果在打开进程之前扫描其特征并根据特征拒绝进程打开,那么就可以实现一个简单的防病毒程序,进程监控在防病毒程序中也是用的最多的。如上,该函数只有两个参数,第一个参数是回调函数,第二个参数是是否注销,通常在驱动退出时可以传入。

2022-10-23 11:04:00 435

原创 驱动开发:内核测试模式过DSE签名

该保护机制的核心就是任何驱动程序或者是第三方驱动如果想要在正常模式下被加载则必须要经过微软的认证,当驱动程序被加载到内存时会验证签名的正确性,如果签名不正常则系统会拒绝运行驱动,这种机制也被称为驱动强制签名,该机制的作用是保护系统免受恶意软件的破坏,是提高系统安全性的一种手段。在Windows操作系统中,为了保护系统安全性,有一个叫做驱动程序签名验证的机制,它的作用是验证驱动程序是否来自受信任的发行者(也就是签名)。置位,则在调试模式下就不会在验证签名了,省去了重复签名的麻烦。保护机制,DSE全称。

2022-10-22 21:40:51 301

原创 驱动开发:内核枚举进程与线程ObCall回调

首先我们需要定义好结构体,结构体是微软公开的,如果有其它需要请自行去微软官方去查。线程回调,之所以放在一起来讲解是因为这两中回调在枚举是都需要使用通用结构体。中我们通过特征码定位实现了对注册表回调的枚举,本篇文章。的枚举,如果是想要输出线程句柄,则只需要替换代码中的。就可以拿到链表头结构,得到后将其解析为。代码部分的实现很容易,由于进程与。所以放在一起来讲解最好不过。运行这段驱动程序,即可得到。运行这段驱动程序,即可得到。将教大家如何枚举系统中的。即可,修改后的代码如下。的枚举很容易,直接通过。

2022-10-22 09:51:42 623

原创 驱动开发:内核枚举Registry注册表回调

函数基址,然后在该函数起始位置向下搜索,找到这个链表节点,并将其后面的基地址取出来,在上一篇。得到了注册表回调入口地址,接着直接循环遍历输出这个链表即可得到所有的注册表回调。目前系统中有两个回调函数,这一点在第一张图片中也可以得到,枚举是正确的。注册表系统回调的枚举需要通过特征码搜索来实现,首先我们可以定位到。文章中已经介绍了定位方式此处跳过介绍,具体实现代码如下。即可得到数据,如果要遍历下一个链表则只需要。要想得到此处的链表地址,需要先通过。链表节点,取出这个链表地址。注册表通知消息的枚举,与。

2022-10-21 12:54:39 794

原创 驱动开发:内核枚举LoadImage映像回调

映像加载通告回调,当有新驱动或者DLL被加载时,回调函数就会被调用从而执行我们自己的回调例程,映像回调也存储在数组里,枚举时从数组中读取值之后,需要进行位运算解密得到地址。目前系统中只有两个回调,所以枚举出来的只有两条,打开ARK验证一下会发现完全正确,忽略。中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核。如上所述,如果我们需要拿到回调数组那么首先要得到该数组,数组的符号名是。增加解密代码以后,这段程序的完整代码也就可以被写出来了,如下所示。首先定位到,能够找到。

2022-10-20 19:11:34 315

原创 驱动开发:内核枚举ShadowSSDT基址

注这一步必须要在GUI线程中执行,否则会异常,建议将枚举过程写成DLL文件,注入到。特征即可,如果你找不到上一篇具体分析流程了,那么多半你是看到了转载文章。文章中的分析可知,SSSDT就在SSDT的下面,只需要枚举。在此基础之上增加枚举计算过程即可,完整源代码如下所示。,SSSDT其主要的作用是管理系统中的图形化界面,其。驱动,属于GUI线程的一部分,其自身没有导出表,枚举。则是下一个元素与上一个元素的偏移。表基地址,以及该表中函数个数。表的枚举功能,本章继续实现对。函数个数,完整代码如下所示。

2022-10-20 08:52:25 388

原创 驱动开发:Win10枚举完整SSDT地址表

在WinDBG中可看到完整的输出内容,当然有些函数没有被导出,起源地址是拿不到的。函数顺便把当前地址拿到,并通过循环方式得到完整的SSDT列表。根据上一章节的内容扩展,枚举完整SSDT表我们可以这样来实现。我们运行这段程序,即可得到整个系统中所有的SSDT表地址信息;得到当前地址很容易实现,只需要将函数名字符串通过。表基地址了,找到后我们可根据序号获取到指定。表信息,则可以定义字符串列表,以此循环调用。函数得到,当然在此之间也可以调用系统提供的。函数的原始地址,而如果需要输出所有。中已经教大家如何寻找。

2022-10-19 14:03:37 233

原创 驱动开发:Win10内核枚举SSDT表基址

系统已经覆盖了大多数个人PC终端,以前的方法也该进行迭代更新了,或许在网上你能够找到类似的文章,但我可以百分百肯定都不能用,今天。这个函数,由于该函数没有被导出,所以只能动态的查找它的地址,庆幸的是我们可以通过查找。如上代码中所提及的步骤我想不需要再做解释了,这段代码运行后即可输出SSDT表的基址。有了解密公式以后代码的编写就变得很容易,如下是读取SSDT的完整代码。的地址后,就能得到每个服务函数的地址。你也可以打开ARK工具,对比一下是否一致,如下图所示,表中文为系统服务描述符表,SSDT表的。

2022-10-19 10:48:11 297 2

原创 驱动开发:内核特征码扫描PE代码段

如上述所示定位函数我们已经封装好了,相信你也能感受到这种方式要比使用数组更方便,为了能定位到内核PE结构我们需要使用。既然能够得到PE头部数据了,那么我们只需要扫描这段空间并得到匹配到的数据即可,其实很容易实现,如下代码所示。头文件,该头文件中包含了我们本篇文章所必须要使用到的结构体定义,这些定义的函数如果不懂请去看。来解析,这个内核函数专门用来得到内核程序的PE头部结构的,在下方案例中首先我们使用封装过的。将对特征码定位进行简化,让定位变得更简单,并运用定位代码实现扫描内核PE的。

2022-10-18 16:59:39 421

原创 驱动开发:内核枚举Minifilter微过滤驱动

文件过滤驱动来说,微过滤驱动编写时更简单,其不需要考虑底层RIP如何派发且无需要考虑兼容性问题,微过滤驱动使用过滤管理器。则默认是输出当前系统中存在的过滤器数量,而如果传入的是一个内存地址,则将会枚举系统中所有的过滤器信息。提供接口,由于提供了管理结构以及一系列管理API函数,所以枚举过滤驱动将变得十分容易。函数,所以只需要调用这些函数即可获取到所有的过滤器地址,我们看下微软公开的信息。的地址,然后根据过滤器对象的地址,加上一个偏移,获得记录过滤器。中的定义以下样子,这里我们需要记下。

2022-10-18 09:15:47 472

原创 驱动开发:内核特征码搜索函数封装

集,总体来说这种方式只能定位特征较小的指令如果特征值扩展到5位以上那么就需要写很多无用的代码,本章内容中将重点分析,并实现一个。链表头部地址为案例进行讲解,如果你忘记了如何寻找链表头部可以去前面的文章中学习,这里只给出实现流程。如上图可以看到,这个特征码定位函数返回的是内存地址,而我们需要得到地址内的数据,此时就需要提取以下。如下是一段特征码搜索片段,可以看到其实仅仅只是将上章中的搜索方式变成了一个。以及搜索特征码的字节数组,即可完成搜索工作,具体的参数定义如下。函数,如下函数,用户传入一个。

2022-10-17 11:40:51 356

原创 驱动开发:内核枚举驱动内线程(答疑篇)

首先因为我的人生经历比较特殊,我经历过无法求知的困境,深知一个人在没有任何人指点的情况下去研究技术是多么的折磨人,所以在某些情况下只要你关注了我,我也会尽自己最大可能去帮助大家,即便是当时没有解决这个问题我也会记下来,只要能被解决我一定会第一时间告诉粉丝,但也希望大家不要遇到困难关注我,解决困难取消关注,这样我觉得很不地道。我不知道别人的ARK工具是怎么实现的,但是我目前能想到的办法只能是这一种笨办法,两者作比较相差在一个误差以内就说明是进程内的子线程。,再从里面找进程名,但跟到最后你会发现它显示的是。

2022-10-17 08:47:02 341

原创 驱动开发:内核枚举PspCidTable句柄表

在上一篇文章中我们通过枚举特征码的方式找到了DPC定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找Windows 10系统下面的内核句柄表地址。首先引入一段基础概念;windowsPspCidTable 就是这样的一种表(内核句柄表),表的内部存放的是进程EPROCESS和线程ETHREAD的内核对象,并通过进程PID和线程TID进行索引,ID号以4递增,内核句柄表不属于任何进程,也不连接在系统的句柄表上,通过它可以返回系统的任何对象。

2022-10-16 16:06:03 436

原创 驱动开发:内核枚举DpcTimer定时器

也就是IO定时器的队列头,本章学习的枚举DPC定时器依然使用特征码扫描,唯一不同的是在新版系统中DPC是被异或加密的,想要找到正确的地址,只是需要在找到DPC表头时进行解密操作即可。中就是DPC加密细节,如果需要解密只需要逆操作即可,此处我就具体分析下加密细节,分析这个东西我建议你使用记事本带着色的。最终运行枚举程序,你将会看到系统中所有的定时器,与ARK工具对比是一致的。接着将这些功能通过代码实现,首先得到我们需要的函数地址,这些地址包括。分析思路是这样的,首先这里要传入待加密的DPC数据,然后经过。

2022-10-16 04:54:08 453

原创 驱动开发:WinDBG 配置内核双机调试

它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大,WinDBG由于是微软的产品所以能够调试。6.至此我们还需要加载符号,在命令行下依次执行以下命令,配置好符号加载并启动系统。命令,可以查看到系统的当前启动项,如果是新的系统,则只会有。的根目录下,并执行以下命令,即可连接虚拟机串口进行调试了。连续执行下方的三条命令,依次建立启动项,并激活调试模式。平台下,强大的用户态和内核态调试工具,相比较于。4.配置完成后,重新启动系统,在开机的时候选择。

2022-10-15 12:47:33 578

原创 驱动开发:挂接SSDT内核钩子

SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。

2022-10-15 12:46:53 218

原创 驱动开发:恢复SSDT内核钩子

SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的。通过前面的学习我们已经可以编写一个驱动程序并挂钩到指定的内核函数上了,接下来我们将一步步的通过编写驱动程序,手动的来解除。

2022-10-15 12:45:49 145

原创 驱动开发:驱动与应用的简单通信

驱动程序与应用程序的通信离不开派遣函数,派遣函数是Windows驱动编程中的重要概念,一般情况下驱动程序负责处理I/O特权请求,而大部分IO的处理请求是在派遣函数中处理的,当用户请求数据时,操作系统会提前处理好请求,并将其派遣到指定的内核函数中执行,接下来将详细说明派遣函数的使用并通过派遣函数读取Shadow SSDT中的内容。注册两个派遣函数,当设备创建的时候触发,以及关闭时触发。实现读取内核缓冲区中的数据,并打印出来。

2022-10-15 12:44:15 154

原创 驱动开发:内核读取SSDT表基址

为了确保系统的安全性与稳定性,微软从 Windows Vista X64 开始对系统内核增加了一定的限制,其主要增加了两种保护措施,一是KPP (内核补丁保护),KPP是机制其利用了PG(PatchGuard)技术,PG技术在x64系统下加入了内核哨兵,用于检测系统内核是否被恶意篡改(打补丁),如果发现被打了补丁,则会导致关键结构损毁直接蓝屏,二是DSE (驱动强制签名),DSE技术则是拒绝加载不包含正确签名的驱动。这个被导出的表结构从而可以直接读取到SSDT表的基址,而在Win64系统中。

2022-10-15 12:43:22 137

原创 驱动开发:内核中枚举进线程与模块

的结构记录它的详细信息,其中就包括进程名,PID,PPID,进程路径等,通常在应用层枚举进程只列出所有进程的编号即可,不过在内核层需要把它的 EPROCESS 地址给列举出来。这个未公开的函数,它能最大的好处是能得到进程的EPROCESS地址,由于是未公开的函数,所以我们需要变相的调用这个函数,通过。这个未公开的函数,它能最大的好处是能得到进程的EPROCESS地址,由于是未公开的函数,所以我们需要变相的调用这个函数,通过。进程就是活动起来的程序,每一个进程在内核里,都有一个名为。

2022-10-14 13:15:37 802

原创 驱动开发:对象回调监控文件访问

无论在用户层还是内核层,操作文件的流程基本一致,除了在API函数上的区别(用户层调用用户层API,内核层调用内核API)以外其他基本一致,先讲解一下文件系统执行的流程。实现文件的监控呢,比如当文件被访问时自动触发回调,看如下代码实现方式。那么如何实现文件的监控呢,比如当文件被访问时自动触发回调,看如下代码实现方式。

2022-10-14 13:14:42 130

Visual C# 常用开发类库代码

Visual C# 常用开发类库代码

2023-05-29

Visual C# 硬件读写代码

Visual C# 硬件读写代码

2023-05-29

Visual C# 加密解密代码

Visual C# 加密解密代码

2023-05-29

Visual C# 数据库操作代码

Visual C# 数据库操作代码

2023-05-29

Visual C# 网络操作代码

Visual C# 网络操作代码

2023-05-29

Visual C# 文件处理代码

Visual C# 文件处理代码

2023-05-29

Visual C# 系统操作代码

Visual C# 系统操作代码

2023-05-29

Visual C# 报表打印代码

Visual C# 报表打印代码

2023-05-29

Visual C# 图像操作代码

Visual C# 图像操作代码

2023-05-29

Visual C# 控件操作代码

Visual C# 控件操作代码

2023-05-29

Visual C# 窗体技巧代码

Visual C# 窗体技巧代码

2023-05-29

Qt Tutorial 课件

Qt Tutorial 课件

2023-04-16

C#版本精益模块类库源码

精易模块是一款易语言模块。是精易论坛发布的易语言模块,内置大量简化功能,让易语言编程更傻瓜化,内含上百种命令,有不少易语言新人会选择使用,为提高开发程序的效率为目的。命令命名格式统一,方便调用查找。

2023-03-31

Layer子域名挖掘机4.2纪念版源码

Layer子域名挖掘机4.2纪念版源码

2023-03-31

软件逆向分析系列教程课件

该文件是《软件逆向分析系列教程》系列课程源代码课件,下载后解压即可得到文件。

2023-01-07

Qt 窗体开发从入门到精通课件

该文件是《Qt 窗体开发从入门到精通》系列课程源代码课件,下载后解压即可得到文件。

2023-01-07

《C++ 黑客之反汇编揭秘总结》

本笔记总结了C/C++各种语法规则的实现细节,通过反汇编代码来理解编译器的编译行为,从而更好地理解编程语言的本质,开阔自己的思维,下面的案例将使用VS2013 Express版本的编译器进行编译.

2023-01-07

《JavaScript 前端知识总结》

Java Script 是基于对象的脚本语言,而不是面向对象中所使用的那个对象,之所以说JS是一门基于对象的编程语言,是因为它没有提供抽象,继承,封装等面向对象语言的很多功能,而是把其他语言所创建的复杂对象统一起来,从而形成一个非常强大的对象系统. 该系列笔记是本人在学习JavaScript时自己整理的重点笔记,其目的是能够在未来的工作中能够快速查缺补漏,毕竟读书的效率远没有笔记查起来效率高。

2023-01-07

《Linux 服务配置技术实践》

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特· 托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、 多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支 持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系 统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。 该系列是本人在学习Linux系统下的常用服务搭建时总结的笔记,笔记中包括了,DNS,DHCP,VSFTP,Samba,NFS,PostFix,iSCSI,Rsync,Web常用服务的搭建流程,笔者在这里做了一个全面的总结,目的是在生产环境中能够快速的搭建起需要各种基础服务,能够高效工作,毕竟读书的效率远没有笔记查起来效率高。

2023-01-07

《MySQL 数据库技术实践》

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (RelationalDatabase Management System,关系数据库管理系统) 应用软件之一。 该系列笔记是本人在学习MySQL数据库时自己整理的重点笔记,其目的是能够在未来的工作中能够快速查缺补漏,毕竟读书的效率远没有笔记查起来效率高。

2023-01-06

《Linux 系统运维技术实践》

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特· 托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、 多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支 持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系 统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。 该系列笔记是本人在学习Linux系统管理时自己整理的重点笔记,其目的是能够在未来的工作中能够快速 查缺补漏,毕竟读书的效率远没有笔记查起来效率高。

2023-01-06

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除