6. windows内核基础

一、前言

虽然我个人觉得这么早就直接进入内核学习对新学者并不太友好,但《加密与解密》一书中就是这么安排的,我这里也就这样照做的。

可能是由于这本书由多人编写的缘故,不同章节之间其实存在着很强烈的撕裂感。

比如前面64位与32位逆向分析技术,原本应该是前呼后应的关系,但在书中却明显是两者在单独进行介绍。

二、了解内核

现代操作系统一般分为应用层和内核层两部分,应用层的进程可以通过系统调用进入内核,由系统底层完成相应的功能,此时内核执行处在该进程的上下文空间中。

还有内核处理某些硬件发送来的中断请求,代替硬件完成某些功能,那么此时内核就处在中断的上下文空间中。

本文多要谈论的内核,指的是系统内核本身、以及第三方软件以内核模式加载的驱动文件。

这段话看起来似乎很麻烦,这里简单举个例子理解一下。

我们在代码中想要读写文件,无论你是什么语言,只要在windows系统中就必定要调用WriteFile之类的win api函数,这就是内核暴露给我们的函数,也就是系统调用,除此之外,你并不能自己重新写个函数来读写系统中文件数据。

而调用这个函数进去执行一些代码,就可以看作是一个进入内核的过程,只不过这个过程对于我们而言是不可见的。

这种行为可以让系统能够更稳定的运行:你只能通过我提供的相关函数来有限度的做相关操作

1.权限级别

系统内核层,又被称为零环(Ring 0,简称R0)。

与之对应的应用层被称为3环(Ring 4,简称R3)。

这两个级别实际上是CPU中4个运行级别中的两个,CPU设计者将CPU的运行级别从内向外分为了4个,依次为R0、R1、R2、R3,其权限等级依次下降。

也就是说,R0拥有最高的执行权限,可以为所欲为,而R3为最低的执行权限,只能完成部分行为。

CPU设计制造商设计之初是让R0运行内核,R1、R2运行设备驱动,R3运行应用程序。

但实际上,操作系统设计者和开发商为了简单(比如windows、linux系统),并没有使用R1、R2,而是直接让设备驱动运行在了与内核同一个级别的R0级。

因此总的来说,其实我们只需要关注两个级别:R0、R3。

image-20231025084422022

WIndows XP体系结构简图:

image-20231025084602699

从上面我们就可以看到,作为应用程序来说,我们只能在用户态调用win32动态库导出的那些函数,而这些函数又全是由ntdll.dll这个动态库所导出的,它封装了所有核心内容。

事实上,这个ntdll.dll模态,在我们最开始的动态逆向分析实战中,已经看到过了。

2.内存分布

内核态与用户态一个更加直观的例子是在一个应用程序的内存分布上:

image-20231025085046028

上面是一个32位的虚拟内存,由于最大只能到4G,所以将后半部分划分给了内核,前半部分划分给了用户。

所以在动态逆向中,如果看到当前指令的地址太高,处于内核区域,那就不用分析直接跳过即可,

64位与32位差不多,只是空间范围与大小不同,同时64位由于空间实在太大,还会存在一些空洞。

image-20231025085519156

也正因为64位实在太大,所以windows系统只支持了44位最大寻址空间,即16TB,而Linux则支持到了48位最大寻址空间256TB。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux