LyShark

信息安全知识分享平台

驱动程序与应用程序的通信离不开派遣函数,派遣函数是Windows驱动编程中的重要概念,一般情况下驱动程序负责处理I/O特权请求,而大部分IO的处理请求是在派遣函数中处理的,当用户请求数据时,操作系统会提前处理好请求,并将其派遣到指定的内核函数中执行,接下来将详细说明派遣函数的使用并通过派遣函数读取ShadowSSDT中的内容。

阅读全文 »

本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔,微秒级别间隔,就需要用到DPC定时器,如果是秒级定时其两者基本上无任何差异,本章将简单介绍`IO/DPC`这两种定时器的使用技巧。

阅读全文 »

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

阅读全文 »

在上一篇文章`《驱动开发内核字符串转换方法》`中简单介绍了内核是如何使用字符串以及字符串之间的转换方法,本章将继续探索字符串的拷贝与比较,与应用层不同内核字符串拷贝与比较也需要使用内核专用的API函数,字符串的拷贝往往伴随有内核内存分配,我们将首先简单介绍内核如何分配堆空间,然后再以此为契机简介字符串的拷贝与比较。

阅读全文 »

在内核编程中字符串有两种格式`ANSI_STRING`与`UNICODE_STRING`,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下`ANSI_STRING`代表的类型是`char`也就是ANSI多字节模式的字符串,而`UNICODE_STRING`则代表的是`wchar`也就是UNCODE类型的字符,如下文章将介绍这两种字符格式在内核中是如何转换的。

阅读全文 »

提到自旋锁那就必须要说链表,在上一篇`《驱动开发内核中的链表与结构体》`文章中简单实用链表结构来存储进程信息列表,相信读者应该已经理解了内核链表的基本使用,本篇文章将讲解自旋锁的简单应用,自旋锁是为了解决内核链表读写时存在线程同步问题,解决多线程同步问题必须要用锁,通常使用自旋锁,自旋锁是内核中提供的一种高IRQL锁,用同步以及独占的方式访问某个资源。

阅读全文 »

在`Windows`内核中,为了实现高效的数据结构操作,通常会使用链表和结构体相结合的方式进行数据存储和操作。内核提供了一个专门用于链表操作的数据结构`LIST_ENTRY`,可以用来描述一个链表中的每一个节点。使用链表来存储结构体时,需要在结构体中嵌入一个`LIST_ENTRY`类型的成员变量,用来连接相邻的节点。通过一些列链表操作函数,如`InitializeListHead、InsertHeadList、InsertTailList、RemoveEntryList`等,可以对链表中的结构体进行插入、删除、遍历等操作。

阅读全文 »

微软在`x64`系统中推出了`DSE`保护机制,DSE全称`(DriverSignatureEnforcement)`,该保护机制的核心就是任何驱动程序或者是第三方驱动如果想要在正常模式下被加载则必须要经过微软的认证,当驱动程序被加载到内存时会验证签名的正确性,如果签名不正常则系统会拒绝运行驱动,这种机制也被称为驱动强制签名,该机制的作用是保护系统免受恶意软件的破坏,是提高系统安全性的一种手段。

阅读全文 »

WinDBG是在`windows`平台下,强大的用户态和内核态调试工具,相比较于`VisualStudio`它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大,WinDBG由于是微软的产品所以能够调试`Windows`系统的内核,另外一个用途是可以用来分析`dump`数据,本笔记用于记录如何开启`Windows`系统内核调试功能,并使用`WinDBG`调试驱动。

阅读全文 »