随笔分类 - window系统底层
摘要:句柄降权 通过设置进程内核对象EPROCESS的Object钩子进行句柄降权,没什么好说的。 设置系统关键进程 调用RtlSetProcessIsCritical/NtSetInformationProcess设置EPROCESS. BreakOnTermination。调用TerminatePro
阅读全文
摘要:虚拟机架构分类 I型原生架构 原生架构也叫裸金属架构或者裸机架构,其通过直接在cpu处理器硬件上运行虚拟机监控程序,进一步使用处理器扩展(Intel VT-x和AMD-V)来运行虚拟机。这时候计算机所有运行的操作系统(包括根操作系统)都相当于是虚拟机。Hyper-V,VMware ESX,Xen,K
阅读全文
摘要:前言 windows内核中的对象会受到保护,每个对象都有自己的安全描述符(Security Descriptor),安全描述符用来描述此对象可以允许谁,以何种方式访问。而访问这些对象的主体就是进程和线程,每一个进程都有自己的令牌Token,此令牌就是此进程或线程的安全上下文表示此进程或线程属于哪个用
阅读全文
摘要:前言 windows vista版本引入了“受保护进程”的概念(PP),目的是为了保护媒体内容并符合DRM(数字版权管理)要求。Mircrosoft开发了此机制使受信任的媒体播放器可以访问高品质例如蓝光的文件,而防止其他程序访问和复制这些内容。在Windows 8.1(NT 6.3)中又对受保护的进
阅读全文
摘要:Windows内核对象 Windows内核中万物皆对象,并通过对象管理器(内核组件)管理这些对象。例如进程内核对象,线程内核对象,文件内核对象,设备内核对象,互斥量内核对象等,每一个对象都有其所属的对象类型_OBJECT_TYPE。 内核对象的内存布局 内核对象的内存布局包含了POOL_HEADER
阅读全文
摘要:句柄是什么 windows内核中万物皆对象,每个对象都有其对应的内核对象。因为应用层是不能直接读写内核空间的,windows系统通过为进程分配与内核对象对应的句柄并赋予一定的权限,使应用层通过这些句柄间接访问对应的内核对象并对权限进行严格的控制。 句柄表 windows为进程分配的句柄都存放在句柄表
阅读全文
摘要:函数转发 PE文件的导出表主要由三部分组成:导出名称表ENT,导出序号表和导出地址表EAT。导出名称表中存放的是导出函数对应的名称字符串的RVA,导出地址表中存放的是导出函数的函数地址的RVA,而导出序号表中就是用来连接导出名称表和导出地址表的。导出名称表和序号表一一对应,而序号表中存放了对应的导出
阅读全文
摘要:# windows写时复制流程 ## 处理流程  1.当指令试图写入一条地址时,cpu会先判断此虚拟地址对应的PTE
阅读全文
摘要:指令碎片化 在Inline Hook时一般在需要HOOK的函数头部写入jmp指令,然后jmp指令跳转到Detour函数中。但是因为inline hook函数的头部代码形式多样,写入jmp指令需要5个字节,但是有可能修改5个字节后会出现指令碎屑。这样如果执行完Detour函数后接着hook后的代码执行
阅读全文
摘要:输入法注入原理 IME输入法实际就是一个dll文件(后缀为ime),此dll文件需要导出必要的接口供系统加载输入法时调用。我们可以在此ime文件的DllMain函数的入口通过调用LoadLibrary函数来加载需要注入的dll。 输入法注入实现 ime文件需要导出必要的接口函数。 ImeConver
阅读全文
摘要:堆的定义 堆其实就是预定于的一块虚拟地址空间,一个进程在初始化时系统会自动创建一个默认堆,当然进程可以含有多个堆,并且一个堆是可以自动增长的。 堆与虚拟内存的区别 虚拟内存通过VirtualAlloc函数传入MEM_RESERVE预定一块区域,但此时并不能访问此块区域,因为此块内存地址空间并未调拨物
阅读全文
摘要:线程同步内核对象 操作系统进行进程间同步是利用信号量机制。对于windows系统而言,可以利用一些内核对象进行线程同步,因为这些内核对象可以命名并且属于系统内核,所以可以支持不同进程间的线程同步进而实现进程间同步。例如:事件对象,可等待的计时器对象,信号量对象,互斥量对象。 事件对象 事件对象分为手
阅读全文
摘要:线程本地存储(TLS) 对于多线程应用程序,如果线程过于依赖全局变量和静态局部变量就会产生线程安全问题。也就是一个线程的使用全局变量可能会影响到其他也使用此全局变量的线程,有可能会造成一定的错误,这可以通过线程同步机制解决当然也可以通过线程本地存储解决。线程本地存储意思是每一个线程在使用全局变量的时
阅读全文
摘要:Windows套接字 Windows套接字即socket,通过socket可以实现在不同的进程间通信,甚至这两个进程可以不在同一个计算机中。 Winsock使用步骤 服务端 socket初始化 创建套接字 绑定和监听端口 因为是本地连接,所以监听地址为0.0.0.0。 接着就调用accept()接收
阅读全文
摘要:WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯。 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessage发送WM_COPYDATA消息。因为系统必须管理用以传递数据的缓冲区的生命期,如果使用了PostM
阅读全文
摘要:对象的分类 Windows的对象可以分为三种,分别是用户对象,GDI对象和内核对象。系统使用用户对象支持窗口管理,使用GDI对象支持图形,并使用内核对象支持内存管理,进程执行和进程间通信(IPC) 。Windows通过句柄来标识各个对象资源。 区别 内核对象属于操作系统内核,存在于内核空间中不属于某
阅读全文
摘要:消息队列 windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息。这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建一个线程消息队列,然后系统会从系统消息队列中取出一个消息放到对应的线程消息队列中。之后通过消息循环从
阅读全文
摘要:服务 Windows NT操作系统是基于客户/服务器模式的(C/S)。将操作系统中最基本的部分放到内核中,而把操作系统的绝大多数部分都放到微内核外面的一组服务器(进程)中实现。如对进程管理的进程管理服务器,对虚拟存储器管理功能的虚拟存储器服务器,对I/O设备管理的I/O设备管理服务器,他们都是通过进
阅读全文
摘要:内核对象 内核对象实际就是一块内存,其包含一些数据结构被操作系统使用用来控制和管理对应的内核对象。因为是内核对象,所以此内存的地址空间位于内核中(也就是高地址中)。因为对于每一个进程来说其内核部分的地址空间每次映射的都一样,所以一个进程中创建的内核对象在其他进程的内核地址空间中也是存在的,因此说内核
阅读全文
摘要:Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的。 当EXE文件第一次被加载。 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间。 系统调用CreateFile打开对应的exe文件。 根据PE文件的路径创建文件映射对象,调用CreateFi
阅读全文