发明名称 一种程序运行时处理器指令校验方法
摘要 本发明涉及一种程序运行时处理器指令校验方法,该方法包括以下内容:在程序运行之前,计算出程序所有代码段中每条正确指令的地址,然后将正确指令的地址转换成地址校验数据,最后在程序运行过程中,当处理器计算出一条分支转移指令的分支目标地址,未提交结果时,对计算出的分支目标地址进行校验,本发明可用于阻止利用程序非正常指令序列构造出的恶意代码在处理器上执行。
申请公布号 CN104504329A 申请公布日期 2015.04.08
申请号 CN201410835359.0 申请日期 2014.12.30
申请人 中国人民解放军装备学院 发明人 吕雅帅;赵忠文;吴玲达
分类号 G06F21/52(2013.01)I;G06F21/56(2013.01)I 主分类号 G06F21/52(2013.01)I
代理机构 中国人民解放军防化研究院专利服务中心 11046 代理人 刘永盛
主权项 一种程序运行时处理器指令校验方法,其特征是该校验方法步骤如下:(1)在程序运行之前,计算出程序所有代码段中每条正确指令的地址,其方法是:对于每个代码段,通过代码段信息获取该代码段起始处第一条指令的地址,然后从第一条指令起对该代码段进行反汇编,并通过反汇编依次获得该代码段中所有指令的长度,此后每条指令的地址即为前一条指令的地址加上前一条指令的长度;(2)将正确指令的地址转换成地址校验数据,其方法是:将地址上连续的代码段合并为一个代码段进行处理,设合并后代码段的起始加载地址是a<sub>0</sub>,结束地址为a<sub>1</sub>,对于a<sub>0</sub>至a<sub>1</sub>范围内的每一个地址,当该地址是一条正确指令的起始地址,则用一位“1”来表示,否则用一位“0”来表示,或用一位“0”表示一条正确指令的起始地址,一位“1”表示否,在程序运行过程中,地址校验数掘放在内存中,供处理器校验指令时进行查询,将所有合并后代码段的起始加载地址、代码段的大小和地址校验数据的地址记录到一个表中,供程序运行时查询使用;(3)在程序运行过程中,当处理器计算出一条分支转移指令的分支目标地址,未提交结果时,对计算出的分支目标地址进行校验,设待校验的分支目标地址为a<sub>t</sub>,其校验方法是:1)通过一个分支目标校验缓存对该地址a<sub>t</sub>进行校验,该分支目标缓存中存放了刚成功执行过的分支指令的分支目标地址,当待校验的分支地址a<sub>t</sub>与分支目标缓存中的一个地址一致,则校验成功,处理器则继续正常执行,否则需执行2),2)首先找到地址a<sub>t</sub>所对应的代码段,即要知道地址a<sub>t</sub>是在哪个代码段的地址范围内,当没有找到对应的代码段,则地址a<sub>t</sub>为非法地址,此时引发处理器异常,终止校验过程;当找到地址a<sub>t</sub>对应的代码段后,设该代码段的第一个指令的起始地址为a<sub>0</sub>,则根据地址a<sub>t</sub>相对于a<sub>0</sub>的偏移量找出相应的地址校验数掘,其方法是:设该代码段的地址校验数据存放于地址a<sub>c</sub>处,取出地址<img file="FSA0000112350300000011.GIF" wi="342" he="67" />处的一个字节,其中运算<img file="FSA0000112350300000012.GIF" wi="69" he="67" />表示不超过n的最大整数,n为0~2<sup>64</sup>之间的实数,该字节的第(a<sub>t</sub>‑a<sub>0</sub>)%8+1位即为地址a<sub>t</sub>的校验数据,其中%表示取模运算;当校验数据表明地址a<sub>t</sub>为一条正确指令的起始地址,则校验成功,处理器继续正常执行,并用地址a<sub>t</sub>更新分支目标校验缓存,否则校验失败,引发处理器异常。
地址 101416 北京市怀柔区装备学院3380信箱