摘要: 5.APC挂靠 用户态apc 和上一课的内核apc几乎一致,唯一的变动就是这个 //插入当前线程 KeInitializeApc(pKapc, eThread, OriginalApcEnvironment, KernelAPCRoutineFunc, NULL, 0x4011d0, UserMod 阅读全文
posted @ 2024-05-18 17:27 MuRKuo 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 3.内核APC执行过程 说明 未文档化但是导出,所以需要提前声明 具体看下面的代码中的struct.h KeInitializeApc参数 //初始化apc函数 VOID KeInitializeApc( __out PRKAPC Apc,//使用`PKAPC pKapc`初始化 __in PRKT 阅读全文
posted @ 2024-05-18 17:27 MuRKuo 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 2.APC插入 介绍 WRK中的KeInsertQueueApc函数原型 BOOLEAN KeInsertQueueApc ( __inout PRKAPC Apc,//apc结构 __in_opt PVOID SystemArgument1,//参数1(可选) __in_opt PVOID Sys 阅读全文
posted @ 2024-05-18 17:26 MuRKuo 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 1.APC初始化 R3APC插入 简述 线程出现等待的情况下sleep WaitForSingleObject线程的资源再利用 apc--异步过程调用本质上就是一个异步call,线程本身是一直走,直到出现等待。但是有的时候需要当线程的某一个函数执行完,产生一个通知,但是如果是采用等待的方式的话,那么 阅读全文
posted @ 2024-05-18 17:25 MuRKuo 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 1.全局句柄表 句柄介绍 句柄一共有3种 全局句柄表 进程 线程 句柄表 私有句柄表 进程私有的 窗口句柄 全局句柄表 在全局句柄表种只有进程和线程对象 OpenProcess/OpenThread 权限 是否继承和 id 获取创建进程的handle的流程: 获取到进程id 取全局句柄表种找到进程对 阅读全文
posted @ 2024-05-18 17:25 MuRKuo 阅读(56) 评论(0) 推荐(0) 编辑
摘要: 3.线程 线程介绍 线程是需要上下文环境的 线程一定绑定在某个进程上的 内核线程只有一个堆栈(在内核中创建线程如果不指定进程的话,默认是绑定在system进程) R3中线程有2个堆栈,在R3进R0的时候会切换堆栈,这时候用的就不是R3的堆栈而是R0的(R0和R3的上下文环境) 线程没有cr3的概念, 阅读全文
posted @ 2024-05-18 17:24 MuRKuo 阅读(29) 评论(0) 推荐(0) 编辑
摘要: 2.进程 KPROCESS 这里我们使用驱动管理程序 kd> dt _kprocess 86de0d20 ntdll!_KPROCESS +0x000 Header : _DISPATCHER_HEADER +0x010 ProfileListHead : _LIST_ENTRY [ 0x86de0 阅读全文
posted @ 2024-05-18 17:23 MuRKuo 阅读(31) 评论(0) 推荐(0) 编辑
摘要: 1.KPCR进程概念 KPCR 介绍 KPCR 是CPU的控制结构 FS段寄存器在R0(FS=0x30)的时候指向KPCR结构 FS 段寄存器在R3(FS=0x3b)的时候指向 当前线程的TEB(线程) 线程结构是运行在CPU上面,所以线程结构是放在CPU上的 kd> dt _KPCR ntdll! 阅读全文
posted @ 2024-05-18 17:23 MuRKuo 阅读(86) 评论(0) 推荐(0) 编辑
摘要: 08 驱动内存加载[项目] 目标:实现一个加载器,让驱动不落地加载 DOS头和NT头 DOS 头 kd> dt _IMAGE_DOS_HEADER -r3 ntdll!_IMAGE_DOS_HEADER +0x000 e_magic : Uint2B +0x002 e_cblp : Uint2B + 阅读全文
posted @ 2024-05-18 17:22 MuRKuo 阅读(702) 评论(1) 推荐(0) 编辑
摘要: 07 驱动内存加载 驱动加载介绍 内存驱动加载不需要签名 当双击一个PE程序的时候发生了什么 1.通过explorer.exe(资源管理器)定位到双击的文件 2.资源管理器通过CreatProcess创建进程 3.创建进程的时候开辟一块空间 此时在R3(PEB)和R0(填充基址)需要的地方挂上R3的 阅读全文
posted @ 2024-05-18 17:21 MuRKuo 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 06 通信封装 缓冲区模式 看这段代码 #define TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS ) 其中的METHOD_BUFFERED字符就是缓冲区模式 f12进去后可也发现有三种缓冲区模 阅读全文
posted @ 2024-05-18 17:20 MuRKuo 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 05 驱动通信 介绍 通信流程: R3->符号链接->设备对象->驱动对象->驱动功能 驱动通信实质上是设备通信 设备是挂在驱动上的DeviceObject上面的 所以我们看一下设备对象 可以参考微软官方文档 kd> dt _DEVICE_OBJECT ntdll!_DEVICE_OBJECT +0 阅读全文
posted @ 2024-05-18 17:20 MuRKuo 阅读(82) 评论(0) 推荐(0) 编辑
摘要: 04蓝屏分析 直接上蓝屏代码 #include <ntifs.h> VOID Unload(PDRIVER_OBJECT pDriver) { DbgPrint("Driver Unload\r\n"); } NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, 阅读全文
posted @ 2024-05-18 17:17 MuRKuo 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 02驱动基础 基础类型 基础数据类型 在驱动中用基础数据类型需要用大写 R3 R0 int INT short SHORT char CHAR long LONG unsighted char UCHAR 指针是在前面加P NTSTATUS NTSTATUS 本质上是LONG NTSTATUS >= 阅读全文
posted @ 2024-05-18 17:16 MuRKuo 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 03驱动断链 获取驱动信息的途径是从Driver和FileSystem两个目录下获得的 正常情况下我们自己做驱动遍历只能便利Driver下的所有驱动,也就是驱动链表里的驱动 分析 这里我们F12进去找一下DRIVER_OBJECT的结构 typedef struct _DRIVER_OBJECT * 阅读全文
posted @ 2024-05-18 17:16 MuRKuo 阅读(82) 评论(0) 推荐(1) 编辑
摘要: 01Hello World 驱动基础知识 驱动不是进程,本质上和DLL一样是模块 NT驱动:如果绑定设备,不能卸载 WDM驱动:热拔插,可以更新卸载 WDF驱动:简化开发,相当于事件驱动机制,依赖环境 KWDF驱动:内核驱动框架 UWDF驱动:用户驱动框架(支持在用户下运行的) 学的主要是NF和WD 阅读全文
posted @ 2024-05-18 17:14 MuRKuo 阅读(36) 评论(0) 推荐(0) 编辑