初探IRP(代码&程序演示)
由于篇幅太长了,一篇没法装下,所以程序的完整代码和程序演示放到这篇来。程序演示部分需要结合前一篇文章一起看。这里不再赘述具体过程。
完整代码Ring3部分c123456789101112131415161718192021222324252627282930313233343536373839404 ...
初探IRP(原理&程序思路)
通过前一篇文章的学习了解到IRP是Windows系统中用于表达一个I/O请求的核心数据结构,当内核模式代码要发起一个I/O请求时,它会构造一个IRP,用于在处理该I/O请求的过程中代表该请求。
IRP结构IRP对象从一个I/O请求被发起时开始存在,一直到该I/O请求被完成或者取消为止,在此过程中,会 ...
3环与0环通信(常规方式)
本篇介绍一下3环与0环通信的原理(常规方式),介绍与之相关的结构体,对象等,最后代码实现并模拟操作系统进行3环和0环的通信。
设备对象内核通信的对象内核中的通信,与应用层窗口间的通信类似,只是封装消息的结构体不同,接收消息结构体的对象不同
窗口通信:
1)消息结构体:MSG
2)接收消息的对象: ...
特征码搜索
本篇进行一个小实验,编写一个函数,通过特征码搜索一个未导出函数(PspTerminateProcess),并调用。看着不复杂,但是涉及到了很多细节,这里逐步分析。
什么是未导出函数先介绍一个概念,未导出函数。什么是未导出函数呢?
这个举个简单的例子,Ntoskrnl.exe中有很多内核函数,其中包括 ...
内核空间&内核模块
对编写基础的驱动有所了解后,我们来进一步了解一下内核,本篇会介绍两个概念,内核空间以及内核模块,先从内核空间说起。
内核空间内核空间的概念,我们还是比较熟悉的。这里我们主要关注一点,就是不同进程在低2G内存空间对应的物理页往往是不同的,而在高2G内存空间对应的物理页往往是相同的。如图: 这一要素,主 ...
内核编程基础
前面两篇文章分别介绍了驱动的编写以及调试驱动的方式,这一篇就对一些基础的概念以及注意事项做一个概括
内核API的使用
在应用层编程我们可以使用Windows提供的各种API函数,只要导入头文件就可以了,但是在内核编程的时候,我们不能像在Ring3那样直接使用。微软为内核程序提供了专用的API,只要在 ...
驱动调试
之前介绍了如何编写一个简单的驱动程序,相比exe程序,可以直接拖进OD内调试,驱动文件必须依赖操作系统才能执行。所以需要依靠Windbg进行双机调试来实现(配置双机调试可以参考这里)。具体如何调试驱动,下面一起来看看吧
PDB文件在学习驱动调试之前,先要了解PDB文件。PDB文件(Program D ...
第一个驱动程序
在完成了进程和线程的学习后,我们发现,很多实验都受限于权限的限制,很难直接操纵0环的结构,然而,依靠中断门等提权方式进入0环,需要手动在Windbg中设置段描述符,就会变得很麻烦。而驱动恰恰可以解决这个问题,驱动可以直接和操作系统打交道,话不多说,开始驱动的学习吧。
环境配置搭建环境及工具
Visu ...
跨进程读写内存
要点回顾跨进程的本质是“进程挂靠”,正常情况下,A进程的线程只能访问A进程的地址空间,如果A进程的线程想访问B进程的地址空间,就要修改当前的Cr3的值为B进程的页目录表基址(KPROCESS.DirectoryTableBase)
即:
Code1mov cr3, B.DirectoryTableB ...
进程挂靠
在学习进程挂靠之前,先回顾一下进程与线程相关的知识
进程与线程的关系基本关系
一个进程可以包含多个线程
一个进程至少要有一个线程
进程为线程提供资源,也就是提供Cr3的值,Cr3中存储的是页目录表基址,Cr3确定了,线程能访问的内存也就确定了。
代码分析来看这样一行代码:
Code1mov eax ...