摘要:写博客整理记录一下IRP相关的知识点,加深一下印象。 所有的I/O请求都是以IRP的形式提交的。当I/O管理器为了响应某个线程调用的的I/O API的时候,就会构造一个IRP,用于在I/O系统处理这个请求的过程中代表该请求。 0x01 IRP与IO_STACK_LOCATION的结构体概览 IRP由
阅读全文
摘要:0x01 思路(原理) 驱动层文件保护的思路是通过minifilter过滤文件删除相关的IRP,并将目标文件与被保护文件相比较,命中保护规则的话返回STATUS_ACCESS_DENIED拒绝访问;也可以进一步利用回调函数获取的FLT_CALLBACK_DATA结构体解析文件删除操作对应的发起者进程
阅读全文
摘要:创建对象的三大步骤: 1.通过ObCreateObject函数创建目标对象。 2.目标对象本身的初始化 3.通过ObInsertObject将目标对象插入对象目录和句柄表,并返回句柄。 ObCreateObject函数用来创建一个指定类型的内核对象。 其实真正的工作函数是ObpAllocateObj
阅读全文
摘要:0x01 对象 在计算机中,“对象”是个专有名词,其定义是“一个或一组数据结构及定义在其上的操作” 。 对于几乎所有的内核对象,windows都提供一个统一的操作模式,就是先通过系统调用打开或创建目标对象,让当前进程与目标对象之间建立起连接,然后再通过别的系统调用进行操作,最后通过系统调用关闭对象。
阅读全文
摘要:0x01 句柄,句柄表概念 任意进程,只要每打开一个对象,就会获得一个句柄,这个句柄用来标志对某个对象的一次打开,通过句柄,可以直接找到对应的内核对象。句柄本身是进程的句柄表中的一个结构体,用来描述一次打开操作。句柄值则可以简单看做句柄表中的索引,并不影响理解。HANDLE的值可以简单的看做一个整形
阅读全文
摘要:大二时候的代码以及笔记,当时暂时记录在QQ上在,现在发出来分享一下。 为了写驱动装一大堆的软件插件啥的,还常常失败。这里就顺带总结下SDK下载和WinDbg symbol路径设置正确WinDbg却总是无法找到symbol文件的问题。(当然我的失败解决或者说问题原因的解决不是屡试不爽的,这里仅供您参考
阅读全文
摘要:文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求。换句话说,除了正常的Dispatch Functions 之外,你还得为DriverObject 撰写另一组Fast Io Functions.这组函数的指针
阅读全文
摘要:0x01 驱动对象: 一个驱动对象代表了一个驱动程序。或者说一个内核模块。下面有一些域用省略号代替。 这里可以看到三个重要的成员:设备对象,快速IO分发函数,以及普通分发函数 typedef struct _DRIVER_OBJECT { // 结构的类型和大小。 CSHORT Type; CSHO
阅读全文
摘要:暑假刚开始的时候,参照《寒江独钓》这本书,用VS2015写过的一个minifilter的框架,今天在博客上分享出来。 VS2015已经有了minifilter的框架模板,直接生成了minifilter的基本结构,使用非常方便: 另外需要一提的是,直接生成的inf文件中,需要把inf文件中的 Inst
阅读全文
摘要:通过spin lock自旋锁 ,为每个链表都定义并初始化一个锁,在需要向该链表插入或移除节点时不使用前面介绍的普通函数,而是使用如下方法: ExInterlockedInsertHeadList(&linkListHead, &pData->ListEntry, &spin_lock); //ExI
阅读全文
摘要:转载请您注明出处: http://www.cnblogs.com/lsh123/p/7400625.html 0x01 自旋锁简介 自旋锁也是一种同步机制,它能保证某个资源只能被一个线程所拥有,这种保护被形象地称做“上锁”。它可以用于驱动程序中的同步处理。初始化自旋锁时,处理解锁状态,这时它可以被程
阅读全文
摘要:频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存。DDK提供了Lookaside结构来解决这个问题。可以将Lookaside结构想象成一个内存容器。在初始的时候,它先向Windows申请了比较大的内存。以后每次申请内存的时候,不是直接向Windows申请内存,而是向Lo
阅读全文
摘要:DDK提供了两种链表的数据结构,双向链表和单向链表,其定义如下: typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY,*PLIST_ENTRY; typedef
阅读全文
摘要:UNICODE_STRING结构: typedef struct _UNICODE_STRING { USHORT Length; //字节长度,不包括终止符“NULL” USHORT MaximumLength; //字符串所能占的最大字节数字符串的指针 PWCH Buffer; //字符串的地址
阅读全文
摘要:一.用户模式互斥体 创建互斥体: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // pointer to security attributes BOOL bInitialOwner, //始化时是否被占有 LPCTSTR
阅读全文
摘要:转载请您注明出处:http://www.cnblogs.com/lsh123/p/7358702.html 一.驱动程序与驱动程序的事件交互 IoCreateNotificationEvent ———> IoCreateNotificationEvent 在内核驱动中可以通过给某个内核对象创建一个命
阅读全文
摘要:内核函数PsCreateSystemThread负责创建新线程。该函数可以创建两种线程,一种是用户线程,它属于当前进程中的线程。另一种是系统线程,系统线程不属于当前用户进程,而是属于系统进程,一般PID为4,名字为“System”的进程。 在内核模式下创建的线程是无法自动退出的,必须使用PsTerm
阅读全文
摘要:之前写过一篇关于通过DeviceIoControl函数来使应用程序与驱动程序通信的博客,这次再通过这个完整的代码来简要疏通总结一下。 这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_
阅读全文
摘要:PspCidTable存放着系统中所有的进程和线程对象,其索引也就是进程ID(PID)或线程ID(TID).先通过它来看看windbg里的HANDLE_TABLE结构: 可以看到地址 0x83f41bc4中存放的内容是 0x 8da010a8,这是系统的_HANDLE_TABLE的结构。 好了,现在
阅读全文
摘要:“进程内存管理器”这个程序实现的最基本功能也就是对内存的读写,之前的两篇文章也就是做的一个铺垫,介绍了内核模式切换和IoDeviceControl函数进行的应用程序与驱动程序通信的问题。接下来就进入正题了,对于内存查询,读写问题。 先来总结一下windows内存体系结构,这部分的学习主要是参照《wi
阅读全文