关于系统补丁的一点知识

小鸡
阅读167 喜欢0 随想 更新2019-8-5

我们平常偶经常听到一个词叫做“补丁”,尤其是在系统相关的地方,什么今天XX系统又偷偷打了个补丁,修复了XX漏洞,XX程序坏了之后打了个补丁运行正常了。

顾名思义,补丁就是用来修复程序/或者更新一些特性用的东西,那么补丁是如何修改某个程序的呢?

补丁的分类

热补丁

有些系统一旦运行起来,就很难停止下来(停止下来会花费比较大的代价)这时候我们没法将程序替换后再重启系统,只能通过一种边运行边打补丁改变相应函数的方法,这就是热补丁。

冷补丁

与热补丁相反,对相应的函数代码进行覆盖后达到修复程序的目的

临时补丁

用于紧急突发情况,未告知用户的情况下直接将补丁打到系统里,解决当前的燃眉之急。

正式补丁

临时补丁经过检验后,随着新版本一起发布的,对公众公开的正式补丁。

函数与函数调用

我们知道,一个程序的就是数据结构+算法,这里的算法在代码里的载体就是一个个函数,而一个函数在一个程序里展示的地方有两处,一个是函数定义的地方,一个是函数调用的地方。所以当一个函数出现问题了,我们不可能将函数调用的地方一个个改,应该在函数本身的地方修改。

但是在函数本身的地方修改,也不可能是直接将函数代码覆盖原来的函数,那么补丁怎么做的呢?

补丁将修改后的补丁程序加载到内存中的某个安全区域,然后在原函数的头四个字节,修改为跳转指令,跳转到新的函数代码所在的内存首地址,这样cpu就会执行新的函数。

一般而言,在汇编层面上每个函数的前四个字节的代码都是

push ebp
mov esp ebp

保存旧的基地址,设置新的基地址。

所以我们在补丁加载的时候,也要保存原函数的前四个字节代码,如果以后需要卸载补丁,我们就要将原函数还原。

这就是补丁管理要做的事,一般的嵌入式系统都会有补丁管理模块,它负责补丁的加载,激活,去激活,卸载等工作,同时也要记录补丁和原程序的映射关系,保存原函数的前四个字节代码等。

以上只是简洁地简述了补丁的小原理,当然还有很多细节没有讲出来,不过细细平常,是个操作系统和编程中比较有趣且重要的概念。