[发明专利]一种P2020机器码程序到C语言源程序的溯源方法有效

专利信息
申请号: 202010397904.8 申请日: 2020-05-12
公开(公告)号: CN111552465B 公开(公告)日: 2022-07-05
发明(设计)人: 谢文光;汪克念;马春燕;张啸晨;吴康;姚鑫鹏;陈文琪 申请(专利权)人: 中国民航大学
主分类号: G06F8/30 分类号: G06F8/30;G06F8/41;G06F21/16
代理公司: 天津中环专利商标代理有限公司 12105 代理人: 王凤英
地址: 300300 天*** 国省代码: 天津;12
权利要求书: 查看更多 说明书: 查看更多
摘要:
搜索关键词: 一种 p2020 机器码 程序 语言 源程序 溯源 方法
【权利要求书】:

1.一种P2020机器码程序到C语言源程序的溯源方法,其特征在于,有以下步骤:

步骤一:生成待追溯C语言源程序的抽象语法树

将C语言程序作为开源工具Pycparser的输入,采用该工具生成C语言源程序文件的抽象语法树,每个抽象语法树的节点包含语法结构的名称、孩子节点信息及该节点对应的C语言源程序中的行号信息;

步骤二:构建与C语言源程序抽象语法树节点对应的汇编语言指令序列的规则

识别C语言源程序的节点类型,根据每类节点的语法结构和实现功能的含义,分别建立与其对应的汇编语言指令集规则,针对各类C语言抽象语法树的所有节点类型进行整理,剔除未对应汇编语言指令的节点类型,给出以下十三类节点的汇编语言指令集规则,具体规则描述如下:

1)、C语言源程序中赋值语句生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的Assignment节点,生成的汇编语言指令序列为:

(1-1)、1条数值读取指令;

(1-2)、1条存储指令;

2)、C语言源程序中二元操作表达式生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树BinaryOp节点,分下述三种情况生成相应的汇编语言指令:

(2-1)、如果BinaryOp表示的操作类型为“==”、“”或“!=”,生成1条比较的汇编语言指令;

(2-2)、如果BinaryOp表示的操作类型为“-”或“+”,生成1条用于求和的汇编语言指令;

(2-3)、如果BinaryOp表示的操作类型为“||”或“”,生成1条条件跳转的汇编语言指令;

3)、C语言源程序中一元操作表达式生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的UnaryOp节点,其表示“++”或“- -”操作符,生成的汇编语言指令序列为:

(3-1)、1条增加指令;

(3-2)、1条存储指令;

4)、C语言源程序中数组引用生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的ArrayRef节点,生成的汇编语言指令序列为:

(4-1)、以ArrayRef为根,识别数组下标表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(4-2)、1条数值读取指令;

(4-3)、1条计算数组引用元素偏移地址的求和指令;

5)、C语言程序中指针引用生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的PtrDecl节点,生成的汇编语言指令序列为:

(5-1)、以PtrDecl为根,识别指针引用表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(5-2)、1条数值读取指令;

6)、C语言源程序中if语句生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的If节点,生成的汇编语言指令序列为:

(6-1)、以If为根,识别判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(6-2)、1条比较指令;

(6-3)、1条条件跳转指令,跳转至步骤(6-5);

(6-4)、如果if语句存在else部分的程序语句,生成1条无条件跳转指令,跳转至(6-6)中的第一条指令的位置;

(6-5)、以If为根,识别true情况下语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(6-6)、如果if语句存在else部分的程序语句,以PtrDecl为根,识别false情况下语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

7)、C语言源程序中For循环生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的For节点,生成的汇编语言指令序列为:

(7-1)、以For为根,识别初始化语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(7-2)、1条无条件跳转指令,跳转至(7-6)中的指令位置;

(7-3)、以For为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(7-4)、以For为根,识别控制条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(7-5)、以For为根,识别判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(7-6)、1条比较指令;

(7-7)、1条条件跳转指令,跳转至(7-3)中的第一条指令的位置;

8)、C语言源程序中while循环生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的While节点,生成的汇编语言指令序列为:

(8-1)、无条件跳转指令,跳转至(8-4)中的指令位置;

(8-2)、以While为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(8-3)、以While为根,识别循环判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(8-4)、1条比较指令;

(8-5)、1条条件跳转指令,如果满足条件,则跳转至(8-2)中的第一条指令的位置;

9)、C语言源程序中do-while循环生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的DoWhile节点,生成的汇编语言指令序列为:

(9-1)、以DoWhile为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(9-2)、识别C语言源程序中do-while循环判断条件语句对应的抽象语法树,遍历该抽象语法树的各个节点类型,生成相应的汇编语言指令序列;

(9-3)、1条比较指令;

(9-4)、1条条件跳转指令,如果满足条件,跳转至(9-1)中的第一条指令的位置;

10)、C语言源程序中函数调用循环生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的FunCal函数调用节点,生成的汇编语言指令序列为:

(10-1)、以FunCal为根,识别各实际参数表达式对应的子树,遍历相应子树并根据各个节点类型,生成相应的汇编语言指令序列;

(10-2)、生成一条函数调用指令;

11)、C语言源程序中函数声明生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的FuncDecl函数声明节点,生成的汇编语言指令序列为:

(11-1)、函数体入口指令序列;

(11-2)、以FuncDecl为根,识别函数体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(11-3)、函数体出口指令序列;

12)、C语言源程序中返回语句生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的Return节点,生成的汇编语言指令序列为:

(12-1)、1条存储指令;

(12-2)、1条无条件跳转指令,跳转至(11-3)中的第一条指令位置;

13)、C语言源程序中选择判断语句switch生成汇编语言指令序列的规则

对于C语言源程序的抽象语法树的Switch节点,生成的汇编语言指令序列为:

(13-1)、以Switch为根,识别表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;

(13-2)、针对switch语句中的每个case语句,分别生成的汇编语言指令序列为:

a)、1条比较指令;

b)、1条条件跳转指令,跳转至下一个case语句对应的第一条指令的位置;

c)、以Switch为根,识别该case情况下的语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的指令序列;

d)、如果该case情况下包含break语句,则生成1条无条件跳转指令,跳转至该Switch语句之后的指令位置;

步骤三:建立PowerPC P2020机器码程序文件名到C语言源程序文件名的追溯关系

1)、针对PowerPC P2020机器码程序,解析其所有机器码程序文件的目标文件名,去掉目标文件名的后缀,生成机器码目标文件名列表,标记为objFileList;

2)、针对C语言源程序,解析其所有源文件的文件名,去掉文件名后缀,生成源文件名列表,标记为srcFileList;

3)、建立objFileList中文件名到C语言源程序文件名的追溯关系表格,标记为obj-srcFlieMapTable;obj-srcFlieMapTable包含三列,即PowerPC P2020机器码程序目标文件名所在的目录、C语言源程序文件名所在的目录、文件名;

4)、分析机器码文件名列表objFileList和源文件列表srcFileList中的文件名是否相等,如果相等,则匹配成功,将匹配成功的文件名对应的文件目录和文件名存储在obj-srcFlieMapTable中,obj-srcFlieMapTable中第三列文件名,存储的是机器码程序文件和与之匹配成功的源文件的共同文件名;

5)、根据PowerPC P2020机器码程序文件名到C语言源程序文件名的映射关系,执行步骤四;

步骤四:建立PowerPC P2020机器码程序函数名到C语言源程序函数名的追溯关系

1)、针对PowerPC P2020机器码程序生成其所有函数名列表

PowerPC P2020机器码程序文件遵循ELF格式,解析ELF格式中的符号表段,即symtab段,识别函数名、函数名所在的行号,以及该函数名所在的目标文件名,构造PowerPC P2020机器码程序所有函数定义的列表,命名为objFunList,列表中的每个元素包括三个属性信息:函数名、行号、目标文件名;其中,目标文件名是机器码程序和C语言源程序映射成功的共同的文件名;

2)、针对C语言源程序生成其所有函数名列表

(1)、根据步骤一中生成的抽象语法树,搜索抽象语法树中所有的FuncDef节点,每个以节点FuncDef为根的子树,对应C语言源程序的函数定义;

(2)、针对C语言源程序,根据每个FuncDef节点的属性信息,识别该节点对应的函数名、函数名所在的行号以及该函数所在的源文件名;

(3)、构造C语言源程序所有函数定义的列表,命名为srcFunList,列表中的每个元素包括三个属性信息:函数名、行号、源文件名;其中,源文件名是机器码程序和C语言源程序映射成功的共同的文件名;

3)、建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系

分析PowerPC P2020机器码程序函数列表objFunList和C语言源程序列表srcFunList,根据步骤三实现的文件追溯关系表obj-srcFlieMapTable,针对PowerPC P2020机器码程序所有函数名列表objFunList和C语言源程序所有函数名列表srcFunList中目标文件名和源文件名一致的两个元素,比较这两个元素的函数名是否相等,如果相等,则匹配成功,建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系表格,标记为obj-srcFunNameMapTable,将匹配成功的函数名信息存入该表格中,表格包含两列,即objFunList列表中的每个元素、srcFunList列表中的每个元素;

4)、根据PowerPC P2020机器码程序函数名到C语言源程序函数名的映射关系,执行步骤五至步骤7,继续生成函数体内的程序语句的映射关系;

步骤五:生成PowerPC P2020机器码程序对应的汇编语言程序,并建立机器码程序函数模块与汇编语言程序函数模块之间的映射关系

1)、针对PowerPC P2020机器码程序文件ELF格式中的可执行代码段,即text段,采用反汇编命令,将text段的可执行代码反汇编,生成其对应的汇编语言程序,标记为Ass;

2)、根据Ass中的函数名标签,将Ass中的语句序列划分为函数模块的形式,每个函数模块包含函数名及函数体的语句序列;

3)、针对Ass中每个函数模块中的语句序列建立机器码程序语句与汇编语言程序语句之间的映射关系,存储在表格中,将该表格标记为obj-assFunMapTable;表格包括三列:第一列是文件名,第二列是函数名,第三列是机器码程序函数模块中语句与汇编语言程序函数模块中语句之间的映射关系子列表,该子列表包含三列,即语句行号、机器语言程序语句,汇编语言程序语句;obj-assFunMapTable中的文件名是步骤三中映射成功的机器码程序文件名,函数名是基于步骤四中映射成功的机器码程序函数名;

步骤六:生成C语言源程序中各个函数体对应的汇编语言指令序列,建立汇编语言指令序列与C语言源程序各函数体中语句之间的追溯关系

1)、根据步骤一生成的抽象语法树,识别C语言源程序所有函数定义节点FuncDecl,针对每个节点FuncDecl,遍历以该节点为根的子树,根据步骤二中的规则,分别生成对应的汇编语言指令序列,同时,将各节点生成的汇编语言指令序列与FuncDecl所在的C语言源程序函数体中语句行号进行关联;

2)、最后,建立汇编语言指令序列与C语言源程序函数体中的语句之间的追溯关系列表,标记为ass-srcFunBodyMapTable,列表中第一列存储C语言源程序的函数名,第二列为该函数体内C语言源程序的语句行号,第三列为汇编语言指令序列,该指令序列与第二列C语言源程序的语句行号进行关联;

步骤七:建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系

1)、针对步骤五生成的obj-assFunMapTable表格,将其第二列中的每个PowerPC P2020机器码程序函数名取出,标记为assFunc,同时,将表obj-assFunMapTable第三列内容机器码程序函数模块中语句与汇编语言程序函数模块中语句之间的映射关系子列表标记为obj-assFunBodyMapTable;

2)、查找ass-srcFunBodyMapTable中与assFunc匹配的行,将ass-srcFunBodyMapTable中的第三列汇编语言指令序列标记为assCommanList;

3)、建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系表格,标记为obj-srcFunBodyMapTable;

4)、顺次取出obj-assFunBodyMapTable列表中第三列的每条汇编语言程序语句,将其标记为assCodeLine,然后分别执行以下步骤:

(1)、取出该汇编语言程序语句中的指令,标记为command;

(2)、将command与assCommanList中的汇编指令顺次进行匹配;

(3)、如果两条指令相等,则匹配成功,将匹配成功的信息存入obj-srcFunBodyMapTable,该表格包括四列,每列的详细信息为:

第一列为函数名assFunc;

第二列为表格obj-assFunBodyMapTable中相应PowerPC P2020机器码程序语句行号;

第三列为表格obj-assFunBodyMapTable中相应PowerPC P2020机器码程序语句;

第四列为表格ass-srcFunBodyMapTable中C语言源程序的相应函数体内语句行号;

(4)、将assCommanList中匹配成功的指令从assCommanList中删除。

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国民航大学,未经中国民航大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/202010397904.8/1.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top