Windows操作系统
文章平均质量分 96
Lun3r-
I code, not for me, but the world.
展开
-
几种RAID的介绍及作用
本文极大的增长了我对RAID的理解,好文章要分享出来,感谢这位作者whitejava2原文传送门:https://blog.csdn.net/caipeichao2/article/details/52661825什么是RAID硬盘是个很脆弱的东西,它经常会坏掉。所以,为了保证服务器可靠耐用,硬盘必须时时刻刻保持可用。所以有了RAID这个东西。它的目的是将好几个硬盘合并在一起,就算硬盘坏了一...转载 2019-04-25 20:11:17 · 3600 阅读 · 0 评论 -
Windows内核情景分析 内核发起系统调用的过程
从内核中发起系统调用系统调用一般是来自于用户空间,但是系统有时也会在内核进行系统调用。内核中无法直接调用NtReadFile一类的函数。这一方面是因为Windows内核并不导出这些函数另一方面,这些函数调用时是需要系统调用框架/自陷框架,而从内核直接调用显然没有这样一个框架所以这就是为什么在内核中只能通过ZwReadFile一类函数进行系统调用的原因。这里真的是非常的鞭辟入里!!!,让...原创 2019-05-15 20:30:31 · 616 阅读 · 0 评论 -
TSS段(转载)
转载自:https://blog.csdn.net/q1007729991/article/details/52650822,讲的非常好,我就稍微写点提醒自己的,大部分都是借鉴的23333(懒…)TSS:Task State Segment一个TSS的结构类似于下图typedef struct TSS { DWORD link; // 保存前一个 TSS 段选择子,使用 call 指...转载 2019-05-15 21:29:29 · 908 阅读 · 0 评论 -
线性地址转换物理地址
当开启页映射时,我们所有的线性地址都是虚拟地址,只是给我们看的,但是真正的物理地址需要经过线性地址一系列的映射才会到真正的物理地址处。一般是通过三级或者四级映射。也就是10-10-12或者2-9-9-12。今天先实验10-10-12。首先我们要知道页表的概念,页表是一个存储索引号的表,每个元素是4B,对于10-10-12而言,第一个10bit用210就可以表示就可以表示全,第二个也是如此,...原创 2019-05-16 09:36:16 · 2360 阅读 · 0 评论 -
对象管理---2
IopCreateObjectTypes以I/O子系统为例,其初始化过程中创建了Adapter,Controller,Device,Driver,IoCompletion,File等对象类型。BOOLEANINIT_FUNCTIONNTAPIIopCreateObjectTypes(VOID){ OBJECT_TYPE_INITIALIZER ObjectTypeInitial...原创 2019-05-24 18:12:04 · 536 阅读 · 0 评论 -
DLL装载的实现
Dll装载的实现Dll装载主要由LdrInitializeThunk函数实现,具体如下typedef struct _LDR_MODULE { LIST_ENTRY InLoadOrderModuleList;//链表 LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; PVOI...原创 2019-05-11 17:54:17 · 1448 阅读 · 2 评论 -
深入理解Windows内存管理---1
内存管理简介作为一个合格的操作系统,为不同进程之间及用户和内核之间要提供隔离机制。实现这些基本要求的手段,就是采用基于页面映射的**“虚拟内存”机制,或者说提供“页管理机制”**。硬件上,这是由CPU内部的“存储管理单元”MMU(Memory Manage Unit)支持的。现代的处理器一般都带有MMU。软件上,则是由系统内核中的内存管理模块来实现的。内存管理的解释广义的内存管理,指...原创 2019-05-17 14:43:24 · 1157 阅读 · 4 评论 -
对象管理---3
对象的创建依旧是针对定时器,定时器对象的创建是通过NtCreateTimer来的。构成这个系统调用的三个步骤是通过ObCreateObject创建目标对象对具体对象做相应的本身的初始化通过ObInsertObject将目标对象插入对象目录和句柄表,并返回句柄。凡是创建对象的系统调用,都要提供至少两个输入参数。其中之一就是DesiredAccess,这个参数的含义是创建对象的访问模式...原创 2019-05-26 20:11:57 · 500 阅读 · 0 评论 -
Windows内存管理---5
页面异常在为交割而分配一个区间时,区块的类型是MEM_COMMIT,此后这个区间就可以被访问了。但是,所谓“交割”也只是逻辑上的操作,并未落实到实际的物理页面的映射。于是,用户空间的程序在系统调用成功返回后就可能访问这个区间,然而一访问就因缺页异常而发生页面异常,因为此时实际上尚未建立起物理页面的映射。发生页面异常时,内核走过类似于中断的过程,因异常的原因为页面异常而进入页面异常处理程序MmA...原创 2019-05-22 17:56:26 · 876 阅读 · 0 评论 -
深入理解Windows内存管理---2
内核对于物理页面的管理物理页面在内核中的表示以及相关域的介绍深入理解Windows内存管理—1 是对虚存地址的区间和区块的管理。这些区块最终得要落实到物理内存才有实际的效用。而物理内存的管理和使用是以页面为单位的,所以物理内存的管理实际上是对物理页面的管理。内核中,物理页面是以数据结构PHYSICAL_PAGE代表的,类型定义如下:typedef struct _PHYSICAL_PA...原创 2019-05-18 12:14:11 · 501 阅读 · 0 评论 -
对象管理---1
对象管理对象,即Object。广义的说,对象就是“目标”,行为的受体,所以,任何客观的事物从广义上讲都可以成为对象。在计算机领域,对象是个专有名词。其定义是:一个(一组)数据结构,以及定义在其上的操作,也就是数据结构 +操作,这个跟我们程序设计的思想是一致的,所谓“基于对象的程序设计”和“面向对象的程序设计”的概念都是基于此的。Windows把文件和设备都看做特殊对象。同样,我们将空间分成用户...原创 2019-05-23 22:49:38 · 1040 阅读 · 0 评论 -
对象管理---4
几个常用的内核函数在Windows的内核管理层(Executive),对象管理是个很重要的机制。Windows对象管理中,有些著作喜欢将其称为"子系统",其实也就是内核管理层。下面讲介绍几个常用的内核中对象管理的函数。ObReferenceObjectByHandle这个函数根据Handle,返回一个该Handle对应的对象。 // // Converts to and from a K...原创 2019-05-28 19:45:50 · 406 阅读 · 0 评论 -
Windows进程与线程---1
概述相比于Linux中的进程管理,即创建一个线程的同时创建一个进程。而Windows中却不是这样,它是先创建一个进程作为容器,然后创建第一个线程,也就是对于CreateProcess而言,它先调用NtCreateProcess创建进程,然后调用NtCreateThread创建进程的第一个线程。Windows进程的用户空间一些重要的宏如下#define MM_HIGHEST_USER_ADD...原创 2019-07-02 10:13:12 · 1159 阅读 · 0 评论 -
内存管理----验证试验
由于对内存管理认识较浅 故通过试验重新巩固 并且 验证一下知识我们知道虚拟地址ADDR_TO_PDE(0xc0000000)可以获得本进程页目录表的虚拟地址位置。而MMU是根据cr3寄存器中的值来确定物理位置的,先验证下两者是否完全一致这里的实验地址就是0xc000-0000接着验证下0xc0000000的pte,其虚拟地址应该为(ULONG)ADDR_TO_PTE(0xc0000000)...原创 2019-06-30 13:50:13 · 270 阅读 · 0 评论 -
利用Ldr获得加载的DLL的基址
利用链如下:fs寄存器 -> TEB -> PEB -> PEB_LDR_DATA -> LIST_ENTRY -> LDR_DATA_TABLE_ENTRY -> BaseOfDllwindbg 用r命令查看fs寄存器的值根据fs段寄存器,我们找到它的GDTR,如下找到了GDT的索引为6对应的值gdt[6] = ffc093df`f000000...原创 2019-05-10 21:09:15 · 1453 阅读 · 0 评论 -
Windows内核情景分析 第二章 从用户空间发起系统调用的过程(仅供自赏)
系统调用/系统服务存在的需求从应用程序的角度看,内核的作用在于提供了一组可供应用程序调用的接口。这组调用我们称为“系统调用”。也可以认为系统调用是内核提供的一种服务。所以系统调用也称为系统服务。从程序运行的角度来看:进程是主动的,有活性的,是发出调用请求的一方。而内核是被动的,只是应程序的需求来提供相应的服务。从整个系统的角度看:内核也有活性的一面,只不过从应用程序本身是看不到的,隐形的。诸...原创 2019-05-15 16:22:49 · 865 阅读 · 0 评论 -
EPROCESS遍历进程
Windows为每一个进程都安排了一个EPROCESS的结构用于维护每一个进程,当然EPROCESS是属于内核管理的,所以只有ring0层的程序才可以访问这个结构,下面我们来看一下EPROCESS的结构是怎样的。kd> dt _eprocessntdll!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessL...原创 2019-05-07 12:44:06 · 1999 阅读 · 0 评论 -
Windows保护模式---x86内存寻址详细分析
概述x86下,为了描述段的详细信息,将段用一个64位的描述符(Segment Descriptor)来描述段。但段寄存器仍然为16位,但要描述段的信息显然是不可能的,所以段寄存器的16位就用来索引描述符的位置,并且系统 把所有段的段描述符顺序存放在内存的指定位置上,组成描述符表(DT)。故段寄存器中不再像16位那样直接表示段地址,而是仅仅作为一个索引,称x86的段寄存器为段选择子。段描述符表的...原创 2019-04-17 19:49:22 · 651 阅读 · 0 评论 -
调用门描述符
门描述符跟段描述符的结构不同。 1. 它指定要访问的代码段(选择子)。2. 它定义了在指定代码段例程的入口点(偏移)。3. 它指定了调用者尝试去访问例程所需要的特权级(DPL 这里是访问者所要具备的特权级)。4. 如果发生了栈切换,它指定了拷贝到新栈的可选参数的数量(5位最多32个)。5. 它定义了push到目标栈的值的大小:16位门强制16位push,32位门强制32位p...原创 2019-04-22 19:30:44 · 1505 阅读 · 0 评论 -
Windows磁盘结构分析-MBR主分区---扩展分区详解
0x0 准备工作我们使用Winhex来查看硬盘结构:选择Open Disk然后选择物理驱动器可以看到左边一列,Winhex显示详细的信息这是硬盘参数,依次为:model 型号Serial No 序列号Firmware 固件版本号Bus 磁盘接口类型第一个是状态信息,在不修改的情况下默认为original 原始的,否则是被修改过的state -> modified...原创 2019-04-23 22:52:23 · 11040 阅读 · 2 评论 -
Windows---diskpart命令的使用
diskpart是一个非常强大的磁盘管理程序,其强大不逊于其它第三方软件。cmd输入diskpart查看这些选项我们想要对某个磁盘建立分区或者建立新卷需要转移焦点即通过select命令转移我们的操作对象之类的。例如我现在想创建一个新卷那么我们执行以下操作首先看下我们的磁盘上面原有的卷选中磁盘建立新卷注意 此时我们还没盘符 需要之后指定一个盘符给它,并且diskpart很...原创 2019-04-24 15:33:10 · 1729 阅读 · 1 评论 -
PE文件结构剖析---基本结构
PE简介PE文件衍生于早期建立的COFF文件格式,EXE和DLL文件实际上用的是同一种文件格式,唯一的区别就是用一个字段标识出这个文件是EXE还是DLL。64位Windows格式为PE32+。只是简单的将以前的32位字段扩展到64位。重要要点要认识到PE文件不是作为单一内存映射文件被装入内存的。PE加载器通过遍历PE文件决定哪一部分被映射。磁盘上的数据结构布局和内存中的数据结构布局是一致...原创 2019-04-25 08:17:34 · 1202 阅读 · 0 评论 -
深入浅出操作系统的启动
首先获得调用链winLoad -> kiSystemStartup -> kiInitializePcr ->keStartAllProcessors -> kiInitProcessors系统启动时,Winload首先在实模式下分配一块内存,然后使用cli,屏蔽中断,然后利用LIDT命令,将idt表的长度和基址加载进CPU中,供CPU使用,然后将控制权交给入口函数,...原创 2019-05-04 23:52:06 · 1129 阅读 · 0 评论 -
中断门
中断门结构如下四个字节表示偏移量,Selector是段选择子,一般来说,lowOffset的下一个字节的值为0x8e或0xee。可以看到除了8e外,还有85的存在,这是任务门的存在。因为系统支持的中断向量是256个,所以在offset为0x100的地方可以供用户来编程#include <stdio.h>//定义几个全局变量,用以输出addr为0x8003f400un...原创 2019-05-05 01:10:31 · 369 阅读 · 0 评论 -
浅谈中断与异常
首先讲下硬中断和软中断的区别硬中断:硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。软中断:1. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。2. 通常,软中断是一些对I/O的请求。这些...原创 2019-05-08 13:33:38 · 5447 阅读 · 0 评论 -
SEH的介绍及实战
根据我们上节的异常讲解中,我们说过了SEH(Structured Exception Handler)是在无调试器接手的情况下,系统会遍历SE链,然后寻找相应的SEH函数来处理异常。首先稍微复习下我们的TEBkd> dt _tebntdll!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : ...原创 2019-05-08 17:17:04 · 9914 阅读 · 0 评论 -
深入理解SEH
KiDispatchException我们已经知晓,其内核态的异常分发主要靠检测“KiDebugRoutine”,是否拥有调试器来实现,然后根据RtlDispatchException来调用内核的SEH来处理。对于PreviousMode为userMode而言,其SEH和VEH链最后是由KiUserDispatchException来处理的,所以我们这次深入看看KiUserDispatchExce...原创 2019-05-08 23:16:19 · 2001 阅读 · 0 评论 -
LDM详解
管理动态磁盘的子系统是LDM,与MS-DOS分区(即上节所探讨的基本分区)不同,LDM有专门的数据库记录在动态磁盘的最后1MB中,所以要基本盘转动态盘的话要记得留有足够空间LDM子系统很大程度上提高了容错性,并且可以支持最多2000个卷,并且允许卷存在于不同的磁盘上。我们在动态磁盘中是对卷进行管理,而不是分区,这里要记住。卷分为简单卷(simple volume),跨区卷(spanned vol...原创 2019-05-06 16:47:51 · 21218 阅读 · 1 评论 -
KPCR
ring3下,fs寄存器的指向TEB,ring0下,fs寄存器指向KPCR,KPCR即Kernel Processor Control Region,处理器控制区域,因为Windows是需要支持多个CPU的,所以为每一个CPU在内核空间安排一个KPCR的结构。KPCR结构如下:nt!_KPCR +0x000 NtTib : _NT_TIB +0x01c Sel...原创 2019-05-06 18:29:41 · 481 阅读 · 0 评论 -
Windows内存管理---3
虚存页面的映射有了对一个虚存空间的管理和对物理页面的分配管理。下一步自然就是建立二者之间的映射了。页面映射,指从虚存页面到物理页面的映射。多个虚存页面可以映射到同一个物理页面上(例如系统那里,SharedUserData就是内核和用户空间的一块虚拟空间映射到了同一物理页面上),但是同一时间内不可能会有多个物理页面对应于同一个空间的同一个虚存页面上。虚存页面顾名思义是“虚”的,必须通过映射落实到...原创 2019-05-19 19:38:39 · 493 阅读 · 0 评论 -
Windows进程与线程---2
进程空间的格局的总结Windows用户进程空间的格局用户进程的最低地址为MM_LOWEST_USER_ADDRESS即0x10000,最高地址为MM_HIGHEST_USER_ADDRESS即0x8000 0000 - 0x10000 - 1为用户空间可访问的最大地址另外有一个特殊地址KI_USER_SHARED_DATA 在系统空间的0xffdf0000处 而用户是可以访问的 为此有...原创 2019-09-01 22:40:37 · 363 阅读 · 0 评论