
滴水
^卿^
他日若是凌云志,敢笑黄巢不丈夫
展开
-
41进程与线程之Windows线程切换——线程优先级
(1)、当前线程主动调用API:API函数->KiSwapThread->KiSwapContext->SwapContexti(2)、当前线程时间片到期:KiDispatchInterrupt->KiQuantumEnd->SwapContext(3)、有备用线程(KPCR.PrcbData.NextThread)KiDispatchInterr...转载 2019-12-05 01:03:07 · 244 阅读 · 0 评论 -
40 进程与线程之Windows线程切换——FS段寄存器
FS:[0]寄存器在3环时指向TEB.进入0环后FS:[0]指向KPCR系统中同时存在很多个线程,这就意味着FS:[0]在3环时指向的TEB要有多个(每个线程一份)。但在实际的使用中我们发现,当我们在3环查看不同线程的FS寄存器时, FS的段选择子都是相同的,那是如何实现通过一个FS寄存器指向多个TEB呢?下面是ida的分析SwapContext代码; CODE XREF: Sw...原创 2019-12-05 00:53:43 · 627 阅读 · 1 评论 -
进程与线程之Windows线程切换——TSS
SwapContext这个函数是Windows线程切换的核心,无论是主动切换还,是系统时钟导致的线程切换,最终都会调用这个函数。在这个函数中除了切换堆栈以外,还做了很多其他的事情,了解这些细节对我们学习操作系统至关重要。下面我们看看线程切换与TSS的关系。栈底开始往上0x210个字节存储浮点寄存器的值,以上都是TrapFrame结构(在api3环进0环已经讲过了)。调用API...原创 2019-12-05 00:45:23 · 806 阅读 · 0 评论 -
39 线程与进程之Windows线程切换——时间片
时钟中断会导致线程进行切换,但并不是说只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换:当前的线程CPU时间片到期 有备用线程(KPCR.PrcbData.NextThread)关于CPU时间片当一个新的线程开始执行时,初始化程序会在KTHREAD.Quantum赋初始值,该值的大小由KPROCESS.ThreadQuantum决定(观察ThreadQuantum大小...转载 2019-12-05 00:23:29 · 981 阅读 · 0 评论 -
38进程与线程之线程切换----时钟中断切换
绝大部分系统内核函数都会调用SwapContext函数,来实现线程的切换,那么这种切换是线程主动调用的。如何中断一个正在执行的程序?异常 比如缺页,或者INT N指令 中断 比如时钟中断Windows系列操作系统: 10-20毫秒 如要获取当前的时钟间隔值,可使用Win32API: GetSystemTimeAdjustment线程切换的几种情况:1) 主动调用AP...原创 2019-12-05 00:13:46 · 978 阅读 · 0 评论 -
37进程与线程之模拟线程切换
//ThreadSwitch.h#pragma once //最大支持的线程数#define MAXGMTHREAD 100 //线程信息的结构typedef struct { char* name; //线程名 int Flags; //线程状态 int Slee...原创 2019-12-04 21:40:01 · 198 阅读 · 0 评论 -
36 进程与线程之等待链表调度链表
进程结构体EPROCESS(0x50和0x190)是2个链表,里面圈着当前进程所有的线程。 对进程断链,程序可以正常运行,原因是CPU执行与调度是基于线程的,进程断链只是影响一些遍历系统进程的API,并不会影响程序执行。 对线程断链也是一样的,断链后在Windbg或者OD中无法看到被断掉的线程,但并不影响其执行(仍然再跑)。 1、33个链表...原创 2019-11-29 16:26:25 · 416 阅读 · 0 评论 -
35 进程与线程之KPCR
如果想逆向分析操作系统代码的,需要对段页的汇编代码熟悉,还需要知道三个结构体,进程结构体EPROCESS,ETHREAD,KPCR下面来介绍KPCRKPCR是描述CPU的,准确说是描述当前正在运行的CPU的数据。1、KPCR介绍1) 当线程进入0环时,先切换FS,因为FS指向TEB。FS:[0]指向KPCR(3环时FS:[0] -> TEB)2) 每个CPU都有一个KPCR...原创 2019-11-29 16:01:37 · 409 阅读 · 0 评论 -
35 进程与线程之线程结构体
上节课我们说了EPROCESS,这次我们讲讲线程结构体ETHREAD使用dt _ETHREAD查看线程结构体内容dt _ETHREADntdll!_ETHREAD +0x000 Tcb : _KTHREAD +0x200 CreateTime : _LARGE_INTEGER +0x208 ExitTime :...原创 2019-11-29 15:39:06 · 712 阅读 · 0 评论 -
34进程与线程之进程结构体
前言:操作系统创造进程和线程,实质就是构建一个结构体。一、进程结构体EPROCESS 使用命令查看:dt _EPROCESS PEB也是描述进程的一个结构体,但是是提供给3环使用的,而不是0环。每个windows进程在0环都有一个对应的结构体:EPROCESS 这个结构体包含了进程所有重要的信息。 成员之KPROCESS +...原创 2019-11-29 15:39:18 · 727 阅读 · 0 评论 -
33 Windows保护模式学习笔记(十四)—— 阶段测试
题目一描述:给定一个线性地址,和长度,读取内容int ReadMemory(OUT BYTE* buffer,IN DWORD dwAddr,IN DWORD dwLength);要求:可以自己指定分页方式。 页不存在,要提示,不能报错。 可以正确读取数据。解题步骤略(待补充)题目二描述:申请长度为100的DWORD的数组,且每项用该项的地址初始化 把...原创 2019-11-29 14:41:53 · 234 阅读 · 0 评论 -
32 控制寄存器
1、控制寄存器 控制寄存器用于控制和确定CPU的操作模式。 Cr0 Cr1 Cr2 Cr3 Cr4 Cr1 保留 Cr3 页目录表基址2、Cr0寄存器说明:1、PE:CR0的位0是启用保护(Protection Enable)标志。PE=1保护模式 PE=0 实地址模式 这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE...原创 2019-11-29 14:41:45 · 233 阅读 · 0 评论 -
31-中断和异常
在经过了大量的学习和实践后,今天终于可以抛出这个沉重的话题了。不少操作系统相关的书籍喜欢很早就在书上给什么是中断,什么是异常下了一个让人抓狂的定义,可是这对初学者来讲真的不适合。1. 中断1.1 中断的概念看到这个标题,你肯定联想到之前我们学习过的中断门、中断描述表这些概念。如果把中断门玩溜了,肯定也知道int N这条汇编指令。不过我想告诉你的是,通过int N指令完成的中断,并不叫中...转载 2019-11-28 12:40:46 · 553 阅读 · 0 评论 -
30-TLB(实验)
还是老办法,实践出真知。上一篇已经介绍了 TLB 的有关概念。你已经知道,它无非就是位于 CPU 内部的一个数组,它保存了线性地址和物理地址的直接对应关系,以及页属性等信息。CPU 在做线性地址转换的时候,首先会去 TLB 中查找它对应的物理地址,如果找不到,才会根据 CR3 寄存器去查找页目录、页表。本篇的实验,主要是为了验证 TLB 本身的存在。为什么说是验证?因为 CPU 本身并...转载 2019-11-28 12:38:01 · 327 阅读 · 0 评论 -
29-TLB
基本上到了这里,保护模式已接近尾声。不过,仍然有一些边角和细节需要你去掌握和理解。前面的文章里,尚有一些遗留的问题,比如页属性,并未介绍完,什么是 G 位,什么是 PWT,什么是 PCD?在解释这些东西之前,TLB(Translation Lookaside Buffer) 这个东西不讲,对不起这个博客,对不起阅读保护模式的读者。TLB 由来中译名为快表。经过前面大量的学习和实践,...转载 2019-11-28 12:34:32 · 235 阅读 · 0 评论 -
27-PAE分页(实验)
PAE 分页实验实验代码这段代码非常简单,就是查看一下字符串Hello, I'm PAE!的线性地址是多少。注意程序会在 getchar() 处停下,这时候千万别回车,否则程序会运行结束。最终,在我屏幕上打印的线性地址是0x00423024. 见图2.// 文件名:PAE.cppint main(int argc, char argv[]){ char st...原创 2019-11-28 12:25:36 · 231 阅读 · 0 评论 -
26-PAE 分页
相信你已经对三段式分页掌握的非常熟练了。可是你有没有意识到,这种线性地址到物理地址的映射方式,存在着某种局限性?它能够映射的最大的物理地址,也只能是0xffffffff. 原因在于,PTE 中的高20位保存的是页号,最大能保存的页号是0xfffff,每个页占用4KB,所以页号为0xfffff的物理页的物理偏移是0xfffff000.每次说保存的是页号,其实有点烦了。因为把 P...转载 2019-11-28 12:22:37 · 286 阅读 · 0 评论 -
25-PDT/PTT基址(实验与分析)
上一篇,我们分析了PDT的基址是 0xc0300000。这个地址拆分成三段式就是300-300-000. 用大白话说就是页目录表的第0x300号PDE指向的页表PTT768中的第0x300号PTE指向的物理页。图1 PTT768C0300000分析0xc0300000拆成三段式300-300-000。所以我们可以在 WinDbg 中查找页目录表的第 0x300 号PDE...转载 2019-11-28 09:40:26 · 920 阅读 · 0 评论 -
23-不提权读取高2G内存
我知道,就算我不写这篇文章,你也知道怎么做。可是,不管怎样,我还是得让这篇博客刷刷访问量。测试代码int main(int argc, char argv[]){ int p = (int)0x8003f00c; getchar(); printf("%08x\n", p); return 0;}实验修改 PDE、PTE上面的测试代码在 V...转载 2019-11-28 09:39:35 · 324 阅读 · 0 评论 -
22-物理页属性-U/S-PS-A-D
上一篇介绍了物理页的 P 属性和 RW 属性。本篇介绍 U/S、PS、A、D。1. PDE、PTE 结构PDE 结构|<------ 31~12------>|<------ 11~0 --------->| 比特 |b a 9 8 7 6 5 4 3 2 1 0| |--------------------|-|-|...转载 2019-11-28 09:39:21 · 387 阅读 · 0 评论 -
20-读写空指针
有不少人看到这个标题会说,博主疯了,走吧走吧,不看了。学过 C 语言的人都知道,0 地址是不可能被读写的。为了能够狡辩,我不得不提前把实验结果贴在下面。图1 读写空指针请原谅我,无论你在自己的 VC6.0 执行多少次,你都不会成功,但是我成功了。我确实做了手脚。难道你不想知道吗?聪明的你也许根本不需要继续往下读,就能完成这个功能(如果你真的搞定了前面的分页知识的话)。...转载 2019-11-27 23:08:30 · 319 阅读 · 0 评论 -
18-线性地址转换实验
概述上一篇介绍了有关页的概念,以及线性地址转换物理地址过程。受于篇幅限制,抱歉我把实验部分放在了这里。如果你觉得上一篇看完还是晕晕的,那这里的实验希望你能好好做一下。实验内容很简单,用 malloc 申请一段内存,然后往这段内存写点数据,顺便查看下申请的这段内存的地址是多少,接着,中断到 WinDbg 中,使用线性地址转换方法,找到这个线性地址对应的物理地址,并验证这段物理地址中保存的数据...转载 2019-11-27 22:53:45 · 169 阅读 · 0 评论 -
17-分页
1. 概述苦苦挣扎几近半月,保护模式中的段的篇章基本结束。迈过这个坑,踏过这个坎,前方还有千千万万个坑。只要坚持,一定可以走完。本篇开始进入新的篇章——页。不得不说,页在现代操作系统中起着无法动遥的地位,是实现现代操作系统的重要基础(当然,段也很重要)。你完全可以不用理解这句话,因为到目前为止,我们并没有进入操作系统正题。2. 逻辑地址、线性地址与物理地址咳咳咳…一下子冒出这么...转载 2019-11-27 22:48:23 · 1051 阅读 · 3 评论 -
16-任务门实验
在《TSS切换实验》中,我们已经完成了使用 call 模拟了 TSS 的第二个功能——替换一堆寄存器。上一篇中,提到了任务门同样可以完成这个功能。本节主要通过设计任务门描述符以及INT指令来完成TSS的第二个功能。思路编写测试入口函数,把它的函数入口地址填写到 TSS 段中 构造 TSS 段 设计 TSS 段描述符,安装到 GDT 表 设计任务门,安装到 IDT 表 编写主函数...转载 2019-11-27 22:42:22 · 205 阅读 · 0 评论 -
15-任务门
1. 任务门上一节已经基本掌握了使用call/jmp去访问一个任务段,来达到切换一堆寄存器的目的。但是,CPU同时又提供了另一种方法让我们访问任务段——任务门。而任务门是安装在 IDT 表中的。之前学中断门的时候,就简单介绍了IDT表中可以安装中断门、陷阱门,还有一个当时只是稍微提了一下,那就是任务门。说白了就是想表达,IDT 表中只可以安装 3 种门:中断门、陷阱门和任务门。...转载 2019-11-27 22:36:15 · 139 阅读 · 0 评论 -
14-TSS切换实验
概述前面讲述了TSS有两个功能,提权的时候切换栈,需要用到TSS,另外执行 call/jmp 访问TSS段的时候,可以切换一堆寄存器。本节主要进行一个实验,来模拟第二个功能。实验思路编写测试入口函数 构造TSS 设计TSS段描述符并安装编写测试入口函数CPU利用 TSS 切换一堆寄存器后,转而就去执行 eip 所指向的指令,为了能够让CPU执行自己的代码,我们需要编写一...转载 2019-11-27 22:31:15 · 435 阅读 · 0 评论 -
13-任务状态段(TSS)
1. 任务状态段不要被名字所吓倒,它不过是一块位于内存中的结构体而已。有一点需要注意的是,不要把它和任务切换关联起来(切记),否则你会被搞晕,它只是位于内存中的一段数据。Intel 白皮书给出TSS在内存中的图是这样的,它保存了一些重要的值。抽象成结构体就是下面这个样子。typedef struct TSS { DWORD link; // 保存前一个 TSS 段选择子...转载 2019-11-27 22:23:46 · 429 阅读 · 0 评论 -
12-陷阱门
1. 陷阱门的结构| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字节|76543210|76543210|7 65 4 3210|76543210|76543210|76543210|76543210|76543210| 比特|-----------------|1|--|0|...转载 2019-11-27 22:20:45 · 198 阅读 · 0 评论 -
11-中断门
使用调用门进行提权,本篇的中断门显的更加重要。因为在 Windows 中,大量使用了中断门。1. 中断门的结构| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字节|76543210|76543210|7 65 4 3210|76543210|76543210|76543210|7...转载 2019-11-26 22:12:33 · 257 阅读 · 0 评论 -
10-调用门(有参)实验
int g_a, g_b, g_c;declspec(naked) void getParam(int a, int b, int c) { asm { // int 3 // 取消注释可以在WinDbg中看R0栈数据 pushad // 0x20 B pushfd // 0x04 B // .- ...转载 2019-11-26 10:02:56 · 262 阅读 · 0 评论 -
9-调用门(无参)
1. 概述本篇,将真正的实现提权——当前特权级从 3 变为 0.当然,CPU 不会让你就这么简单的从 3 环跨到 0 环。但是,CPU 又必须提供一套方法,来让你完成这个功能。前面讲过。DPL = 0 的非一致代码段,是绝对不允许不同特权级的程序跳转进来。可是,我给以给你开个后门,让你进来,然后给你最高权限,允许你胡作非为。这个后门,必须由我(操作系统)来指定,而且只允许你跳转到我...转载 2019-11-26 09:54:02 · 370 阅读 · 0 评论 -
7- 代码段权限检查与 jmp
概述这一篇 hin 重要。一般来说,我们在 Windows 中写的代码,都运行在 3 环(应用层)。只有在调用一些系统接口的时候,或者中断等情况的时候,才会进入 0 环(内核)。为什么 CPU 要给代码赋予不同的权限?这是为了防止你任意妄为。在 Windows 中,如果你随意更改了内核的重要数据,操作系统必然面临着危险——蓝屏。为了防止这种情况发生,CPU 把执行权限分成了4个等级...转载 2019-11-25 22:01:57 · 400 阅读 · 0 评论 -
6-数据段权限检查
不妨先来做个实验。打开 OD,双击第一行,把代码改成mov ax, 0x20; mov ds, ax,然后按两下 F8 键(单步),发现很正常。如果你把代码改成mov ax, 0x10; mov ds, ax,按两下 F8 后,代码跳转到了一个地址以 7 开头的地方去了。图1 这两行可以正常执行图2 第二行不能正常执行图3 图2中的代码执行异常会...转载 2019-11-25 00:01:10 · 320 阅读 · 0 评论 -
5-特权级
CPU分级处于保护模式下的 CPU,有4种运行级别。图1 CPU不同运行级别围绕在最中心的那个圆心,叫 Ring 0,中文叫 0 环,这里运行特权级最高的代码。我在这里避免说这个级别运行操作系统内核,这是因为这是给设计操作系统的人看的。就目前来看,我不还不要和操作系统拉上关系,因为知识还不够。中间的 1 环和 2 环很少使用。最外层的 3 环,是运行级别最低的。怎...转载 2019-11-24 21:19:48 · 143 阅读 · 0 评论 -
4-段描述符属性分析
段描述符结构| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字节|76543210|7 6 5 4 3210 |7 65 4 3210|76543210|76543210|76543210|76543210|76543210| 比特|--------|-|-|...转载 2019-11-24 21:09:35 · 212 阅读 · 0 评论 -
3-段选择子与段描述符结构
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.youkuaiyun.com/q1007729991/article/details/52538080</a>看完了上一篇,我已经猜到了你一脸懵逼的表情。什么段寄存器,什么段选择子,什么段描述符,你这讲的都是啥啊!!!0. 回顾先来回顾一下,上...转载 2019-11-24 20:20:07 · 378 阅读 · 1 评论