随笔分类 - windows内核
1
摘要:隐藏系统线程 线程内核对象KTHREAD的ThreadListEntry链接了属于同一个进程的所有线程内核对象。应用层通过ZwQueryInformationThread和进程快照枚举线程就是枚举的这个链表,将此链表进行断链后就可以隐藏线程。 上述隐藏手段只是一种欺骗手段,无法做到真正的隐藏。对抗方
阅读全文
摘要:前言 windows vista版本引入了“受保护进程”的概念(PP),目的是为了保护媒体内容并符合DRM(数字版权管理)要求。Mircrosoft开发了此机制使受信任的媒体播放器可以访问高品质例如蓝光的文件,而防止其他程序访问和复制这些内容。在Windows 8.1(NT 6.3)中又对受保护的进
阅读全文
摘要:Windows内核对象 Windows内核中万物皆对象,并通过对象管理器(内核组件)管理这些对象。例如进程内核对象,线程内核对象,文件内核对象,设备内核对象,互斥量内核对象等,每一个对象都有其所属的对象类型_OBJECT_TYPE。 内核对象的内存布局 内核对象的内存布局包含了POOL_HEADER
阅读全文
摘要:句柄是什么 windows内核中万物皆对象,每个对象都有其对应的内核对象。因为应用层是不能直接读写内核空间的,windows系统通过为进程分配与内核对象对应的句柄并赋予一定的权限,使应用层通过这些句柄间接访问对应的内核对象并对权限进行严格的控制。 句柄表 windows为进程分配的句柄都存放在句柄表
阅读全文
摘要:SECTION OBJECT 内存区对象 在VAD树节点中除了进程通过VirtualAlloc申请的私有的(privated)内存块之外就是用于多个进程间共享内存的SECTION对象(mapped内存块)。 nt!_SECTION_OBJECT +0x000 StartingVa : Ptr32 V
阅读全文
摘要:VAD树 应用层进程会通过调用VirtualAlloc分配多个内存块,每个内存块包含1个或多个内存页。windows操作系统为了有效的管理这些内存块构建了一个AVL二叉树,这个AVL树就是VAD树。应用层的每一个内存块(包含VirtualAlloc申请的私有的和Mapping共享的)都对应一个VAD
阅读全文
摘要:4级分页 因为硬件限制64位系统只使用64位虚拟地址的低48位,48位虚拟地址被分为9-9-9-9-12,4个9分别表示PML4T,PDPT,PDT,PTT的PFN页帧编号(与物理页帧区分) PML4T,PDPT,PDT,PTT的每一项都是8个字节,CR3指向的是PML4T(Page Map Lev
阅读全文
摘要:X86 在C:\Windwos\System32\中存放着系统所有的dll文件,这些dll文件导出相应的系统API接口函数供我们的应用程序调用。其中最重要的四个dll文件:kernel32.dll,user32.dll,gdi32.dll,以及最重要的ntdll.dll(kernel32.dll,u
阅读全文
摘要:监控进程 NTSTATUS PsSetCreateProcessNotifyRoutineEx( PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, BOOLEAN Remove ); 通过PsSetCreateProcessNotifyRoutineE
阅读全文
摘要:控制寄存器 控制寄存器用于控制和确定CPU的操作模式 CR0 CR1 CR2 CR3 CR4 CR1保留,CR3是页目录表物理基址或页目录指针表物理基址。 CR0 1、PE:CR0的位0是启用保护(Protection Enable)标志。 PE=1保护模式 PE=0 实地址模式 这个标志仅开启段级
阅读全文
摘要:TLB(Translation Look=aside Buffer) TLB地址转译快查缓冲区,如果每次应用程序访问一个线性地址都需要先解析(查PDT,PTT)那么效率十分低,为了提高执行效率CPU在CPU内部建立了一个TLB表,此表和寄存器一样访问速度极高。其会记录线性地址和物理地址之间的对应关系
阅读全文
摘要:PAE PAE(Physical Address Extension)为物理地址扩展,传统的10-10-12分页最多可以访问的物理内存为4GB无法满足需要,通过物理地址扩展增加PTB增加访问到物理地址的上限。Inter用MAXPHYADDR来表示能访问到的最大的物理地址位数,对于我们个人计算机而言为
阅读全文
摘要:虚拟地址到物理地址 虚拟地址空间就是32位系统的那4GB,这4GB空间的地址称为虚拟地址。虚拟地址经过分段机制后转化为线性地址,一般虚拟地址都等于线性地址,因为大多数段寄存器的基地址都为0,只有FS段寄存器的基地址不会0。线性地址经过分页机制最终映射到物理地址上。 页目录表,页表 页目录表实际是特殊
阅读全文
摘要:任务门 任务门的门描述符在IDT中断描述符表中或GDT全局描述符表中,任务门描述符结构简单就第四个字节的高16位为隐藏的段选择子,此段选择子指向GDT表中的一个TSS段描述符。 任务门实现任务切换 可以用jmp far,call far 或者int n来使用任务门。 我觉得有了TSS段描述符还要使用
阅读全文
摘要:TR寄存器,TSS描述符,TSS段 TR寄存器与普通的段寄存器一样都有可见部分和不可见部分。TR的可见部分为16位为其段选择子,不可见部分是32位的TSS基地址和16位的大小。 TSS描述符存在GDT表中,注意其G位为0,所以TSS段的大小Limit的单位为字节,TYPE位为10B1(B为忙碌标志)
阅读全文
摘要:陷阱门 陷阱门和中断门很相似,陷阱门的门描述符也在IDT中断描述符表中。陷阱门的门描述符的Type位为1111(B),而中断门的门描述符的Type为1110(B)。 陷阱门提权 我们在idt表的索引为0x20位置处构造一个陷阱门,此陷阱门隐藏的段选择子的索引为1,指向DPL为0的代码段。 我们执行i
阅读全文
摘要:IDTR与IDT 中断描述符表寄存器IDTR有48位,其中32位存储中断描述符表的基地址,剩余16位存储表的长度。IDT就是中断描述符表,中断描述符表中存储中断门,陷阱门和任务门的门描述符。 中断门描述符 中断门描述符与调用门描述符差不多,其低四个字节的高16位存储的是隐藏的段选择子,中断跳转的目标
阅读全文
摘要:调用门 也就是在jmp far,call far时指定的那个段选择子指向的段描述是一个调用门描述符。其中低四个字节的高16位为一个隐藏的段选择子,而高四个字节的高16位与低4个字节的低16位共同组成32位的偏移地址。实际跳转的到的指令的地址为 :隐藏的段选择子指向的段的基地址 + 偏移地址。(其中调
阅读全文
摘要:修改cs段寄存器 除了cs段寄存器之外,其他的段寄存器都可以通过mov,les,lds这样的指令修改。但是cs不行,cs的修改涉及到eip指令指针的修改。 只修改eip jmp,call,ret等都是段内跳转指令,他们都是在不改变cs的情况下只改变eip。因为jmp,call是段内跳转指令,所以不需
阅读全文
摘要:段寄存器 段寄存器有6个分别是 cs,ss,ds,es,fs,gs。这些段寄存器包含16位的可见部分和80位的隐藏部分,共90位。 16位的可见部分就是我们知道的cs等段寄存器的值,我们可以在od中查看。 这16位可见部分也称为是段选择子,其16位的结构的最低两位是RPL即此段访问的请求权限级别,再
阅读全文
1