CN108897572A - 一种基于变量关联树的复杂类型重构方法 - Google Patents
一种基于变量关联树的复杂类型重构方法 Download PDFInfo
- Publication number
- CN108897572A CN108897572A CN201810793950.2A CN201810793950A CN108897572A CN 108897572 A CN108897572 A CN 108897572A CN 201810793950 A CN201810793950 A CN 201810793950A CN 108897572 A CN108897572 A CN 108897572A
- Authority
- CN
- China
- Prior art keywords
- variable
- vrt
- type
- node
- pointer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于变量关联树的复杂类型重构方法,该方法具体为:将待处理的二进制程序转化为汇编程序,并对汇编程序中的各函数单元进行变量关联树VRT的创建;依据变量关联树VRT创建变量地址映射表VAM;根据汇编程序对变量关联树VRT中节点的属性信息进行更新得到最终VRT,同时更新变量地址映射表VAM,最终VRT对应的变量地址映射表VAM包含了汇编程序的基本类型重构结果。识别筛选出根节点的运算符属性为解引用的最终VRT作为指针VRT,其中B+C形式指针VRT对应的复杂类型为结构体,B+V+C形式指针VRT对应的复杂类型为数组,对于B+C形式指针VRT和B+V+C形式指针VRT分别采用不同的方法进行结构体和数组的重构。该方法能够实现快速、有效的复杂类型重构,且重构结果较为准确。
Description
技术领域
本发明涉及软件维护和安全技术领域,具体涉及一种基于变量关联树的复杂类型重构方法。
背景技术
反编译是编译的逆过程,其目标是将二进制代码转换成与之逻辑和功能等价的高级语言形式。源程序中变量的结构类型决定了变量的存储空间和使用规则,然而源代码经过编译优化之后,有关程序的类型及调试信息都不复存在,转而以匿名的字节块信息代之,通过内存的分配访问形式及其相互间的依赖关系体现变量的类型信息。随着第三方软件的大量使用,出于安全的考虑,越来越多的软件需要进行安全分析,检测软件中是否含有漏洞以及恶意代码,而常规手段就是对比分析程序中的数据结构类型。类型重构作为“源代码再现”的过程,能够有效增强代码的可读性,提高程序分析的效率。类型重构的原则通常是先恢复基本类型,而后通过综合的分析方法恢复出复杂数据类型。
类型重构属于反编译过程中重要步骤之一,而数据类型重构又可以分为基本类型重构和复杂类型重构,现阶段对于基本类型重构的研究和技术已经比较成熟,但对于复杂类型重构却没有比较深入的研究能够得出好的结果。
目前的复杂类型重构方案有静态的,主要思想是基于中间语言,对指针进行分析,但存在指针别名问题,处理较为困难;大多数方案是动态的,主要思想是基于中间语言,在指针使用处***插桩代码,再将中间语言翻译成可执行程序(或模拟运行环境下的可执行程序),(模拟)运行程序,获得指针变量指向的实际地址,根据这些地址重构复杂类型的内部布局。但动态方法准确率较低,重构结果往往需要手工去重等处理。
Mycroft在1999年提出的Type-based decompilation***能够恢复不同架构下二进制代码中常规的变量类型,该***先把可执行代码转化为RTL(Register TransferLanguage)代码以达到跨架构的目标,然后为RTL指令添加约束条件,最后为约束方程求解以获得变量的类型信息。但该方法无法避免约束求解方法的通病,即约束方程可能无解或多解,同时该方法对复杂变量类型也无法恢复。
2007年,Ilfak Guilfanov发布了反汇编器IDA Pro的一个反编译插件Hex-Rays,这是一款功能强大的商业软件,它能快速地将32位windows可执行程序转换成与源码功能和语义等价的类C代码,但只可用于分析而不能编译。它对函数的参数和返回值检测很准确,但对于变量的符号及复杂类型的重构效果欠佳。
2008年由A.Cozzie等人提出的Laika***,利用动态分析的方法对数据结构进行恢复。该***采用了贝叶斯自适应算法检测数据结构,但是其结果很不准确,并且不能处理复杂类型结构。对于结构化的类型变量,只能给出结构的大体轮廓,无法对其内部成员变量的类型进行处理。
***梅隆大学的Jong Hyup Lee在2011年提出了基于规则的可执行程序的类型重构方法,先使用BAP(Binary Analysis Platform)将二进制代码转化为静态单赋值SSA(Static Single Assignment)的形式,然后对推断出的变量做类型标记,根据这些变量的使用产生对应的类型约束,最后对约束求解。该方法虽能识别指针,但对结构、数组和指针都一概而论,未做区分。
因此目前缺少一种有效准确的方案来实现复杂类型的重构。
发明内容
有鉴于此,本发明提供了一种基于变量关联树的复杂类型重构方法,能够实现快速、有效的复杂类型重构,且重构结果较为准确。
为达到上述目的,本发明的技术方案包括如下步骤:
步骤一、将待处理的二进制程序转化为汇编程序,并对汇编程序中的各函数单元进行变量关联树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对应结构体的内部布局,即可以得到结构体中每个偏移常量下数据的类型及其所占字节大小,重构出结构体的内部布局。
若指针VRT属于B+V+C形式指针VRT的第一种和第二种B+V+C形式结构,执行如下S211。
S211、对第一种和第二种B+V+C形式结构的指针VRT,提取基址B、数组下标中的变量V以及当前指针VRT根节点对应的变量在变量地址映射表VAM中对应的类型t,B即为数组首地址,根据V即可推导数组大小,t即为数组元素的类型。
若指针VRT属于B+V+C形式指针VRT的第三种B+V+C形式结构,执行如下S221~S226。
S221、对所有第三种B+V+C形式结构的指针VRT,提取基址B、偏移常量C、数组下标中的变量V以及当前指针VRT根节点对应的变量在变量地址映射表VAM中对应的类型t,得到(B+C,V,t)集合。
S222、从(B+C,V,t)集合中获取三元组(C,size,t),C为偏移常量,size为根据数组下标中的变量V的取值范围推导出的数组的大小,t为B+V+C形式指针VRT的根节点对应的变量的类型。
S223、对于共n个的三元组(C,size,t),按照C的大小进行排序,其中排序为第i位的三元组为(Ci,sizei,ti),i取值为1~n。
S224、令重构迭代次数k=1。
S225、以B+Ck为数组首地址,sizek为数组大小,tk为数组元素的类型,进行数组重构。
S226、若存在m,满足k<m<=n且Cm>Ck+sizek且Cm-1<Ck+sizek;则令k=m,返回S225,否则结束该迭代过程。
进一步地,步骤一具体包括如下步骤:
S101、采用反汇编工具将待处理的二进制程序转化为汇编程序。
S102、扫描汇编程序,以函数为单元进行划分,获得划分好的函数单元;识别汇编程序中的库函数。
S103、针对划分好的函数单元,根据函数调用关系生成函数调用图。
S104、遍历函数调用图,以函数为单元,采用后序分析确定函数单元的分析顺序。
按照分析顺序顺次确定每次分析的当前函数单元,采用S105~S107进行分析。
S105、针对当前函数单元,提取其中汇编指令的操作数,根据每个操作数创建对应的变量关联树节点,构建变量关联树VRT,则变量关联树VRT的节点即为变量,变量根据其类型分为寄存器变量、临时变量、局部变量、全局变量和函数变量;当前函数单元创建得到一个或多个变量关联树VRT实例,每个变量关联树VRT实例中的节点具有类型约束信息属性,同时建立变量地址映射表VAM。
变量地址映射表VAM中存储有变量关联树VRT实例中所有节点对应变量的索引,包括以变量为根节点的变量关联树VRT实例或者子变量关联树VRT实例,还包括变量的类型约束信息属性。
S106、利用提取的汇编程序中寄存器和汇编指令中的变量类型信息作为第一约束规则,采用第一约束规则对所创建的变量关联树VRT实例中的节点的类型约束信息属性进行更新,获得初始VRT,同时更新变量地址映射表VAM中变量的类型约束信息属性。
利用变量关联树VRT中各变量间的运算关系作为第二约束规则,采用第二约束规则对初始VRT中的节点的类型约束信息属性进行更新,获得中间VRT,同时更新变量地址映射表VAM中变量的类型约束信息属性。
S107、以S102中识别的库函数以及当前函数单元中调用的函数作为已知函数,从汇编程序中获取已知函数的参数和返回值,并采用已知函数的参数和返回值的类型信息在中间VRT上进行传播,进一步确定中间VRT上与已知函数关联的变量的类型,获得最终VRT,同时更新变量地址映射表VAM中变量的类型约束信息属性。
S108、按照分析顺序判断是否所有函数单元均分析完成,若是,则以此时VAM中变量及其类型作为基本类型重构结果;否则按照分析顺序确定下一次分析的当前函数单元,返回S105。
进一步地,步骤S103中,采用汇编语言中的CALL指令,生成函数调用图。
进一步地,步骤S104中,遍历函数调用图,以函数为单元,采用后序分析确定函数单元的分析顺序,具体为:
判断函数调用图是否为无环的函数调用图,若是,则在无环的函数调用图中,针对其中的函数单元,从根节点main函数开始以深度优先的方式按照后序遍历进行排序获得分析顺序。
否则,函数调用图为有环的函数调用图,则对有环的函数调用图进行解环后,针对其中的函数单元,从根节点main函数开始以深度优先的方式按照后序遍历进行排序获得分析顺序。
对有环的函数调用图进行解环具体为:
从根节点main函数开始深度优先遍历有环的函数调用图,遇到已遍历过的节点,将该已遍历过的节点记为环点。
复制环点作为叶子节点与前一节点相连,消除环。
有益效果:
1、本发明提供的基于变量关联树的复杂类型重构方法,根据基本类型重构完成后得到的变量关联树VRT,筛选出指针VRT,并进行分类分析,重构复杂数据类型的内部布局,复杂类型的元素类型来自基本类型重构结果,因此能够实现快速、有效的复杂类型重构,且重构结果较为准确。
2、本发明同时给出了一种针对复杂类型重构的基本类型重构方法,该基本类型重构方法通过提出的变量关联树,在功能上替代了中间语言和数据流图,并在方案中省去了控制流分析,简化基本数据类型重构过程,是一种轻量级的重构方法。
附图说明
图1为本发明所提供的基于变量关联树的复杂类型重构方法流程图。
图2为两种不同的B+C形式指针VRT结构示意图;
图3为三种不同的B+V+C形式指针VRT结构示意图;
图4为本发明所提供的步骤一具体方案流程图;
图5为本发明实施例中所得到的函数调用图示例图;
图6为本发明实施例中所得到的变量关联树VRT实例结构图。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
本发明提供了一种基于变量关联树的复杂类型重构的方法。一些基本类型的变量,如字符型、整型、长整型等可以存入寄存器中,通过操作寄存器来操作这些变量。但复杂类型的变量,如数组和结构体等,其长度通常超出了寄存器所能表示的范围,而内存中的数据又只能先被加载到寄存器中才能被CPU操作。事实上,数据对象一般会被分配为连续的内存空间,通过指向该内存空间首地址的指针即可访问该数据对象,而指针可以存入寄存器中,对复杂类型的变量的操作使用的便是指针。因此对复杂类型的重构需要重点分析指针变量,本发明主要考虑数组和结构体两种复杂类型。
数组和结构体的重构主要依据对数组元素和结构体成员变量的访问分析,两者的访问均要通过指针,对于结构体成员变量的访问方式为“基址+偏移常量”即B+C形式,对数组元素的访问主要考虑以下标访问且下标中包含变量的方式,为“基址+变量+偏移常量”,即B+V+C形式。
对结构体类型的重构主要分为三个工作:结构体的识别(基址的确定),结构体内部布局,各成员变量的类型。对结构体的识别主要是识别访问结构体成员的“B+C”形式,“B”是结构体基址,对结构体内部布局的重构需要收集成员变量的偏移地址“C”和各成员变量所占字节的大小(成员变量类型信息包含了所占字节的大小);各成员变量的类型可以从基本类型重构结果中获取。
对数组类型的重构也主要分为三个工作:数组识别(首地址的确定),数组大小,数组元素的类型。对数组的识别主要是识别访问数组元素的“B+V+C”形式,基址“B”用于推导数组首地址;数组元素的类型可以从基本类型重构结果中获取;对数组大小的确定主要依赖于“B+V+C”形式的下标中的变量“V”的取值范围,当“V”为循环变量时根据循环变量的取值范围保守推导数组大小。
基于该思想,本方案结合以不同形式访问的变量在VRT中的表现进行复杂类型重构,据此提供了一种基于变量关联树的复杂类型重构方法,其流程如图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形式结构如图2(a)所示,具体为:由一个根节点以及一个叶子节点组成,其中根节点对应的变量为T1,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;叶子节点对应的变量为L1,表示指针VRT对应的结构体的基址;对于该B+C形式指针VRT,B=L1,C=0,此时基址B即为结构体起始地址,变量T1即为结构体的首个成员变量;
第二种B+C形式结构如图2(b)所示,具体为:由一个根节点、一个寄存器型节点以及两个叶子节点组成;其中根节点对应的变量为T2,表示结构体中的一个成员变量,该根节点的运算符属性为解引用,采用符号“!”表示;寄存器型节点对应的变量为寄存器EAX,该节点的运算符属性为加;两个叶子节点对应的变量分别为L2和C1,其中L2表示指针VRT对应的结构体的基址,C1表示T2指示的成员变量在结构体中的偏移常量;对于该B+C形式指针VRT,B=L2,C=C1,此时基址B即为结构体起始地址,变量T2即为结构体中偏移常量为C1的成员变量。
B+V+C形式指针VRT的结构形式包括如下三种:
第一种B+V+C形式结构如图3(a)所示,具体为:根节点对应的变量为T6,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T5,运算符属性为加;T5有两个子节点,左儿子节点对应的变量为T3,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T4,运算符属性为乘;T3有一个子节点,对应的变量为S1,运算符属性为空;T4有两个子节点,左儿子节点对应的变量为L3,运算符属性为空,右儿子节点对应的变量为C2,运算符属性为空;其中T3和T5为指针,T3指向变量S1,T5指向变量T6,T6表示一个数组元素;对于该B+V+C形式指针VRT,B=T3,V=L3,C=0,基址B即为数组首地址,根据数组下标中的变量V的取值范围可以推导出数组大小,变量T6在VAM中保存的类型即为数组元素的类型。
第二种B+V+C形式结构如图3(b)所示,具体为:根节点对应的变量为T11,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T10,运算符属性为加;T10有两个子节点,左儿子节点对应的变量为T8,运算符属性为取地址,采用符号“&”表示,右儿子节点对应的变量为T9,运算符属性为加;T8有一个子节点,对应的变量为S2,运算符属性为空;T9有两个子节点,左儿子节点对应的变量为T7,运算符属性为乘,右儿子节点对应的变量为C4,运算符属性为空;T7有两个子节点,左儿子节点对应的变量为L4,运算符属性为空,右儿子节点对应的变量为C3,运算符属性为空;其中T8和T10为指针,T8指向变量S2,T10指向变量T11,T11表示一个数组元素;对于该B+V+C形式指针VRT,B=T8,V=L4,C=0,基址B即为数组首地址,根据数组下标中的变量V的取值范围可以推导出数组大小,变量T11在VAM中保存的类型即为数组元素的类型。
第三种B+V+C形式结构如图3(c)所示,具体为:根节点对应的变量为T15,表示一个数组元素,该根节点的运算符属性为解引用,采用符号“!”表示;根节点具有一个子节点,对应的变量为T14,运算符属性为加;T14有两个子节点,左儿子节点对应的变量为ESP,运算符属性为空,右儿子节点对应的变量为T13,运算符属性为加;T13有两个子节点,左儿子节点对应的变量为T12,运算符属性为乘,右儿子节点对应的变量为C6,运算符属性为空;T12有两个子节点,左儿子节点对应的变量为L5,运算符属性为空,右儿子节点对应的变量为C5,运算符属性为空;其中ESP和T14为指针,其中ESP为寄存器的一种,称为栈寄存器,表示栈指针;T14指向变量T15,T15表示一个数组元素;对于该B+V+C形式指针VRT,B=ESP,V=L5,C=C6,但此时的基址B并非数组首地址,首地址的推导方法如步骤S221~S226,根据数组下标中的变量V的取值范围可以推导出数组大小,变量T15在VAM中保存的类型即为数组元素的类型。
若指针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对应结构体的内部布局,即可以得到结构体中每个偏移常量下数据的类型及其所占字节大小,重构出结构体的内部布局。
若指针VRT属于B+V+C形式指针VRT的第一种和第二种B+V+C形式结构,执行如下S211;
S211、对第一种和第二种B+V+C形式结构的指针VRT,提取基址B、数组下标中的变量V以及当前指针VRT根节点对应的变量在变量地址映射表VAM中对应的类型t,B即为数组首地址,根据V即可推导数组大小,t即为数组元素的类型。
若指针VRT属于B+V+C形式指针VRT的第三种B+V+C形式结构,执行如下S221~S226;
S221、对所有第三种B+V+C形式结构的指针VRT,提取基址B、偏移常量C、数组下标中的变量V以及当前指针VRT根节点对应的变量在变量地址映射表VAM中对应的类型t,得到(B+C,V,t)集合。
S222、从(B+C,V,t)集合中获取三元组(C,size,t),C为偏移常量,size为根据数组下标中的变量V的取值范围推导出的数组的大小,t为B+V+C形式指针VRT的根节点对应的变量的类型。
S223、对于共n个的三元组(C,size,t),按照C的大小进行排序,其中排序为第i位的三元组为(Ci,sizei,ti),i取值为1~n。
S224、令重构迭代次数k=1。
S225、以B+Ck为数组首地址,sizek为数组大小,tk为数组元素的类型,进行数组重构。
S226、若存在m,满足k<m<=n且Cm>Ck+sizek且Cm-1<Ck+sizek;则令k=m,返回S225,否则结束该迭代过程。
本发明实施例中,采用如下具体方案实现步骤一。
该步骤的原理是:采用表示汇编程序中各变量之间关联关系的结构——变量关联树,通过变量关联树进行对基本数据类型的重构,并使用依据汇编语言建立的约束规则以及已知函数(库函数和当前函数单元中调用的函数)的参数和返回值类型信息进行基本类型的重构,并通过变量地址映射表VAM存储基本类型的重构结果。
其中变量关联树VRT能够表示变量之间的关系,是对汇编程序的一种不完全表示方式(并非中间语言),也是简化类型重构方案的核心方法,也是实施类型重构方法的载体。中间语言是对汇编语言功能和语义的完整翻译,是可逆的,而变量关联树只是对汇编语言中变量的关联关系的一种表示,并不是对汇编语言的翻译,是不可逆的。变量地址映射表VAM本质上是变量关联树中变量的一个索引,实时与变量关联树进行交互,其中包含了变量的类型信息,将作为类型重构的最终结果输出。变量关联树简化了类型重构方案,省去了中间语言、数据流图和控制流图等步骤。
步骤一具体流程如图4所示,具体包括如下步骤:
S101、采用反汇编工具将待处理的二进制程序转化为汇编程序;常用的反汇编工具都可以实现将二进制程序转化为汇编程序的处理,例如可以使用IDA Pro。
S102、扫描汇编程序,以函数为单元进行划分,获得划分好的函数单元。此处对汇编程序的扫描可以是粗粒度的,只要能够识别出其中的函数即可。
汇编程序中的库函数的识别可以采用现有的库函数识别工具,也可以使用反汇编工具中自带的库函数识别功能,例如IDA Pro就可以执行库函数的识别。
S103、针对划分好的函数单元,根据函数调用关系生成函数调用图。实际应用中,可以采用相应的工具或者指令进行函数调用图的生成。例如可以采用汇编语言中的CALL指令,生成函数调用图。
S104、遍历函数调用图,以函数为单元,采用后序分析确定函数单元的分析顺序。
考虑到现有的类型重构方案是以基本块为单元,则一个完整的变量关联树的创建需要跨越多个基本单元,且一个基本块中的指令数量相对较少,依此创建的变量关联树较为零碎。因此本发明以函数为单元进行变量关联树VRT的生成,能够创建相对独立和完整的VRT,用于类型重构,此处则需要确定以函数为单元的后序分析策略。
本发明实施例给出了一种具体的以函数为单元的后序分析策略用于确定函数单元的分析顺序,具体可以包括如下步骤:
1)针对S103中生成的函数调用图,首先判断函数调用图是否为无环的函数调用图。其中函数调用图按照其中是否具有循环调用,可以分为具有循环调用的有环的函数调用图、以及不具有循环调用的无环的函数调用图。
若当前的函数调用图是无环的函数调用图,执行2)。
若当前的函数调用图是有环的函数调用图,执行3)。
2)针对无环的函数调用图中的函数单元,从根节点main函数开始以深度优先的方式按照后序遍历进行排序获得分析顺序;
3)对有环的函数调用图进行解环后,针对其中的函数单元,从根节点main函数开始以深度优先的方式按照后序遍历进行排序获得分析顺序;
对有环的函数调用图进行解环具体为:
从根节点main函数开始深度优先遍历有环的函数调用图,遇到已遍历过的节点,将该已遍历过的节点记为环点,例如图5中所示的函数F_b节点即为环点。
复制环点作为叶子节点与前一节点相连,消除环。如图5中的F_b节点复制为F_b`节点。
可以看出,对于有环的函数调用图,环点被分析了两次,对被复制的环点的分析属于不完全分析(F_b`函数中调用的其他函数尚未被分析,在F_b`函数中创建的VRT不能根据函数类型信息传播进一步精确类型信息)。
若不使用上述策略进行分析,当遇到函数调用时需要存储当前分析状态,分析完调用函数后再恢复之前的分析状态,内存占用大,分析效率比较差。
依据上述后序分析策略获得函数单元的分析顺序之后,按照分析顺序顺次确定每次分析的当前函数单元,并采用S105~S107进行分析:
S105、针对当前函数单元,提取其中汇编指令的操作数,根据每个操作数创建对应的变量关联树节点,构建变量关联树VRT。则变量关联树VRT的节点即为变量。
变量根据其类型分为寄存器变量、临时变量、局部变量、全局变量和函数变量;当前函数单元创建得到一个或多个变量关联树VRT实例,每个变量关联树VRT实例中的节点具有类型约束信息等属性。类型约束信息属性为节点对应变量在汇编程序中的类型信息。
同时建立变量地址映射表VAM。
变量地址映射表VAM中存储有变量关联树VRT实例中所有节点对应变量的索引,包括以变量为根节点的变量关联树VRT实例或者子变量关联树VRT实例,还包括变量的类型约束信息属性。
由于汇编指令的操作数一般不超过两个,因此创建的VRT应该是一个二叉树,但函数变量节点是个例外,它的参数个数可以超过两个,所以,除函数变量节点外VRT结构具有二叉树的特性,因此称VRT为类二叉树结构。如图6所示,是一个简单的VRT,该结构能清晰的表示局部变量[ebp+48h]、[ebp+32h]和[ebp+8h]之间的关系,即[ebp+48h]=[ebp+32h]+[ebp+8h]。
S106、当前函数单元中的变量关联树VRT实例全部创建完成后,即针对整个当前函数单元,从第一条汇编指令到最后一条汇编指令全部分析完成。
对于基本的C语言程序,其基本类型集合S0={char,unsigned char,short,unsigned short,int,unsigned int,pointer,float,double},该架构下的C语言程序中,int和long均为32位,因此均用int表示,pointer均为无符号变量,float和double均为有符号变量,因此只对整型变量做符号区分。
为方便起见,本发明中采用三元组(core,size’,sign)的形式表示类型约束信息属性,其中core包含int、float、pointer,分别用I,F和P表示,size’包含1、2、4、8,表示字节数,sign表示符号信息,包含有符号和无符号,分别用s和u表示。如三元组(I,2,s)表示为有符号短整型。
此外,为方便表示汇编中的约束信息,变量或汇编指令中的操作数用v表示,如movv1,v2中v1和v2分别表示mov的两个操作数;用t表示类型,如tcore、tsize’等;{t1,t2}表示t1和t2的集合;∈表示包含于,如tcore(v)∈{I,P}表示变量v的core属性为I或P;“||”表示或,“&&”表示且。
利用提取的汇编程序中寄存器和汇编指令中变量类型信息作为第一约束规则,采用第一约束规则对所创建的变量关联树VRT实例中的节点的类型约束信息属性进行更新,获得初始VRT,同时更新变量地址映射表VAM中变量的类型约束信息属性。
本发明实施例中,第一约束规则中的寄存器和汇编指令中隐含类型信息具体包括如下内容:
1、寄存器中隐含类型信息:根据汇编语言的既有规则,在汇编程序中寄存器通常可以约束寄存器中存储的数据的位数,如果寄存器中存储的形式为指针形式,则还可以约束寄存器中存储的数据为指针类型。
一般会产生针对变量类型的第一条约束信息,即约束其大小为1字节、2字节或4字节。i386架构中有8个32位的通用寄存器,他们的低位部分被用作8个16位寄存器,。为了支持8位的操作,还进一步把ax、bx、cx、dx四个寄存器再分为8位一组的高位字节和低位字节两部分,作为8个8位寄存器。如表1所示,产生的约束为寄存器中存储的数据类型的约束。
表1寄存器约束规则
寄存器的使用 | 约束信息 |
eax、ebx、ecx、edx | tsize’(v)=4 |
ax、bx、cx、dx | tsize’(v)=2 |
ah、bh、ch、dh、al、bl、cl、dl | tsize’(v)=1 |
[eax]、[eax+C]、[eax+edx]、[eax+edx*C1+C2] | tcore(v)=P |
2、汇编指令中隐含类型信息
在汇编语言中,汇编指令主要分为FPU指令和CPU指令。
其中FPU指令主要用于推导数据类型,基本类型中的float和double类型,指令均为字母“f”开头,结合字长信息(dword、qword等)很容易确定float和double类型,根据FPU数据传送指令和算术运算指令制定的约束规则如表2和表3所示。
表2数据传送指令的约束规则
数据传送指令 | 约束信息 |
fld/fst/fstp dword ptr v1 | tcore(v1)=F,tsize’(v1)=4 |
fld/fst/fstp qword ptr v1 | tcore(v1)=F,tsize’(v1)=8 |
fild/fist/fistp v1 | tcore(v1)=I,tsize’(v1)∈{2,4} |
表3算术运算指令的约束规则
算术运算指令 | 约束信息 |
fiadd/fisub/fimul/fidiv/…/fiaddr | tcore(v1)=I,tsize’(v1)∈{2,4} |
fadd/fsub/fmul/…/faddr dword ptr | tcore(v1)=F,tsize’(v1)=4 |
fadd/fsub/fmul/…/faddr qword ptr | tcore(v1)=F,tsize’(v1)=8 |
CPU指令较多,同时也分为很多类,因此只对部分可以约束其操作数的指令进行分析。CPU指令包括如下几种指令:
通用数据传送指令。数据传送指令中最常用的与类型信息相关的有mov、movsx、movzx和lea,相应的约束规则如表4所示。
表4数据传送指令的约束规则
数据传送指令 | 约束信息 |
mov v1,v2 | t(v1)=t(v2) |
movsx v1,v2 | tsign(v2)=s |
movzx v1,v2 | tsign(v2)=u |
lea v1,v2 | tcore(v1)=P |
算术运算指令。算术运算指令中也有类型信息存在,相关的指令主要有add、inc、sub、dec、nec、imul、idiv、cbw、cwd、cwde及cdq等,对应的约束规则如表5所示。
表5算术运算指令的约束规则
算术运算指令 | 约束信息 |
add/sub v1,v2 | tcore(v1/v2)∈{P,I},tsize’(v1)=tsize’(v2)=4 |
inc/dec v1 | tcore(v1)∈{P,I},tsize’(v1)=4 |
nec v1 | tcore(v1)=I,tsize’(v1)=4,tsign(v1)=s |
imul/idiv v1,v2 | tcore(v1/v2)=I,tsize’(v1)=tsize’(v2)=4 |
cbw | tsize’(v1)=1,tsize’(v2)=2,tsign(v1/v2)=s |
逻辑运算指令。逻辑运算指令中主要有与、或和异或运算以及移位运算,由于指针类型的变量不会参与逻辑运算,因此逻辑运算指令的操作数均可被约束为整型,对应的约束规则如表6所示。
表6逻辑运算指令的约束规则
以上的寄存器和汇编指令的实例仅为说明第一约束规则的制定方案,其中内容均是按照汇编语言的既有规则,通过寄存器和汇编指令推导变量的类型约束信息从而更新VRT中变量的类型约束信息属性,并不是为了限制本发明的技术方案,在本发明的技术方案中,只要能够从汇编程序的寄存器和汇编指令中提取隐含的变量的类型信息即可作为第一约束规则。
利用变量关联树VRT中各变量间的运算关系作为第二约束规则,采用第二约束规则对初始VRT中的节点的类型约束信息属性进行更新,获得中间VRT,同时更新变量地址映射表VAM中变量的类型约束信息属性。
本发明实施例中,针对VRT中变量间的运算关系制定的类型第二约束规则如表7所示,主要针对整型和指针类型的运算。
表7运算相关的第二约束规则
以上表格中的第二约束规则实例仅为说明第二约束规则的制定方案,其中内容均是通过变量间的运算关系推导变量的类型约束信息从而更新VRT中变量的类型约束信息属性,并不是为了限制本发明的技术方案,在本发明的技术方案中,只要能够从变量间的运算关系中提取隐含的变量的类型信息即可作为第二约束规则。
S107、VRT创建完成后,根据第一约束规则和第二约束规则收集约束信息的工作随之完成,可以得到大部分变量的初步类型,若要进一步精确变量类型,需要对上述约束得到的类型信息和通过库函数的参数和返回值得到的类型信息进行传播。
以S102中识别的库函数以及当前函数单元中调用的函数作为已知函数,从汇编程序中获取已知函数的参数和返回值,并采用已知函数的参数和返回值的类型信息在中间VRT上进行传播,进一步确定中间VRT上与已知函数关联的变量的类型,获得最终VRT,同时更新变量地址映射表VAM中变量的类型约束信息属性。
S108、按照分析顺序判断是否所有函数单元均分析完成,若是,则此时VAM中变量及其类型即为基本类型重构结果;否则按照分析顺序确定下一次分析的当前函数单元,返回S105。
本发明提供的基本类型重构方法通过提出的变量关联树,在功能上替代了中间语言和数据流图,并在方案中省去了控制流分析,简化基本数据类型重构过程,是一种轻量级的重构方法。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (4)
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对应结构体的内部布局,即可以得到结构体中每个偏移常量下数据的类型及其所占字节大小,重构出结构体的内部布局;
若所述指针VRT属于B+V+C形式指针VRT的第一种和第二种B+V+C形式结构,执行如下S211;
S211、对第一种和第二种B+V+C形式结构的指针VRT,提取基址B、数组下标中的变量V以及当前指针VRT根节点对应的变量在所述变量地址映射表VAM中对应的类型t,B即为数组首地址,根据V即可推导数组大小,t即为数组元素的类型;
若所述指针VRT属于B+V+C形式指针VRT的第三种B+V+C形式结构,执行如下S221~S226;
S221、对所有第三种B+V+C形式结构的指针VRT,提取基址B、偏移常量C、数组下标中的变量V以及当前指针VRT根节点对应的变量在所述变量地址映射表VAM中对应的类型t,得到(B+C,V,t)集合;
S222、从(B+C,V,t)集合中获取三元组(C,size,t),C为偏移常量,size为根据数组下标中的变量V的取值范围推导出的数组的大小,t为B+V+C形式指针VRT的根节点对应的变量的类型;
S223、对于共n个的三元组(C,size,t),按照C的大小进行排序,其中排序为第i位的三元组为(Ci,sizei,ti),i取值为1~n;
S224、令重构迭代次数k=1;
S225、以B+Ck为数组首地址,sizek为数组大小,tk为数组元素的类型,进行数组重构;
S226、若存在m,满足k<m<=n且Cm>Ck+sizek且Cm-1<Ck+sizek;则令k=m,返回S225,否则结束该迭代过程。
2.如权利要求1所述的方法,其特征在于,所述步骤一具体包括如下步骤:
S101、采用反汇编工具将待处理的二进制程序转化为汇编程序;
S102、扫描所述汇编程序,以函数为单元进行划分,获得划分好的函数单元;识别所述汇编程序中的库函数;
S103、针对划分好的所述函数单元,根据函数调用关系生成函数调用图;
S104、遍历所述函数调用图,以函数为单元,采用后序分析确定函数单元的分析顺序;
按照所述分析顺序顺次确定每次分析的当前函数单元,采用S105~S107进行分析;
S105、针对当前函数单元,提取其中汇编指令的操作数,根据每个操作数创建对应的变量关联树节点,构建变量关联树VRT,则所述变量关联树VRT的节点即为变量,变量根据其类型分为寄存器变量、临时变量、局部变量、全局变量和函数变量;当前函数单元创建得到一个或多个变量关联树VRT实例,每个变量关联树VRT实例中的节点具有类型约束信息属性,同时建立变量地址映射表VAM;
所述变量地址映射表VAM中存储有所述变量关联树VRT实例中所有节点对应变量的索引,包括以变量为根节点的变量关联树VRT实例或者子变量关联树VRT实例,还包括变量的类型约束信息属性;
S106、利用提取的所述汇编程序中寄存器和汇编指令中的变量类型信息作为第一约束规则,采用所述第一约束规则对所创建的变量关联树VRT实例中的节点的类型约束信息属性进行更新,获得初始VRT,同时更新所述变量地址映射表VAM中变量的类型约束信息属性;
利用变量关联树VRT中各变量间的运算关系作为第二约束规则,采用所述第二约束规则对所述初始VRT中的节点的类型约束信息属性进行更新,获得中间VRT,同时更新所述变量地址映射表VAM中变量的类型约束信息属性;
S107、以S102中识别的所述库函数以及当前函数单元中调用的函数作为已知函数,从所述汇编程序中获取所述已知函数的参数和返回值,并采用已知函数的参数和返回值的类型信息在所述中间VRT上进行传播,进一步确定所述中间VRT上与所述已知函数关联的变量的类型,获得最终VRT,同时更新所述变量地址映射表VAM中变量的类型约束信息属性;
S108、按照所述分析顺序判断是否所有函数单元均分析完成,若是,则以此时VAM中变量及其类型作为基本类型重构结果;否则按照所述分析顺序确定下一次分析的当前函数单元,返回S105。
3.如权利要求2所述的方法,其特征在于,所述步骤S103中,采用汇编语言中的CALL指令,生成函数调用图。
4.如权利要求2所述的方法,其特征在于,所述步骤S104中,遍历所述函数调用图,以函数为单元,采用后序分析确定函数单元的分析顺序,具体为:
判断所述函数调用图是否为无环的函数调用图,若是,则在所述无环的函数调用图中,针对其中的函数单元,从根节点main函数开始以深度优先的方式按照后序遍历进行排序获得分析顺序;
否则,所述函数调用图为有环的函数调用图,则对所述有环的函数调用图进行解环后,针对其中的函数单元,从根节点main函数开始以深度优先的方式按照后序遍历进行排序获得分析顺序;
对所述有环的函数调用图进行解环具体为:
从根节点main函数开始深度优先遍历所述有环的函数调用图,遇到已遍历过的节点,将该已遍历过的节点记为环点;
复制所述环点作为叶子节点与前一节点相连,消除环。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810793950.2A CN108897572B (zh) | 2018-07-19 | 2018-07-19 | 一种基于变量关联树的复杂类型重构方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810793950.2A CN108897572B (zh) | 2018-07-19 | 2018-07-19 | 一种基于变量关联树的复杂类型重构方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108897572A true CN108897572A (zh) | 2018-11-27 |
CN108897572B CN108897572B (zh) | 2020-09-15 |
Family
ID=64351055
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810793950.2A Active CN108897572B (zh) | 2018-07-19 | 2018-07-19 | 一种基于变量关联树的复杂类型重构方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108897572B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110162335A (zh) * | 2019-04-26 | 2019-08-23 | 深圳壹账通智能科技有限公司 | 代码重构方法、装置、计算机设备及介质 |
CN110780854A (zh) * | 2019-09-28 | 2020-02-11 | 同程网络科技股份有限公司 | 基于ios***下的app自动化集成平台***及方法 |
CN112100059A (zh) * | 2020-08-20 | 2020-12-18 | 浙江大学 | 一种c语言的指针类型分析方法 |
CN113311788A (zh) * | 2021-04-13 | 2021-08-27 | 南京南瑞继保电气有限公司 | 一种变量组态处理方法、装置、计算机存储介质及设备 |
CN115052031A (zh) * | 2022-05-24 | 2022-09-13 | 广州大学 | 一种非ros程序与ros程序的交互通信*** |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100095287A1 (en) * | 2003-09-25 | 2010-04-15 | Lantronix, Inc. | Method and system for program transformation using flow-sensitive type constraint analysis |
CN102981841A (zh) * | 2011-11-08 | 2013-03-20 | 微软公司 | 外部序列化和去序列化 |
CN104111848A (zh) * | 2014-06-27 | 2014-10-22 | 华中科技大学 | 一种基于异步检查点的多线程软件动态升级方法 |
CN106020836A (zh) * | 2016-05-27 | 2016-10-12 | 浪潮(北京)电子信息产业有限公司 | 一种下层异常继承上层异常的异常处理方法及装置 |
CN107861727A (zh) * | 2017-12-18 | 2018-03-30 | 广东广业开元科技有限公司 | 基于自动化编译JavaScript代码的智能混淆方法 |
-
2018
- 2018-07-19 CN CN201810793950.2A patent/CN108897572B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100095287A1 (en) * | 2003-09-25 | 2010-04-15 | Lantronix, Inc. | Method and system for program transformation using flow-sensitive type constraint analysis |
CN102981841A (zh) * | 2011-11-08 | 2013-03-20 | 微软公司 | 外部序列化和去序列化 |
CN104111848A (zh) * | 2014-06-27 | 2014-10-22 | 华中科技大学 | 一种基于异步检查点的多线程软件动态升级方法 |
CN106020836A (zh) * | 2016-05-27 | 2016-10-12 | 浪潮(北京)电子信息产业有限公司 | 一种下层异常继承上层异常的异常处理方法及装置 |
CN107861727A (zh) * | 2017-12-18 | 2018-03-30 | 广东广业开元科技有限公司 | 基于自动化编译JavaScript代码的智能混淆方法 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110162335A (zh) * | 2019-04-26 | 2019-08-23 | 深圳壹账通智能科技有限公司 | 代码重构方法、装置、计算机设备及介质 |
CN110780854A (zh) * | 2019-09-28 | 2020-02-11 | 同程网络科技股份有限公司 | 基于ios***下的app自动化集成平台***及方法 |
CN110780854B (zh) * | 2019-09-28 | 2023-08-08 | 同程网络科技股份有限公司 | 基于ios***下的app自动化集成平台***及方法 |
CN112100059A (zh) * | 2020-08-20 | 2020-12-18 | 浙江大学 | 一种c语言的指针类型分析方法 |
CN112100059B (zh) * | 2020-08-20 | 2021-09-14 | 浙江大学 | 一种c语言的指针类型分析方法 |
CN113311788A (zh) * | 2021-04-13 | 2021-08-27 | 南京南瑞继保电气有限公司 | 一种变量组态处理方法、装置、计算机存储介质及设备 |
CN115052031A (zh) * | 2022-05-24 | 2022-09-13 | 广州大学 | 一种非ros程序与ros程序的交互通信*** |
CN115052031B (zh) * | 2022-05-24 | 2023-05-19 | 广州大学 | 一种非ros程序与ros程序的交互通信*** |
Also Published As
Publication number | Publication date |
---|---|
CN108897572B (zh) | 2020-09-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108897572A (zh) | 一种基于变量关联树的复杂类型重构方法 | |
Wang et al. | Demystifying differentiable programming: Shift/reset the penultimate backpropagator | |
Bielik et al. | Adversarial robustness for code | |
CN109426615A (zh) | 过程间的空指针解引用检测方法、***、设备以及介质 | |
Hansen et al. | State joining and splitting for the symbolic execution of binaries | |
Bowers et al. | Top-down synthesis for library learning | |
CN111475820A (zh) | 基于可执行程序的二进制漏洞检测方法、***及存储介质 | |
Padberg et al. | Model checking reconfigurable Petri nets with Maude | |
Lin et al. | Predictive comment updating with heuristics and ast-path-based neural learning: A two-phase approach | |
Sjölund | Tools and Methods for Analysis, Debugging, and Performance Improvement of Equation-Based Models | |
Khurshid | Generating structurally complex tests from declarative constraints | |
Turcotte et al. | Designing types for R, empirically | |
Qian et al. | Use of the ADAMO data management system within ALEPH | |
Bauer et al. | MLFMF: data sets for machine learning for mathematical formalization | |
CN109117142A (zh) | 一种基于变量关联树的基本类型重构方法 | |
Bartha et al. | One down, 699 to go: or, synthesising compositional desugarings | |
Mei et al. | An XML plagiarism detection model for C program | |
Wiegley et al. | Using Coq to write fast and correct Haskell | |
Hammes et al. | Comparing Id and Haskell in a Monte Carlo photon transport code | |
Mihelic et al. | A denotational semantics of a concatenative/compositional programming language | |
Borba et al. | Refinement of concurrent object oriented programs | |
Ghica et al. | String Diagrams for $\lambda $-calculi and Functional Computation | |
Sultana | Higher-order proof translation | |
Bojić et al. | A Streaming Dataflow Implementation of Parallel Cocke–Younger–Kasami Parser | |
Grabmüller | Constraint-imperative Programmierung |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |