一种基于变量关联树的复杂类型重构方法技术

技术编号:19592906 阅读:20 留言:0更新日期:2018-11-28 04:43
本发明专利技术公开了一种基于变量关联树的复杂类型重构方法,该方法具体为:将待处理的二进制程序转化为汇编程序,并对汇编程序中的各函数单元进行变量关联树VRT的创建;依据变量关联树VRT创建变量地址映射表VAM;根据汇编程序对变量关联树VRT中节点的属性信息进行更新得到最终VRT,同时更新变量地址映射表VAM,最终VRT对应的变量地址映射表VAM包含了汇编程序的基本类型重构结果。识别筛选出根节点的运算符属性为解引用的最终VRT作为指针VRT,其中B+C形式指针VRT对应的复杂类型为结构体,B+V+C形式指针VRT对应的复杂类型为数组,对于B+C形式指针VRT和B+V+C形式指针VRT分别采用不同的方法进行结构体和数组的重构。该方法能够实现快速、有效的复杂类型重构,且重构结果较为准确。

【技术实现步骤摘要】
一种基于变量关联树的复杂类型重构方法
本专利技术涉及软件维护和安全
,具体涉及一种基于变量关联树的复杂类型重构方法。
技术介绍
反编译是编译的逆过程,其目标是将二进制代码转换成与之逻辑和功能等价的高级语言形式。源程序中变量的结构类型决定了变量的存储空间和使用规则,然而源代码经过编译优化之后,有关程序的类型及调试信息都不复存在,转而以匿名的字节块信息代之,通过内存的分配访问形式及其相互间的依赖关系体现变量的类型信息。随着第三方软件的大量使用,出于安全的考虑,越来越多的软件需要进行安全分析,检测软件中是否含有漏洞以及恶意代码,而常规手段就是对比分析程序中的数据结构类型。类型重构作为“源代码再现”的过程,能够有效增强代码的可读性,提高程序分析的效率。类型重构的原则通常是先恢复基本类型,而后通过综合的分析方法恢复出复杂数据类型。类型重构属于反编译过程中重要步骤之一,而数据类型重构又可以分为基本类型重构和复杂类型重构,现阶段对于基本类型重构的研究和技术已经比较成熟,但对于复杂类型重构却没有比较深入的研究能够得出好的结果。目前的复杂类型重构方案有静态的,主要思想是基于中间语言,对指针进行分析,但存在指针别名问题,处理较为困难;大多数方案是动态的,主要思想是基于中间语言,在指针使用处插入插桩代码,再将中间语言翻译成可执行程序(或模拟运行环境下的可执行程序),(模拟)运行程序,获得指针变量指向的实际地址,根据这些地址重构复杂类型的内部布局。但动态方法准确率较低,重构结果往往需要手工去重等处理。Mycroft在1999年提出的Type-baseddecompilation系统能够恢复不同架构下二进制代码中常规的变量类型,该系统先把可执行代码转化为RTL(RegisterTransferLanguage)代码以达到跨架构的目标,然后为RTL指令添加约束条件,最后为约束方程求解以获得变量的类型信息。但该方法无法避免约束求解方法的通病,即约束方程可能无解或多解,同时该方法对复杂变量类型也无法恢复。2007年,IlfakGuilfanov发布了反汇编器IDAPro的一个反编译插件Hex-Rays,这是一款功能强大的商业软件,它能快速地将32位windows可执行程序转换成与源码功能和语义等价的类C代码,但只可用于分析而不能编译。它对函数的参数和返回值检测很准确,但对于变量的符号及复杂类型的重构效果欠佳。2008年由A.Cozzie等人提出的Laika系统,利用动态分析的方法对数据结构进行恢复。该系统采用了贝叶斯自适应算法检测数据结构,但是其结果很不准确,并且不能处理复杂类型结构。对于结构化的类型变量,只能给出结构的大体轮廓,无法对其内部成员变量的类型进行处理。卡耐基梅隆大学的JongHyupLee在2011年提出了基于规则的可执行程序的类型重构方法,先使用BAP(BinaryAnalysisPlatform)将二进制代码转化为静态单赋值SSA(StaticSingleAssignment)的形式,然后对推断出的变量做类型标记,根据这些变量的使用产生对应的类型约束,最后对约束求解。该方法虽能识别指针,但对结构、数组和指针都一概而论,未做区分。因此目前缺少一种有效准确的方案来实现复杂类型的重构。
技术实现思路
有鉴于此,本专利技术提供了一种基于变量关联树的复杂类型重构方法,能够实现快速、有效的复杂类型重构,且重构结果较为准确。为达到上述目的,本专利技术的技术方案包括如下步骤:步骤一、将待处理的二进制程序转化为汇编程序,并对汇编程序中的各函数单元进行变量关联树VRT的创建。变量关联树VRT的节点为函数单元中的变量,以变量之间的关联关系创建节点间的关联关系。每个变量关联树VRT中的节点属性信息包括:从汇编程序中提取的类型约束信息属性以及运算符属性;类型约束信息属性为节点对应变量在汇编程序中的类型信息,运算符属性为节点对应变量在汇编程序中对应的运算符信息。同时依据变量关联树VRT创建变量地址映射表VAM,变量地址映射表VAM中存储有变量关联树VRT中所有节点对应变量的索引,包括变量的属性信息,即类型约束信息属性以及运算符属性。根据汇编程序对变量关联树VRT中节点的属性信息进行更新得到最终VRT,同时更新变量地址映射表VAM,最终的变量地址映射表VAM包含了基本类型重构结果。步骤二、识别筛选出根节点的运算符属性为解引用的最终VRT作为指针VRT。指针VRT根据其结构形式分为B+C形式指针VRT以及B+V+C形式指针VRT;其中B+C形式指针VRT对应的复杂类型为结构体,B+V+C形式指针VRT对应的复杂类型为数组;其中B表示基址,C表示偏移常量,V表示数组下标中的变量。B+C形式指针VRT的结构形式包括如下两种:第一种B+C形式结构为:由一个根节点以及一个叶子节点组成,其中根节点对应的变量为T1,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;叶子节点对应的变量为L1,表示指针VRT对应的结构体的基址。第二种B+C形式结构为:由一个根节点、一个寄存器型节点以及两个叶子节点组成;其中根节点对应的变量为T2,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;寄存器型节点对应的变量为寄存器EAX,该节点的运算符属性为加;两个叶子节点对应的变量分别为L2和C1,其中L2表示指针VRT对应的结构体的基址,C1表示T2指示的成员变量在结构体中的偏移常量。B+V+C形式指针VRT的结构形式包括如下三种:第一种B+V+C形式结构为:根节点对应的变量为T6,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T5,运算符属性为加;T5有两个子节点,左儿子节点对应的变量为T3,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T4,运算符属性为乘;T3有一个子节点,对应的变量为S1,运算符属性为空;T4有两个子节点,左儿子节点对应的变量为L3,运算符属性为空,右儿子节点对应的变量为C2,运算符属性为空;其中T3和T5为指针,T3指向变量S1,T5指向变量T6,T6表示一个数组元素。第二种B+V+C形式结构为:根节点对应的变量为T11,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T10,运算符属性为加;T10有两个子节点,左儿子节点对应的变量为T8,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T9,运算符属性为加;T8有一个子节点,对应的变量为S2,运算符属性为空;T9有两个子节点,左儿子节点对应的变量为T7,运算符属性为乘,右儿子节点对应的变量为C4,运算符属性为空;T7有两个子节点,左儿子节点对应的变量为L4,运算符属性为空,右儿子节点对应的变量为C3,运算符属性为空;其中T8和T10为指针,T8指向变量S2,T10指向变量T11,T11表示一个数组元素。第三种B+V+C形式结构为:根节点对应的变量为T15,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T14,运算符属性为加;T14有两个本文档来自技高网
...

【技术保护点】
1.一种基于变量关联树的复杂类型重构方法,其特征在于,该方法包括如下步骤:步骤一、将待处理的二进制程序转化为汇编程序,并对汇编程序中的各函数单元进行变量关联树VRT的创建;所述变量关联树VRT的节点为所述函数单元中的变量,以变量之间的关联关系创建节点间的关联关系;每个变量关联树VRT中的节点属性信息包括:从所述汇编程序中提取的类型约束信息属性以及运算符属性;所述类型约束信息属性为节点对应变量在所述汇编程序中的类型信息,所述运算符属性为节点对应变量在所述汇编程序中对应的运算符信息;同时依据所述变量关联树VRT创建变量地址映射表VAM,所述变量地址映射表VAM中存储有所述变量关联树VRT中所有节点对应变量的索引,包括变量的属性信息,即类型约束信息属性以及运算符属性;根据汇编程序对变量关联树VRT中节点的属性信息进行更新得到最终VRT,同时更新变量地址映射表VAM,最终的变量地址映射表VAM包含了基本类型重构结果;步骤二、识别筛选出根节点的运算符属性为解引用的最终VRT作为指针VRT;所述指针VRT根据其结构形式分为B+C形式指针VRT以及B+V+C形式指针VRT;其中B+C形式指针VRT对应的复杂类型为结构体,B+V+C形式指针VRT对应的复杂类型为数组;其中B表示基址,C表示偏移常量,V表示数组下标中的变量;所述B+C形式指针VRT的结构形式包括如下两种:第一种B+C形式结构为:由一个根节点以及一个叶子节点组成,其中根节点对应的变量为T1,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;叶子节点对应的变量为L1,表示所述指针VRT对应的结构体的基址;第二种B+C形式结构为:由一个根节点、一个寄存器型节点以及两个叶子节点组成;其中根节点对应的变量为T2,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;寄存器型节点对应的变量为寄存器EAX,该节点的运算符属性为加;两个叶子节点对应的变量分别为L2和C1,其中L2表示所述指针VRT对应的结构体的基址,C1表示T2指示的成员变量在所述结构体中的偏移常量;所述B+V+C形式指针VRT的结构形式包括如下三种:第一种B+V+C形式结构为:根节点对应的变量为T6,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T5,运算符属性为加;T5有两个子节点,左儿子节点对应的变量为T3,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T4,运算符属性为乘;T3有一个子节点,对应的变量为S1,运算符属性为空;T4有两个子节点,左儿子节点对应的变量为L3,运算符属性为空,右儿子节点对应的变量为C2,运算符属性为空;其中T3和T5为指针,T3指向变量S1,T5指向变量T6,T6表示一个数组元素;第二种B+V+C形式结构为:根节点对应的变量为T11,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T10,运算符属性为加;T10有两个子节点,左儿子节点对应的变量为T8,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T9,运算符属性为加;T8有一个子节点,对应的变量为S2,运算符属性为空;T9有两个子节点,左儿子节点对应的变量为T7,运算符属性为乘,右儿子节点对应的变量为C4,运算符属性为空;T7有两个子节点,左儿子节点对应的变量为L4,运算符属性为空,右儿子节点对应的变量为C3,运算符属性为空;其中T8和T10为指针,T8指向变量S2,T10指向变量T11,T11表示一个数组元素;第三种B+V+C形式结构为:根节点对应的变量为T15,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T14,运算符属性为加;T14有两个子节点,左儿子节点对应的变量为ESP,运算符属性为空,右儿子节点对应的变量为T13,运算符属性为加;T13有两个子节点,左儿子节点对应的变量为T12,运算符属性为乘,右儿子节点对应的变量为C6,运算符属性为空;T12有两个子节点,左儿子节点对应的变量为L5,运算符属性为空,右儿子节点对应的变量为C5,运算符属性为空;其中ESP和T14为指针,其中ESP为寄存器的一种,称为栈寄存器,表示栈指针;T14指向变量T15,T15表示一个数组元素;若所述指针VRT属于B+C形式指针VRT,执行如下S201~S202;S201、对所有的B+C形式指针VRT,提取基址B、偏移常量C以及所述指针VRT的根节点对应的变量在所述变量地址映射表VAM中对应的类型t,得到(B,C,t)集合;S202、在(B,C,t)集合中,按照基址B分类,根据相同基址B下的偏移常量C和类型t所占...

【技术特征摘要】
1.一种基于变量关联树的复杂类型重构方法,其特征在于,该方法包括如下步骤:步骤一、将待处理的二进制程序转化为汇编程序,并对汇编程序中的各函数单元进行变量关联树VRT的创建;所述变量关联树VRT的节点为所述函数单元中的变量,以变量之间的关联关系创建节点间的关联关系;每个变量关联树VRT中的节点属性信息包括:从所述汇编程序中提取的类型约束信息属性以及运算符属性;所述类型约束信息属性为节点对应变量在所述汇编程序中的类型信息,所述运算符属性为节点对应变量在所述汇编程序中对应的运算符信息;同时依据所述变量关联树VRT创建变量地址映射表VAM,所述变量地址映射表VAM中存储有所述变量关联树VRT中所有节点对应变量的索引,包括变量的属性信息,即类型约束信息属性以及运算符属性;根据汇编程序对变量关联树VRT中节点的属性信息进行更新得到最终VRT,同时更新变量地址映射表VAM,最终的变量地址映射表VAM包含了基本类型重构结果;步骤二、识别筛选出根节点的运算符属性为解引用的最终VRT作为指针VRT;所述指针VRT根据其结构形式分为B+C形式指针VRT以及B+V+C形式指针VRT;其中B+C形式指针VRT对应的复杂类型为结构体,B+V+C形式指针VRT对应的复杂类型为数组;其中B表示基址,C表示偏移常量,V表示数组下标中的变量;所述B+C形式指针VRT的结构形式包括如下两种:第一种B+C形式结构为:由一个根节点以及一个叶子节点组成,其中根节点对应的变量为T1,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;叶子节点对应的变量为L1,表示所述指针VRT对应的结构体的基址;第二种B+C形式结构为:由一个根节点、一个寄存器型节点以及两个叶子节点组成;其中根节点对应的变量为T2,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;寄存器型节点对应的变量为寄存器EAX,该节点的运算符属性为加;两个叶子节点对应的变量分别为L2和C1,其中L2表示所述指针VRT对应的结构体的基址,C1表示T2指示的成员变量在所述结构体中的偏移常量;所述B+V+C形式指针VRT的结构形式包括如下三种:第一种B+V+C形式结构为:根节点对应的变量为T6,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T5,运算符属性为加;T5有两个子节点,左儿子节点对应的变量为T3,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T4,运算符属性为乘;T3有一个子节点,对应的变量为S1,运算符属性为空;T4有两个子节点,左儿子节点对应的变量为L3,运算符属性为空,右儿子节点对应的变量为C2,运算符属性为空;其中T3和T5为指针,T3指向变量S1,T5指向变量T6,T6表示一个数组元素;第二种B+V+C形式结构为:根节点对应的变量为T11,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T10,运算符属性为加;T10有两个子节点,左儿子节点对应的变量为T8,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T9,运算符属性为加;T8有一个子节点,对应的变量为S2,运算符属性为空;T9有两个子节点,左儿子节点对应的变量为T7,运算符属性为乘,右儿子节点对应的变量为C4,运算符属性为空;T7有两个子节点,左儿子节点对应的变量为L4,运算符属性为空,右儿子节点对应的变量为C3,运算符属性为空;其中T8和T10为指针,T8指向变量S2,T10指向变量T11,T11表示一个数组元素;第三种B+V+C形式结构为:根节点对应的变量为T15,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T14,运算符属性为加;T14有两个子节点,左儿子节点对应的变量为ESP,运算符属性为空,右儿子节点对应的变量为T13,运算符属性为加;T13有两个子节点,左儿子节点对应的变量为T12,运算符属性为乘,右儿子节点对应的变量为C6,运算符属性为空;T12有两个子节点,左儿子节点对应的变量为L5,运算符属性为空,右儿子节点对应的变量为C5,运算符属性为空;其中ESP和T14为指针,其中ESP为寄存器的一种,称为栈寄存器,表示栈指针;T14指向变量T15,T15表示一个数组元素;若所述指针VRT属于B+C形式指针VRT,执行如下S201~S202;S201、对所有的B+C形式指针VRT,提取基址B、偏移常量C以及所述指针VRT的根节点对应的变量在所述变量地址映射表VAM中对应的类型t,得到(B,C,t)集合;S202、在(B,C,t)集合中,按照基址B分类,根据相同基址B下的偏移常量C和类型t所占的字节大小重构基址B对应结构体的内部布局,即可以得到结构体...

【专利技术属性】
技术研发人员:胡昌振马锐菅泽峰朱天保刘健雄
申请(专利权)人:北京理工大学北京计算机技术及应用研究所
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1