- 博客(90)
- 资源 (1)
- 收藏
- 关注
原创 windows内核研究(驱动开发 第一个驱动程序和调试环境搭建)
驱动程序开发入门指南 本文介绍了Windows驱动程序开发的基础流程和调试方法。主要内容包括:驱动程序开发的基本步骤(编写代码、生成.sys文件、部署、启动、停止、卸载),以及一个简单的驱动示例代码展示。重点讲解了双机调试环境的搭建方法,使用VirtualKD工具在被调试系统上安装调试支持,并配置windbg调试器进行内核调试。文章还解释了PDB文件(程序数据库)在调试过程中的重要作用,以及如何设置符号路径来获取系统PDB文件。这些内容为初学者提供了驱动程序开发和调试的基础知识框架。
2025-07-17 20:38:14
209
原创 windows内核研究(进程与线程-等待链表和调度链表和线程切换)
本文主要探讨了Windows操作系统中进程和线程的管理机制。文章首先分析了线程的等待链表和调度链表结构,指出正在运行、准备运行和等待状态的线程分别存储在不同位置。随后详细讲解了线程切换的三种情况:主动调用API、时钟中断和异常处理,并介绍了时间片管理的原理。文章还讨论了线程切换与TSS、FS寄存器的关系,以及线程优先级调度机制。最后重点阐述了进程挂靠的概念,解释了如何通过修改CR3寄存器实现跨进程内存访问,并简要分析了NtReadVirtualMemory函数的执行流程和跨进程读写内存的实现方式。这些机制共
2025-07-16 17:56:12
470
原创 windows内核研究(进程与线程-KPCR)
KPCR与CPU线程管理摘要 KPCR(CPU控制区)是Windows内核中每个CPU核心的关键数据结构,主要包含: 核心控制信息: 存储GDT、IDT和TSS等关键表地址 包含CPU编号等标识信息 线程调度相关: 通过KPRCB扩展结构体管理当前/下一个线程指针 记录空闲线程状态(IdleThread) 异常处理支持: 包含异常链表和栈边界信息(NT_TIB结构) 维护内核态和用户态的栈空间信息 该结构体在0环运行时通过FS:[0]访问,是线程调度和CPU状态管理的核心数据结构。
2025-07-15 10:00:39
259
原创 windows内核研究(进程与线程-线程结构体ETHREAD)
摘要 WinDbg中的_ETHREAD结构体详细描述了Windows操作系统线程的内部数据结构。该结构包含线程控制块(Tcb)、创建/退出时间、客户端ID(Cid)、线程状态标志、APC相关字段、安全上下文、I/O优先级设置等关键信息。其中值得注意的字段包括:ThreadListEntry用于线程链表管理、CrossThreadFlags包含终止状态等标志位、ActivityId用于追踪、以及各种性能相关的计数器。这些数据结构反映了操作系统对线程调度、同步、安全等核心功能的管理机制,是理解Windows线程
2025-07-14 17:52:54
184
原创 windows内核研究(进程与线程-进程结构体EPROCESS)
摘要: EPROCESS是Windows内核中表示进程的核心数据结构,位于内核层(0环)。该结构体包含进程的关键信息,如进程ID(UniqueProcessId)、进程环境块指针(Peb)、句柄表(ObjectTable)、创建时间(CreateTime)以及内存管理相关数据(虚拟内存统计、物理页信息等)。EPROCESS还通过ActiveProcessLinks链接所有活动进程,并包含调试相关字段(DebugPort、ExceptionPortData)。结构体中KPROCESS子结构(Pcb)保存进程调
2025-07-14 17:09:11
241
原创 windows内核研究(系统调用 三)
摘要: 本文探讨了Windows内核中3环到0环切换时的寄存器保存机制,重点分析了三个关键结构体:Trap Frame(保存3环寄存器)、ETHREAD(线程信息)和KPCR(CPU状态)。通过Windbg指令展示了这些结构体的具体布局,并详细介绍了系统服务表(SSDT)的工作机制,包括如何通过系统服务号定位内核函数及其参数。文中还提供了查看CPU数量、KPCR地址以及解析系统服务函数的实用调试技巧,最后以NtReadVirtualMemory函数为例,演示了如何确定函数参数数量。
2025-07-14 09:57:41
324
原创 windows内核研究(系统调用 二)
Windows系统调用机制分析 本文分析了Windows系统的API调用过程,重点关注32位函数在64位系统中的转换机制。系统通过_KUSER_SHARED_DATA结构体实现用户层与内核层的数据共享,该结构体在用户层地址为0x7FFE0000(只读),内核层地址为0x7FFDF0000(可写)。文章详细解析了_KUSER_SHARED_DATA结构体内容,其中0x308偏移处存放系统调用入口。同时介绍了CPU快速调用检测机制,通过CPUID指令检查处理器是否支持sysenter/sysexit指令,支持则
2025-07-11 16:10:38
960
原创 windows内核研究(保护模式 10)
摘要:本文介绍了x86架构中的中断和异常机制。硬件中断分为非屏蔽中断(NMI)和可屏蔽中断(INTR),前者固定使用IDT表的0x2号中断,后者通过中断控制器管理。异常是CPU主动产生的错误,如缺页(0xE)、段错误(0xD)等。控制寄存器(CR0-CR4)用于配置CPU操作模式,PWT/PCD位控制缓存行为。文中还详细说明了时钟中断的重要性、中断与异常的区别、缺页异常的处理过程以及CPU缓存的相关概念。
2025-07-06 10:53:22
848
原创 windows内核研究(保护模式 8)
摘要:2-9-9-12分页模式(PAE)是Intel为扩展物理内存寻址空间而设计的新分页机制。相比传统10-10-12分页的4GB限制,新模式通过将PTE/PDE从4字节扩展为8字节,并引入PDPTE表结构,实现了更大内存访问能力。关键改进包括:保留4KB页大小(12位)、PTE/PDE寻址各9位、新增2位扩展位,同时引入XD/NX位提供硬件级代码执行保护。该模式下大页为2MB,并通过64位PTE结构支持超过4GB的物理内存寻址。
2025-07-04 18:20:40
717
原创 windows内核研究(保护模式 6)
本文介绍了x86架构中的任务段(TSS)及其相关机制。TSS是一种特殊数据结构,用于存储任务硬件上下文、支持任务切换和提供内核栈指针。文章详细解析了TSS的32位和64位内存结构,以及CPU通过TR寄存器定位TSS的过程。同时阐述了TR寄存器的读写指令(LTR/STR),并提供了修改TR寄存器的代码示例。此外,还讲解了任务门的概念及其在IDT表中的查找流程,包括通过中断调用任务门、查询GDT表并加载TSS描述符到TR寄存器的完整过程。
2025-06-30 11:44:30
443
原创 windows内核研究(保护模式 4)
本文介绍了保护模式下的代码跨段跳转和调用机制。通过修改GDT表中的段描述符,演示了JMP FAR指令在不同权限级别间的跳转限制,说明非一致代码段阻止低权限访问高权限代码的特性。同时比较了一致代码段的访问规则差异,提出需通过调用门提升权限才能访问普通代码段。文章还阐述了CALL FAR长调用比JMP FAR的复杂性,涉及权限切换时的堆栈改变,以及CS和SS权限必须保持一致的要求。最后指出跨段调用可通过调用门提升CPL权限,而SS和ESP的获取需参考TSS段。
2025-06-24 13:25:44
248
原创 windows内核研究(保护模式 3)
文章摘要 保护模式下的段权限检查机制涉及CPL、DPL和RPL三个关键概念。CPL表示当前CPU特权级别,DPL定义访问段所需权限,RPL是请求权限级别。数据段访问需满足CPL<=DPL且RPL<=DPL。代码跨段通过修改CS寄存器实现,分为一致代码段(允许低特权调用高特权代码,CPL不变)和非一致代码段(严格同级访问限制)。长跳转指令需经过段选择子拆分、查表、权限检查等步骤。直接跳转无法改变CPL,提升权限需通过调用门实现。Windows仅使用0环(内核)和3环(用户)两种特权级别。
2025-06-22 11:28:04
925
原创 windows内核研究(保护模式 2)
本文介绍了保护模式下的段描述符属性及其分类机制。主要内容包括: 段描述符与段寄存器的转换关系,重点解析了P位(有效性)、G位(粒度)和S位(区分系统/代码数据段)的作用; 代码段和数据段的TYPE域解析,详细说明了数据段的A(访问位)、W(可写)、E(扩展方向)和代码段的A、R(可读)、C(一致位)等属性; 系统段描述符分类,列举了16/32位TSS、LDT、调用门、中断门等系统段类型及其Type编码。通过属性位的组合判断,CPU可准确识别段类型并实施访问控制。
2025-06-20 17:26:57
744
原创 windows内核研究(保护模式 1)
摘要:x86保护模式与段寄存器机制 保护模式是现代x86处理器的核心运行模式,为操作系统提供内存管理、硬件保护和多任务支持。与实模式相比,保护模式采用分段与分页机制实现虚拟内存和进程隔离,并通过特权级(Ring 0-3)限制用户程序权限。段寄存器(CS/DS/SS等)在保护模式下演变为选择子,指向GDT/LDT描述符表,决定内存访问权限和范围。每个段寄存器包含16位可见部分和80位隐藏属性(基址、界限、权限等),可通过特殊指令探测其特性。段描述符(8字节)与段选择子(16位)共同构成保护模式下的内存访问控制
2025-06-20 13:47:00
945
原创 硬编码(Reg/Opcode 和 SIB)
我们知道,3-5的这一段,描述的是通用寄存器Reg的信息,那当描述的不是Reg时,我们该如何查表0x800x810x820x83注:凡是看到有Grp的,均参写 Table A-6。
2025-06-18 17:04:52
771
原创 硬编码(变长指令ModR/M)
首先回顾一下指令结构图我们知道ModR/M(1个字节)是由前面的Opcode来确定的,那这一个字节中所表示的意义又是什么呢?
2025-06-18 14:53:17
271
原创 硬编码(修改RIP相关指令)
本文详细介绍了x86架构中修改RIP寄存器的各类指令。主要内容包括: 单字节JCC条件跳转指令(0x70-0x7F),解析其跳转方向和偏移量计算规则 双字节JCC指令(0F开头)的查表方法及跳转特性 其他修改RIP的关键指令:LOOP系列(0xE0-0xE3)、CALL(0xE8)、JMP(0xE9/0xEA/0xEB)、RET(0xC3/0xC2)等 跨段跳转指令(0xCB/0xCA)的工作原理 文章通过图表清晰展示了指令编码格式和跳转方向判断标准,是理解x86控制流指令的实用参考。
2025-06-14 17:07:51
342
原创 硬编码(定长指令与变长指令)
指令编码机制解析 本文详细介绍了x86/x64架构的指令编码机制,重点分析了定长指令和变长指令的区别: 指令组成:指令长度主要由Opcode、ModR/M和SIB三部分决定,其中Opcode是最核心部分(1-3字节) 指令类型: 定长指令(如50h):单字节即可确定指令(如push rax) 变长指令(如00h):需要通过查表结合ModR/M等字段才能确定完整指令(如add) 查表方法:通过Intel手册中的Opcode表(如A.2.4.1)可以查询指令对应关系,并介绍了Zz表示法的解读方法 寻址编码:详细
2025-06-14 11:52:25
596
原创 硬编码(前缀指令)
x86/x64指令架构中的前缀指令是可选的指令修饰符,位于指令的最前端。常见前缀分为四组:锁定和重复前缀(如F0H、F3H)、段覆盖前缀(如2EH、3EH)、操作数大小覆盖(66H)和地址大小覆盖(67H),每组最多使用一个前缀。64位模式下还有REX前缀(40H-4FH)扩展寄存器操作,以及VEX/EVEX前缀支持SIMD指令。前缀通过特定字节值识别(如x64dbg用冒号分隔前缀),主要用于修改指令行为(如内存访问、操作数大小等)。
2025-06-14 10:27:12
442
原创 汇编(函数调用)
本文介绍了x86架构下函数调用的关键机制。首先对比了JMP和CALL指令的区别,指出CALL在跳转时会将返回地址压栈,实现函数的多处调用。其次讲解了参数传递方法,当参数超过8个时需使用堆栈传参。然后详细阐述了堆栈平衡的概念,强调函数返回前要调整ESP指针恢复堆栈状态,可通过外平栈(add esp)或内平栈(ret n)实现。最后介绍了更安全的EBP寻址方式,通过保存/恢复EBP寄存器维护栈帧结构,避免直接使用ESP寻址的偏移计算问题。文中包含具体汇编代码示例说明各机制实现方法。
2025-06-11 16:18:08
496
原创 汇编(cpu寄存器描述)
寄存器是CPU内部的高速存储单元,用于临时存储数据、指令和地址,访问速度远快于内存。x86架构有8个32位通用寄存器(如EAX、EBX),x64扩展为16个64位寄存器(如RAX、RBX),新增R8-R15寄存器并优化参数传递机制。不同寄存器有特定用途:RSP/RBP管理栈,RAX存储返回值,RIP指向下一条指令。栈用于存储运行时中间数据,通过PUSH/POP操作管理。EIP寄存器存储下一条指令地址,只能通过JMP、CALL和RET等控制转移指令间接修改。这些寄存器协同工作,实现高效的数据处理和程序执行。
2025-06-11 10:32:47
473
原创 win32相关(消息Hook)
本文介绍了Windows消息钩子的实现方法,主要涉及三个关键API:SetWindowsHookEx设置钩子、CallNextHookEx传递钩子信息、UnhookWindowsHookEx卸载钩子。核心实现是将钩子函数封装在DLL中,通过SetWindowsHookEx安装全局或线程特定的键盘钩子。文章展示了完整的DLL代码实现,包括键盘消息处理回调函数KeyboardProc,以及调用的示例程序。当钩子成功安装后,系统会将DLL注入到目标进程,实现对按键消息的监控和输出。这种方法既可用于消息处理,也可作
2025-06-07 10:07:40
427
原创 pe文件结构(TLS)
TLS(线程局部存储)技术解析 TLS(Thread Local Storage)是解决多线程变量同步问题的机制,允许线程内部函数访问专有变量而不影响其他线程。主要用途包括: TLS变量:通过__declspec(thread)创建线程局部变量,每个线程拥有独立副本。 TLS回调函数:在PE文件中注册回调函数,在进程/线程创建/销毁时自动触发,可用于安全防护。其特点包括: 执行早于程序入口点(OEP) 可实现反调试等功能 通过.CRT$XLX段注册回调数组 PE结构支持:通过IMAGE_TLS_DIRECT
2025-06-06 11:54:03
710
原创 初识硬编码(x86指令描述)
文章摘要 程序由指令和数据组成,CPU将符合格式的数据视为指令执行。x86/x64架构遵循Intel手册规定的指令格式,其中x64是x86的扩展。Intel手册第二卷详细描述了指令格式。学习硬编码需要借助反汇编工具(如x64dbg、OllyDBG、IDA Pro等)将二进制转换为汇编代码。汇编指令长度在1-15字节之间。x86和x64的指令结构图示展现了它们的差异与联系。
2025-06-05 20:54:14
194
原创 win32相关(内存映射文件)
内存映射文件是将磁盘文件映射到进程地址空间的技术,允许像访问内存一样读写文件。示例代码展示了Windows系统下使用CreateFileMapping和MapViewOfFile实现文件映射的过程,包括读取和修改文件内容。特别说明了对系统DLL文件映射时的"写时拷贝"机制(通过FILE_MAP_COPY参数),当修改映射的系统文件时会创建副本,不影响其他进程使用的原始文件。这种技术提供了高效的文件I/O操作方法,同时确保了系统文件的完整性。
2025-06-03 14:20:51
248
原创 win32相关(虚拟内存和物理内存)
在win32操作系统下,每个进程都有它自己独立的4GB空间,是window给它分配的一个虚拟空间,并不是真正的物理空间,这4GB空间中,分为高2G和低2G,高2G是应用程序的,低2G空间是给内核应用共享的空间。虚拟内存(硬盘空间,当物理空间【内存条】不够用时,可以设置把硬盘上的一块空间拿来当做物理内存来使用)32位的系统最多可以识别物理内存为64G,但由于操作系统的限制比如XP,只能识别4G。更多的细节被操作系统封装在了底层实现,我们用户在平时的使用当中是感受不到的。
2025-06-02 22:38:10
341
原创 win32相关(事件)
摘要:本文介绍了Windows中的事件机制和线程同步技术。事件是系统或应用程序中可被检测的动作/状态变化,使用CreateEventW创建事件对象。通过示例代码展示了如何利用事件实现线程同步控制,包括线程等待事件触发的基本模式。随后探讨了生产者-消费者模型,演示了通过两个事件对象交替触发实现有序线程协作。代码展示了生产线程和消费线程如何通过事件信号交替执行,确保每次生产后消费,维持数据容量平衡,体现了"同步=互斥+有序"的原理。
2025-06-02 12:45:40
268
原创 win32相关(互斥体)
文章摘要: 互斥体(Mutex)是解决跨进程访问内核临界资源的机制,比线程锁更适用于多进程环境。通过CreateMutex创建命名互斥体,进程可通过WaitForSingleObject获取访问权,ReleaseMutex释放。与线程锁相比,互斥体支持超时等待、异常处理,但效率略低。常用于限制程序多开(检测ERROR_ALREADY_EXISTS),示例代码展示了互斥体的创建、获取、释放流程及其在多进程互斥访问中的应用效果。
2025-06-01 11:30:41
327
原创 win32相关(临界区)
摘要 本文通过多线程卖票的例子演示了线程安全问题。当多个线程同时访问全局变量g_num时,会出现线程不安全情况,如同一张票被重复销售。解决方法是使用Windows临界区(CRITICAL_SECTION)机制:先创建并初始化临界区变量,然后在访问共享资源前调用EnterCriticalSection进入临界区,访问结束后调用LeaveCriticalSection离开临界区。修改后的代码确保了同一时间只有一个线程能访问全局变量,从而解决了线程安全问题。
2025-05-31 19:39:42
285
原创 win32相关(创建线程)
摘要 线程是操作系统调度的最小执行单位,比进程更轻量,共享进程资源但拥有独立执行流。Windows系统提供多种线程操作API,如CreateThread创建线程、SuspendThread/ResumeThread控制线程状态、WaitForSingleObject等待线程完成等。线程有激发态和非激发态之分,主线程结束会强制终止子线程。通过工具函数可枚举系统线程并对其进行管理。线程编程需要注意资源共享和同步问题。
2025-05-30 21:35:43
379
原创 win32相关(进程间通信)
本文介绍了两种Windows进程间通信方法:WM_COPYDATA消息传递和邮槽通信。 WM_COPYDATA方式: 使用特殊的WM_COPYDATA消息传递数据 需要构建COPYDATASTRUCT结构体包含数据和大小 演示了发送端和接收端的实现代码 邮槽通信方式: 单向通信机制(客户端写入,服务端读取) 支持本地和网络通信(基于UDP协议) 使用CreateMailslot、CreateFile、WriteFile、ReadFile等API 提供了发送端和接收端的代码示例 这两种方法都能有效实现Wind
2025-05-28 17:23:43
254
原创 win32相关(进程相关API)
本文介绍了Windows系统中与进程管理相关的API函数。主要内容包括:1) 进程ID(PID)和句柄的概念;2) 关键API函数如CreateProcess(创建进程)、TerminateProcess(终止进程)和OpenProcess(打开进程)的使用方法及其参数说明;3) 特殊创建标志CREATE_SUSPENDED的作用;4) 其他常用进程信息获取函数如GetModuleFilename、GetCurrentDirectory等。文章还列举了多个辅助进程管理API,如获取进程ID、命令行、启动信息
2025-05-27 10:14:32
403
原创 win32相关(动态链接库)
动态链接库(DLL)是Windows系统中实现代码共享的重要机制。本文介绍了DLL的基本概念、特点和创建使用方法。DLL的主要优势包括代码共享、模块化设计、资源节省和运行时加载。创建DLL时提供了两种导出函数方式:声明导出和模块定义导出。使用DLL也有两种主要方法:lib隐式链接和LoadLibrary动态加载,前者将代码直接嵌入程序,后者则保持程序小巧但需要依赖外部DLL文件。通过具体代码示例展示了DLL的创建和调用过程,帮助开发者理解这一重要的Windows编程概念。
2025-05-27 10:00:23
732
原创 win32相关(句柄表)
内核对象是操作系统内核层创建的结构体,用于管理进程、线程、文件等资源。Windows和Linux中常见的内核对象类型包括进程对象、线程对象、文件对象等。由于用户程序无法直接访问内核地址空间,操作系统通过句柄表来管理内核对象,用户必须通过句柄来操作内核对象。多个进程可以通过OpenProcess或继承机制共享同一个内核对象。句柄表中的一个参数决定内核对象是否可被继承,子进程只能继承父进程中设置为可继承的内核对象。总结来说,共享内核对象的两种主要方式是通过OpenProcess打开进程,或通过父进程创建子进程并
2025-05-23 13:09:27
294
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人