- 博客(101)
- 收藏
- 关注
翻译 windows IRQL
我们的 rootkit 项目的目标是访问共享的内核资源,同时确保在任何 CPU 上运行的其他线程都不会踩到我们的脚趾。在处理与 DPC 相关的任何内容之前,我们首先需要某种同步机制,它告诉我们所有 CPU 都以 DISPATCH_LEVEL 的速度运行,以及一种方法来向其他 CPU 发出信号何时退出无限 NOP 循环。在这个非常大的 for 循环中运行上述指令将有效地使系统在几秒钟内不可用,因此,作为故事的寓意,rootkit 在访问内核中的共享资源时应该很快。(代码的共享部分)时,它会获取互斥锁。
2025-03-02 01:09:07
33
原创 X64 windows多核下IDT GDT 和TSS64的研究
pcr 可以用来查看 当前核的KPCR结构体,因为当前GS.base 保存的是Kpcr的基址!pcr 0 查看0号核!pcr 1 查看1号核其他类推。
2025-02-28 03:56:33
144
原创 X64 硬件断点(指令断点)的研究
每个调试地址寄存器(DR0到DR3)都保存断点的32/64 位线性地址。断点比较是在物理地址转换发生之前进行的。调试寄存器DR7的内容进一步指定了断点条件。当启用调试扩展时(当控制寄存器CR4中的DE标志被设置时),调试寄存器DR4和DR5被保留,并且试图引用DR4和DRM5寄存器会导致无效的操作码异常(#UD)。当调试扩展未启用时(当DE标志清除时),这些寄存器被别名化为调试寄存器DR6和DR7。
2025-02-27 01:00:09
1064
原创 X64 TF位和Single-step单步调试的研究
如果在执行指令时,处理器检测到 EFLAGS 寄存器中的 TF 标志被设置,则会生成单步调试异常。该异常属于陷阱类异常,因为异常是在指令执行之后生成的。处理器不会在设置 TF 标志的指令之后立即生成此异常。例如,如果使用 POPF 指令设置 TF 标志,则单步陷阱不会发生,直到 POPF 指令后面的指令执行之后。RF标志的主要功能是允许在指令断点条件导致的调试异常后重新启动指令。在这里,调试软件必须在堆栈上的EFLAGS映像中设置此标志,然后才能使用IRETD返回中断的程序(以防止指令断点导致另一个调试异
2025-02-26 03:05:39
1087
原创 X86_64位下的GS寄存器
在 64 位模式下,段机制通常(但不是完全)被禁用,从而创建一个平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基地址视为零,从而创建一个与有效地址相等的线性地址。FS 和 GS 段是例外。这些段寄存器(保存段基地址)可以作为线性地址计算中的附加基地址寄存器,用于寻址本地数据和某些操作系统数据结构。
2025-02-25 00:00:28
389
原创 X86 MTRR内存缓存优先级
在初始化MTRR之前,软件(通常是系统BIOS)必须将所有固定范围和可变范围MTRR寄存器字段初始化为0。在硬件重置时,P6和更新的处理器清除可变范围MTRR中的有效标志,并清除IA32_MTRR_DEF_TYPE MSR中的E标志,以禁用所有MTRR。如果MTRR未启用(通过在IA32_MTRR_DEF_TYPE MSR中设置E标志),则所有内存访问都是UC内存类型。一. 如果物理地址落在物理存储器的前1 MB字节内,并且启用了固定MTRR,则处理器使用为适当的固定范围MTRR存储的存储器类型。
2025-01-21 00:17:43
339
原创 CR0和CR4在执行VMXON指令前的设置
因此,CR0中的每个位要么固定为0(两个MSR中的值均为0),要么固定为1(两个RMS中的值都为1),要么灵活(IA32_VMX_CR0_FIXED0中为0,IA32_VMX _CR0_FIXED1中为1)。如果IA32_VMX_CR0_FIXED0中的位X为1,则该位在IA32_VMX_CR0_FIXED1中也为1;如果IA32_VMX_CR0_FIXED1中的位X为0,则该位在IA32_VMX_CR0_FIXED0中也为0。它们报告CR0中在VMX操作中分别允许为0和1的位。
2025-01-11 00:32:00
147
2
原创 windows内核 中关键区 和 保护区 函数理解
例程进入关键区 暂时禁用正常内核 APC 的执行,但不阻止特殊内核 APC 的运行。例程进入受保护的区域,这会禁用所有内核模式 APC 传递到当前线程。
2024-12-22 01:19:00
156
原创 R3-->DbgUiConvertStateChangeStructureWorker
内核层将DEBUG_EVENT(未公开结构)转换到DBGUI_WAIT_STATE_CHANGE (未公开结构),在ntdll中再次将DBGUI_WAIT_STATE_CHANGE转换成用户层DEBUG_EVENT(公开结构)
2024-12-02 04:25:14
141
原创 DbgkForwardException
【代码】BOOLEAN DbgkForwardException( IN PEXCEPTION_RECORD64 ExceptionRecord, IN BOOLEAN DebugException,
2024-11-29 22:32:02
115
原创 KTHREAD结构-->TEB
在切换线程时,修改了FS=3b时的断描述符的base,这样 在3环的时候,fs:0永远都是TEB结构体的指针。这里并不是修改FS寄存器的值。
2024-11-03 13:45:55
260
原创 KTHREAD--InitialStack和KernelStack和TSS的esp0
【代码】KTHREAD--InitialStack和KernelStack和TSS的esp0。
2024-11-03 00:08:33
215
原创 KPRCB结构之ReadySummary和DispatcherReadyListHead
请参考 _KTHREAD *__fastcall KiSelectReadyThread(ULONG LowPriority, _KPRCB *Prcb)
2024-11-02 01:15:42
284
原创 MSR寄存器独有的还是共享的
这一章列出了不同英特尔处理器系列的 MSR(模型特定寄存器)。所有列出的 MSR 都可以使用 RDMSR 和 WRMSR 指令进行读取和写入。当一个处理器封装包含单个芯片时,芯片作用域和封装作用域是同义的;但当封装包含多个芯片时,这两者则是不同的。:有关支持的层次级别类型的信息,请参考 CPUID Leaf 1FH 定义中的实际级别类型编号:“V2 Extended Topology Enumeration Leaf”,详见《英特尔® 64 和 IA-32 架构软件开发者手册,第 2A 卷》。
2024-10-28 02:48:30
470
原创 NEG— 取负操作 SBB— 借位整数减法
是计算操作数的二进制补码的负值(取反加1),即将数值取反并改变其符号。例如,NEG 5会得到-5。NEG -5会得到5。
2024-10-27 17:23:49
493
原创 通过 SYSENTER/SYSEXIT指令来学习系统调用
通过sysenter指令,切换特权级别时,CPU不会保存任何寄存器的值,并且会修改elfags寄存器的IF位.通过sysexit指令返回时,将读取msr174的 3环选择子,设置cs段寄存器,通过cs段选择子+8的位置就是3环的ss段选择子.RDX的值加载到EIP中,RCX的值加载到ESP中.所有其他的寄存器 需要操作系统软件保存,并且在特权级别0 能够访问到这块内存。
2024-10-27 16:01:48
1192
原创 通过call指令来学习指令摘要表的细节
表示E8后面跟随2 字节 (什么数不知道)指在与指令同一代码段内的相对地址偏移,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET在64位模式下,某些指令需要使用“地址覆盖前缀”(address override prefix),但这并不被所有处理器支持。如果在64位模式下使用地址覆盖前缀,可能会导致特定处理器型号的执行行为出现不一致或错误。表示兼容模式和传统模式下,这个指令是有效的。
2024-10-26 01:35:55
906
原创 windows内核探索--打印windows的GDT表(全局描述符表)
【代码】windows内核探索--打印windows的GDT表(全局描述符表)
2024-10-25 00:55:42
275
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人