《Windows DIY》:play with Windows
phpskycn2014/01/02软件综合 IP:北京
本帖最后由 phpskycn 于 2014-1-4 13:30 编辑

这是一篇原创的系列文章,这里是目录。
由于是抽空写的,可能在我的博客上更新得更快一些,在这里发的时候可能会做出一点修正。
有时候,可能两个星期都不更新,有时候可能一天更新很多……
【目录】
20140103 第一次编辑
绪论
1.1概述
+9  科创币    kc地毯清洁员    2014/01/03 所有分数了
来自:计算机科学 / 软件综合
6
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
phpskycn 作者
10年5个月前 IP:未同步
661109
《Windows DIY》序:play with the Microsoft Windows


自第一次通过编程和windows打交道,已经过去了四年。从最初通过MFC中封装的函数到所谓的"Native API",再到现在直接进入内核,甚至对内核的bin进行修改。在这一过程中,和系统打交道的方式,从最初通过经封装的函数,到之后直接调用Windows提供的“应用程序编程接口”(API),最终对内核的原理与体系有所了解之后,直接操作内核本身。在这一过程中,通过学习内核的原理与体系,对Windows的各种体系也有了自己的理解。在此,谨以此文献给准备接触,或者刚接触Windows编程的新人。



#涉及的内容

本文将从任务管理(进程、内存)、内存管理、系统机制(内核对象、句柄、系统服务调用)等方面,从用户层(ring3)和内核层(ring0)来介绍Windows编程。在用户层,我们通过Windows提供的各种编程解接口来和系统“打交道”,之后介绍这些编程接口将相关请求转发给内核的机制(系统服务调用)作为从用户层向内核层的过度,之后则是在内核中的具体实现过程。本文不是介绍Windows内核体系的文章,所以不会涉及到Windows的每个方面。

在介绍相关内容的时候,会包含一些有实用价值的例子,主要是各种hook,这是安全软件、病毒、外挂常用的方法。




#适合的读者与基础知识要求

本文适合已经学习完C语言,并对Windows编程有兴趣的读者,当然C++也可以,除此之外,并无其他要求。当然,读者需要熟练掌握指针和结构体的使用。

文章中会或多或少地涉及到汇编语言、IA32架构等知识,本文会稍作补充,并给推荐一些相关的学习资料。




#开发环境

本文讨论的内容限定在32位的Windows下,所有相关代码使用Microsoft Visual Studio 2010 with SP1编译、测试。在没有特别指出的情况下,适用于Windows XP - Windows 7之间的所有非服务器版Windows。对于某些版本的Windows下需要注意的地方,也会特别指出。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
fuwen0202
10年5个月前 IP:未同步
661121
呃,先来个目录好不好,,,
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn作者
10年5个月前 IP:未同步
661140
《Windows DIY》第一章: 概述
操作系统(英文:Operating System,缩写:OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。[1]










1.1什么是操作系统

1.1.1没有操作系统的时代

        在介绍什么是操作系统前,先来看一下没有操作系统时的情形。

        假如我们希望从硬盘上读取一个文件(路径已经指定),首先要通过查分区表和文件表得到文件所在扇区,然后控制硬盘去访问指定的扇区将数据读取到内存,当然这些表也在硬盘中,首先得按照文件系统的约定去操作硬盘读取相应扇区以访问这些表。这一过程繁琐而又无聊,并且带来了许多不必要的麻烦:首先程序员需要了解各种硬件是如何工作的,还要编写代码去控制它们,另外,不是所有硬件都像硬盘那样遵循一定的标准,这种情况下等于在一定程度上软件"绑架"了硬件--程序只能在符合自己要求的硬件上工作。

        没有操作系统的时候,计算机通常处于被软件“霸占”的状态:一个程序占据着计算机的所有资源,如果想要执行另外的程序,除非两个程序间存在事先约定好的接口,不然只能由人工操作。这在几十年前计算机十分昂贵仅用于特定任务并有专人维护时并无大碍。但在计算机已经微型化的今天是完全不可想象的。

1.1.2操作系统的任务和功能

        在上一章中,我们已经看到了缺乏操作系统时的困境。在没有操作系统的时候,所有软件都必须和硬件直接打交道,这导致了一系列的问题。因此,人们设计了一种叫操作系统的软件,由它负责管理各类硬件,使得其它程序从这些繁重的任务中解脱出来(这时程序运行在操作系统上,只要程序符合操作系统的规范即可正常运行,无需过于在意硬件)。后来,操作系统的功能逐渐拓展,拥有了任务调度功能,可以管理运行在操作系统中的程序,最终实现“多任务”(多个程同时在一个操作系统上运行)。





对于现代的PC或者服务器上的操作系统,通常具备以下任务和功能:

A.硬件管理:

a1内存管理

a2中断管理

a3外部设备(声卡、显卡、网卡、硬盘等“不属于cpu本身的硬件资源,通常通过驱动程序扩展)

B.任务管理

b1任务调度

C.系统调用(将涉及底层硬件交由操作系统实现的功能通过系统调用的形式提供给第三方应用程序使用




1.2Windows NT

Windows是目前主流的PC和中小型服务器操作系统,市场占有率超过95%,自从Windows XP之后,PC与服务器版本均基于Windows NT内核。内核是操作系统的核心组件,负责实现操作系统最核心的功能。Windows NT 提供了上一节所述的全部功能,以及一套图像用户界面(GUI),一套文件系统(FS),其将任务抽象为进程和线程来管理,并且提供了一套应用程序编程接口(API,其本质就是系统调用)供应用程序使用。

更重要的是,Windows利用处理器的权限管理、虚拟内存实现了一套安全机制,以实现对单一应用程序的控制,使其无法直接控制硬件或是干扰其它程序的运行。

上个世纪,Microsoft Windows NT被定义为服务器和工作站使用的系统,而PC使用的系统则为基于DOS演化而来的另一个系列(大家熟悉的Windows 95、98皆属于此)。进入21世纪后,两个系列合二为一。大多数熟知的Windows版本和“NT版本号”对应关系如下:

版本                                        版本号                            发布时间

Windows XP                           5.1                                   2001年

Windows Server 2003            5.2                                   2003年

Windows Vista/Server 2008   6.0                                   2006年/2008年

Windows 7/Server2008R2     6.1                                   2009年

Windows 8/Server2012          6.2                                   2012年

Windows 8.1/Server2012R2  6.3                                   2013年




1.3Windows NT的系统架构

这一节简单介绍Windows NT的系统架构和组成,其基本架构如图【1-1】所示:
windows.jpg
【图1-1】

        从图中不难看出,Windows NT系统首先可以被分为两部分:工作在用户层的一系列dll和工作在内核层的系统内核以及其它组件。前者向用户应用程序提供了一套统一的文档化的应用程序编程接口(API)来调用系统功能,其运行在CPU的非特权模式下(无法执行特权指令)。后者则工作在CPU的特权模式下(可以执行特权指令)。

从整个系统来看,系统内核(ntoskrnl.exe,内核的映象名会随CPU与电源管理模式不同而有所变化)是整个操作系统的神经中枢。顾名思义,系统内核负责实现整个系统中各种请求与资源的管理,并且在某些方面直接管理着硬件(主要是CPU和内存),所有来自用户层的请求都将经过内核的处理后,直接返回或者转发给其它组件。

硬件抽象层(hal.dll)负责将一些硬件“抽象地”提供给内核,以屏蔽不同硬件间的差异,它也会直接控制某些硬件。

大部分与硬件相关的管理工作则由设备驱动程序完成,设备驱动程序在工作的时候与内核的设备管理器(未列出)协同,Windows NT实现了一套设备驱动程序编程框架和模型,并且提供了大量与基础硬件相关的设备驱动程序。

Windows子系统(XXXXXXXXXs)则作为内核的一个附加模块,负责实现Windows中的图形化用户界面(GUI)和相关功能。

在内核层之上,则是一系列的系统DLL(动态链接库),其中最“底层”的是ntdll.dll和user32.dll,它们的任务是直接将请求通过系统服务调用-分发机制传递给内核,其中后者只是负责实现和GUI相关的功能。这两个DLL通过导出函数的形式向外界提供了一系列的功能,但是这些函数是未文档化的,被称为Native API(原生API),未文档化的意思即为这些API不可在编程时直接调用(未在Windows SDK的头文件中定义),并且无法保证这些API不会随着系统的变化而发生改变。

最后位于最上层的是user32.dll和comctl32.dll,它们向用户应用程序提供统一的编程接口(API),当然这些API是文档化的,前者提供的是那些基础的API(如内存管理、文件管理),后者则和GUI相关。

(ps:其实这些DLL间的调用关系比图中更加复杂,并且为了简化逻辑这里还省略了gid32.dll)。

通过本节可以了解到,当一个用户应用程序调用API请求系统为其实现某个功能后,首先它们根据功能需求调用了native api,natibe api将请求转发给系统内核,系统内核则负责将请求直接完成或交给某个内核中的组件去实现。

通过这套机制,应用程序无法直接控制硬件,并且在请求的路径上会经过多次安全检查,这是Windows NT系统安全的基石。

另外,并不是所有的API都会最终通过Native API调用内核中的功能,当这个API只需要返回位于用户进程空间内存中的某些数据时,它就不会这样做。

引用:

1.中文维基百科:操作系统

XXXXXXXXXXXXXXXXXXXXXXX/zh-cn/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn作者
10年5个月前 IP:未同步
661142
fuwen0202 发表于 2014-1-2 23:32
呃,先来个目录好不好,,,


已补目录,多谢提醒
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn作者
10年4个月前 IP:未同步
663078
期末考完了……
以下为第二章第一部分的草稿,由于最近要出去一趟可能会比较慢。
在一个章节内讲明白汇编是比较困难的,但是可以将要求放低一点:让读者学会如何阅读、理解汇编代码

《Windows DYI》第二章:IA32体系架构与汇编语言

虽然Windows NT在早期是为多个硬件平台设计的,但是在2000年以前,其所支持的硬件平台只有Intel的IA32架构保留了下来并得到发展,因此目前Windows NT主要支持的硬件平台只有IA32。(ps:在Windows NT 6.x之后,已经支持ARMv7,但是这里不作讨论)

2.1 IA32体系架构

IA32体系结构曾被称作X86,但是X86的概念过于广泛且不够清晰(Intel部分16位产品也属于X86架构)。1985年,随着Intel 80386微处理器的上市,(IA32)被公诸于世。[1]

通常认为,在之后基于IA-32架构的处理器在指令集上保持向前兼容,即仅添加新的指令而不会修改原有的指令。2004年之后推出的IA32E架构是IA32的64位扩展,但是依然保留了对IA32的软件兼容能力。

本文的前半部分仅关注在用户层下的系统编程模型,因此将不会过多地介绍IA-32架构中和系统管理相关的内容,这些内容无法在用户层下实现。




2.1.1寄存器

寄存器(Register),是中央处理器内的其中组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器。[2]

在IA32架构的处理器中,寄存器分为下类类型:

1.通用寄存器(EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI):均为32为长度。“通用”的意思即为这些寄存器可用于缓存数据,打部分的指令也支持操作这些寄存器,但是这些寄存器器都有一些特定的用途。

2.标准寄存器EFLAG:32位长,用于存储各种标志。这个寄存器中的标志由影响这些标志的指令自动设置。

3.指令指针寄存器EIP:32位长,指示下一条将执行的指令在内存中的位置。

4.段寄存器(CS、DS、ES、FS、GS、SS):均为16位长,用于实现段寻址,但是Windows NT使用的是“平坦”内存模型,段机制对于RING3的程序来说不用关心。

5.调试寄存器(DR0-DR7):均为32位长度,用于硬件实现的调试机制。

6.控制寄存器(CR0-CR3):均为32位长度,用于控制CPU的某些行为或其他特定用途,RING3下不需要关心。

7.任务寄存器MSR:均为32位长度,用于控制CPU的某些行为或其他特定用途,同样RING3下不需要关心。

8.用于指示某些表的指针的寄存器(LDTR,GDTR,IDTR):32位长,指示某些和CPU功能相关的表的位置,同样RING3下不需要关心。




可以看出,在用户层下,我们只需要关注8个通用即可,其它寄存器大多无法直接操作甚至是无法直接访问。

IA32架构的处理器中的八个寄存器都可以被拆分为高16位和低16位两部分单独操作,其中前四个(r0-r4)的低16位也可以拆分为两个8位部分单独操作。

寄存器编号             寄存器名           低16位部分别名              低16位部分中高8位别名               低16位部分中低8位别名                   定义/特殊用途

r0                             EAX                       AX                                     AH                                                 AL                              累加器

r1                             ECX                       CX                                     CH                                                 CL                             循环计数器

r2                             EDX                       DX                                     DH                                                 DL                             数据拓展寄存器,某些指令将无法在32位长度内储存

                                                                                                                                                                                                 的结果存储在EDX中

r3                             EBX                       BX                                     BH                                                 BL                              基址寄存器,寻址时用于存放基址

r4                             ESP                       SP                                     NA                                                 NA                              栈指针寄存器,指示栈顶的位置

r5                             EBP                       BP                                     NA                                                 NA                              栈基指针寄存器

r6                             ESI                        SI                                       NA                                                 NA                              源索引寄存器,用于字符串操作

r7                             EDI                        DI                                       NA                                                 NA                              目的索引寄存器,用于字符串操作




2.1.


引用:

1.中文维基百科 IA-32:XXXXXXXXXXXXXXXXXXXXXXX/wiki/IA-32

2.中文维基百科 寄存器:XXXXXXXXXXXXXXXXXXXXXXX/wiki/%E5%AF%84%E5%AD%98%E5%99%A8


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金坷居士
10年4个月前 IP:未同步
666568
QQ图片20140130155342.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
phpskycn
专家 老干部 学者 机友 笔友
文章
402
回复
4591
学术分
8
2009/03/15注册,5天11时前活动

CV

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}