CN108958739B - 一种二进制反编译中数组数据结构恢复方法及系统 - Google Patents
一种二进制反编译中数组数据结构恢复方法及系统 Download PDFInfo
- Publication number
- CN108958739B CN108958739B CN201810573717.3A CN201810573717A CN108958739B CN 108958739 B CN108958739 B CN 108958739B CN 201810573717 A CN201810573717 A CN 201810573717A CN 108958739 B CN108958739 B CN 108958739B
- Authority
- CN
- China
- Prior art keywords
- variable
- target
- array
- pointer
- data structure
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种二进制反编译中数组数据结构恢复方法及系统,所述方法包括:S11,对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;S12,获取目标变量在目标反编译结果中各使用位置对应的第一使用模式,若根据第一使用模式对应的第一权重确定目标变量为数组变量,则对数组变量的数据结构进行恢复。本发明实现了对反编译结果中数组数据结构的自动恢复,且提高了数组数据结构恢复的正确率。
Description
技术领域
本发明属于软件分析技术领域,更具体地,涉及一种二进制反编译中数组数据结构恢复方法及系统。
背景技术
IDA(Interactive Disassembler,交互式反汇编器)工具是一种反汇编工具,用于分析编译生成的二进制文件,生成反汇编代码,从而尽可能呈现接近源代码的类C代码,可用于恶意代码分析、漏洞研究和隐私保护等多个软件分析方向。
目前,IDA工具在自动生成类C代码时,会丢失大量的数组数据结构信息。如下为编译前的样例代码片段:
void f()
{
int s[10];
memset(s,0,sizeof(s));
}
上述样例代码片段中s为数组,memset是为数据分配存储空间的函数。将上述样例代码进行编译生成二进制文件,对二进制文件进行反编译生成的类C代码如下:
unsigned int f()
{int s;
memset(&s,0,0x28u);
}
上述类C代码中s为普通常量,反编译后丢失了s的数据结构。由于正确的数组数据结构信息对分析人员理解代码和进一步的软件分析有重要作用,比如辅助理解代码内容等。虽然IDA工具中存在对类C代码进行数组数据结构恢复的插件,但需要手动对每个变量进行标记,效率低,且很容易产生错误。此外,对标记人员的要求也较高。在大型的软件中,变量的数量庞大,从而导致工作量大,需要大量的人力和时间。
综上所述,现有技术中对反编译生成的类C代码进行数组数据结构恢复需要手动操作,需要耗费大量人力和时间,且容易产生错误。
发明内容
为克服上述现有的数组数据结构恢复方法费时费力,且容易产生错误的问题或者至少部分地解决上述问题,本发明提供一种二进制反编译中数组数据结构恢复方法及系统。
根据本发明的第一方面,提供一种二进制反编译中数组数据结构恢复方法,包括:
S11,对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;
S12,获取所述目标变量在所述目标反编译结果中各使用位置对应的第一使用模式,若根据所述第一使用模式对应的第一权重确定所述目标变量为数组变量,则对所述数组变量的数据结构进行恢复。
具体地,S11之前还包括:
若目标反编译结果中各非指针变量为局部变量,则获取所述非指针变量所属函数的栈结构,根据各所述非指针变量在所述栈结构中的位置获取各所述非指针变量的实际占位大小;
若各所述非指针变量为全局变量,则获取各所述非指针变量的存储区结构,根据各所述非指针变量在所述存储区结构中的位置获取各所述非指针变量的实际占位大小。
具体地,S11之前还包括:
根据各非指针变量在目标反编译结果中的各使用位置,从各所述使用位置对应函数的参数中获取各所述非指针变量的实际占位大小。
具体地,S11之前还包括:
构建目标反编译结果的抽象语法树,根据所述抽象语法树获取所述目标反编译结果中各非指针变量的类型。
具体地,所述第一使用模式对应的第一权重为所述第一使用模式所属的使用类别对应的第一权重;
其中,所述使用类别包括数组类使用、通用使用和非数组类使用。
具体地,S12具体包括:
S121,根据所述目标反编译结果的抽象语法树,获取所述目标变量在所述目标反编译结果中各使用位置和各所述使用位置对应的第一使用模式;
S122,根据各所述第一使用模式对应的第一权重,将所述目标变量在所述目标反编译结果中各使用位置对应的第一权重相加;
S123,若相加结果大于第二预设阈值,则获知所述目标变量为数组变量,对所述数组变量的数据结构进行恢复。
具体地,S123还包括:
若所述相加结果小于或等于所述第二预设阈值,且大于第三预设阈值,则获知所述目标变量为第一疑似数组变量;其中,所述第三预设阈值小于所述第二预设阈值;
根据用户输入的第四预设阈值,确定是否对所述第一疑似数组变量的数据结构进行恢复;其中,所述第四预设阈值小于或等于所述第二预设阈值,且大于所述第三预设阈值。
具体地,S11还包括:
对于任一所述非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值小于或等于所述第一预设阈值,则将该非指针变量作为疑似目标变量;
相应地,S12还包括:
获取所述疑似目标变量在所述目标反编译结果中各使用位置对应的第二使用模式,若根据所述第二使用模式对应的第二权重确定所述疑似目标变量为第二疑似数组变量,则根据用户输入的第五预设阈值确定是否对所述第二疑似数组变量的数据结构进行恢复。
具体地,S12中对所述数组变量的数据结构进行恢复的步骤具体包括:
根据所述数组变量的实际占位大小和所述数组变量的类型,计算所述数组变量中元素的个数;
根据所述数组变量中元素的个数,对各所述使用位置的目标变量增加数据结构。
根据本发明第二方面提供一种二进制反编译中数组数据结构恢复系统,包括:
比较模块,用于对于任一所述非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;
恢复模块,用于获取所述目标变量在所述目标反编译结果中各使用位置对应的第一使用模式,若根据所述第一使用模式对应的第一权重确定所述目标变量为数组变量,则对所述数组变量的数据结构进行恢复。
本发明提供一种二进制反编译中数组数据结构恢复方法及系统,该方法通过将目标反编译结果中各非指针变量的实际占位大小与各非指针变量的类型对应的占位大小进行比较,确定各非指针变量是否为目标变量,然后根据目标变量在目标反编译结果中各处使用的方式对应的权重进一步判断目标变量是否为数组变量,将为数组变量的目标变量进行数据结构恢复。本实施例实现了对反编译结果中数组数据结构的自动恢复,且提高了数组数据结构恢复的正确率。
附图说明
图1为本发明实施例提供的二进制反编译中数组数据结构恢复方法整体流程示意图;
图2为本发明实施例提供的二进制反编译中数组数据结构恢复方法中抽象语法树结构示意图;
图3为本发明实施例提供的二进制反编译中数组数据结构恢复系统整体结构示意图;
图4为本发明实施例提供的二进制反编译中数组数据结构恢复设备整体结构示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
在本发明的一个实施例中提供一种二进制反编译中数组数据结构恢复方法,图1为本发明实施例提供的二进制反编译中数组数据结构恢复方法整体流程示意图,该方法包括:S11,对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;
其中,目标反编译结果为需要进行数组数据结构恢复的反编译结果。目标反编译结果可以为基于IDA工具将编译生成的目标二进制文件进行反编译生成的类C代码。目标反编译结果中丢失了数组的数据结构。非指针变量为目标编辑结果中不为指针的变量。实际占位大小为数据实际占有的内存空间的大小。类型为int和string等。每种类型有相应的占位大小,如int类型的数据占4个字节,所以int类型对应的占位大小为4字节。计算各非指针变量的实际占位大小与各非指针变量的类型对应的占位大小之间的差值,若差值大于第一预设阈值,说明非指针变量的类型对应的占位大小与非指针变量的实际占位大小不符,则将各非指针变量标记为目标变量。目标变量为有较大可能为数组的变量,需要对其进行进一步分析确定是否为数组变量。
S12,获取目标变量在目标反编译结果中各使用位置对应的第一使用模式,若根据第一使用模式对应的第一权重确定目标变量为数组变量,则对数组变量的数据结构进行恢复。
其中,获取目标变量在目标反编译结果中每处的使用位置,确定每处使用位置对应的第一使用模式。第一使用模式为目标变量在目标反编译结果中各使用位置对应的使用模式,如各种函数调用、判断逻辑中的使用和运算中的使用等。例如,对于目标变量s,在目标反编译结果中有一处使用位置对应的第一使用模式为memset(&s,0,0x28),memset为C++程序中分配内存空间的函数,其中,第一个参数为指定的内存地址,第三个参数为内存空间的大小。第一权重为第一使用模式对应的权重。每种第一使用模式对应有一个第一权重,越可能为数组的使用模式,权重越大。权重可以采用经验与机器学习的方式进行设定。根据目标变量每处使用所属的使用模式对应权重,确定目标变量是否为数组变量。在确定目标变量为数组变量后,对目标变量的数据结构进行恢复。由于目标变量为数组变量,因此将目标反编译结果中的目标变量更改为数组数据结构的变量。
本实施例通过将目标反编译结果中各非指针变量的实际占位大小与各非指针变量的类型对应的占位大小进行比较,确定各非指针变量是否为目标变量,然后根据目标变量在目标反编译结果中各处使用的方式对应的权重进一步判断目标变量是否为数组变量,将为数组变量的目标变量进行数据结构恢复。本实施例实现了对反编译结果中数组数据结构的自动恢复,且提高了数组数据结构恢复的正确率,增强了反编译生成的类C代码的语义完整性。
在上述实施例的基础上,本实施例中步骤S11之前还包括:若目标反编译结果中各非指针变量为局部变量,则获取非指针变量所属函数的栈结构,根据各非指针变量在栈结构中的位置获取各非指针变量的实际占位大小;若各非指针变量为全局变量,则获取各非指针变量的存储区结构,根据各非指针变量在存储区结构中的位置获取各非指针变量的实际占位大小。
具体地,由于局部变量存储在局部变量所属函数的栈结构中,而全局变量存储在存储区结构中,因此,首先判断目标反编译结果中各非指针变量为局部变量还是全局变量。对于局部变量,获取局部变量所属函数的栈结构。用局部变量在栈结构中的终止位置减去局部变量在栈结构中的起始位置,获取局部变量的实际占位大小。对于全局变量,获取全局变量的存储区结构,用全局变量在存储区结构中的终止位置减去全局变量在存储区结构中的起始位置,获取全局变量的实际占位大小。
在上述实施例的基础上,本实施例中步骤S11之前还包括:根据各非指针变量在目标反编译结果中的各使用位置,从各使用位置对应函数的参数中获取各所述非指针变量的实际占位大小。
具体地,例如对于非指针变量s,在目标反编译结果中有一处位置作为函数memset的参数使用,即memset(&s,0,0x28),其中第三个参数为s的内存空间的大小,即实际占位大小。本实施例中的函数不限于memset函数。
在上述实施例的基础上,本实施例中步骤S11之前还包括:构建目标反编译结果的抽象语法树,根据抽象语法树获取目标反编译结果中各非指针变量的类型。
具体地,抽象语法树是一种软件分析方法,用于描述代码的层次结构,如图2所示。图2为一个main函数的抽象语法树,main函数如下所示:
int main(){
return 0;
}
图2中,抽象语法树包括根节点TranslationUnit和一棵关于函数声明的子树组成,其中函数声明MethodDeclaration包括函数返回类型PrimitiveType、函数名SimpleName以及函数体Block。一个解析单元对应于一个类C文件。构建抽象语法树的解析过程包括词法分析和语法分析两个部分。词法分析把类C代码拆解为记号。语法分析根据词法分析的结果,把记号组合成语法单元,进而通过预处理和对预处理后语法单元的分析形成一棵抽象语法树。
在上述实施例的基础上,本实施例中第一使用模式对应的第一权重为第一使用模式所属的使用类别对应的第一权重;其中,使用类别包括数组类使用、通用使用和非数组类使用。
具体地,由于类C代码是通过将二进制逆向转化为汇编代码而形成的,汇编代码格式型很强,需要恢复的类C代码基本都满足几种固定模式。为了提高计算速度,本实施例将使用模式分为三种使用类别即数组类使用、通用使用和非数组类使用。每种使用类别对应一个权重。其中,数组类使用对应的权重大于通用使用的权重,通用使用的权重大于非数组类使用的权重。权重越大,越有可能为数组变量。将第一使用模式所属使用类别对应的权重作为第一使用模式对应的权重。数组类使用为很有可能为数组的使用模式,如对目标变量s,使用模式memset(&s,0,0x28)为高概率数组类使用,很可能需要恢复。0x28为16进制的数据,转换为十进制数据为40,即s的实际占位大小为40字节。通用使用为无法判断目标变量是为普通变量还是数组变量。例如对于目标变量s,if(s)等逻辑判断无法确定s为普通变量还是数组的第0个元素。单纯的加减操作也无法判断是普通变量间的加减还是数组的偏移。因此,将此种使用模式作为对分析影响较小的通用使用。非数组类使用为位移操作和乘除法等,一般不会直接用于数组上。
在上述实施例的基础上,本实施例中步骤S12具体包括:S121,根据目标反编译结果的抽象语法树,获取目标变量在目标反编译结果中的各使用位置和各使用位置对应的第一使用模式;
具体地,对于所有目标变量,通过目标反编译结果的抽象语法树获取目标变量在目标反编译结果中的所有使用位置和各使用位置对应的第一使用模式。
S122,根据各第一使用模式对应的第一权重,将目标变量在目标反编译结果中各使用位置对应的第一权重相加;
具体地,各使用位置对应的第一权重为各使用位置所属的使用模式对应的第一权重。将目标变量在目标反编译结果中各使用位置对应的第一权重相加。
S123,若相加结果大于第二预设阈值,则获知目标变量为数组变量,对数组变量的数据结构进行恢复。
具体地,可以采用经验与机器学习等方式设定第一权重和第二预设阈值。
在上述实施例的基础上,本实施例中步骤S123还包括:若相加结果小于或等于第二预设阈值,且大于第三预设阈值,则获知目标变量为第一疑似数组变量;其中,第三预设阈值小于第二预设阈值;根据用户输入的第四预设阈值,确定是否对第一疑似数组变量的数据结构进行恢复;其中,第四预设阈值小于或等于第二预设阈值,且大于第三预设阈值。
具体地,为了进一步提高数组数据结构恢复的精确度,本实施例中将目标变量在目标反编译结果中各使用位置对应的第一权重相加的结果与第二预设阈值和第三预设阈值进行比较。将相加结果小于或等于第二预设阈值,且大于第三预设阈值的目标变量作为第一疑似数组变量。第一疑似数组变量有可能为数组变量。将小于或等于第三预设阈值的目标变量作为第一非数组变量,第一非数组变量为确定不为数组的变量。对于第一疑似数组变量,导出表格,表格中包含第一疑似数组变量的位置和各位置的使用模式信息。分析人员根据第一疑似数组变量在各处的使用情况,确定需要恢复的程度,具体由分析人员根据需要恢复的程度确定第四预设阈值,将相加结果大于第四预设阈值且小于或等于第二预设阈值的第一疑似数组变量进行数据结构恢复。当第四预设阈值等于第二预设阈值时,不对第一疑似数组变量进行数据结构恢复。
在上述各实施例的基础上,本实施例中步骤S11还包括:对于任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值小于或等于所述第一预设阈值,则将该非指针变量作为疑似目标变量;相应地,S12还包括:获取疑似目标变量在目标反编译结果中各使用位置对应的第二使用模式,若根据第二使用模式对应的第二权重确定疑似目标变量为第二疑似数组变量,则根据用户输入的第五预设阈值确定是否对第二疑似数组变量的数据结构进行恢复。
具体地,各使用位置对应的第二权重进行相加,各种使用模式对应的第二权重小于各种使用模式对应的第一权重。将相加结果与第二预设阈值和第三预设阈值进行比较,从而将疑似目标变量分为第二疑似数组类型变量和第二非数组变量。对于第二疑似数组变量,导出表格,表格中包含第二疑似数组变量的位置和各位置的使用模式信息。分析人员根据第二疑似数组变量在各处的使用情况,确定需要恢复的程度,具体由分析人员根据需要恢复的程度确定第五预设阈值,将相加结果大于第五预设阈值且小于或等于第二预设阈值的第二疑似数组变量进行数据结构恢复。当第五预设阈值等于第二预设阈值时,不对第二疑似数组变量进行数据结构恢复。
在上述各实施例的基础上,本实施例中步骤S12中对数组变量的数据结构进行恢复的步骤具体包括:根据数组变量的实际占位大小和数组变量的类型,计算数组变量中元素的个数;根据数组变量中元素的个数,对各使用位置的目标变量增加数据结构。
具体地,对确定为数组的变量,在目标反编译结果中对所有使用位置处的数组变量进行自动修改,保证修改前后代码语义不变,只是增加了数据结构。由于使用模式有限,可以进行高精度的自动恢复。具体用数组变量的实际占位大小除以数组变量的类型对应的占位大小,获取数组变量中元素的个数。例如,通过类C代码中memset(&s,0,0x28),可知s的实际占位大小为40字节,因为0x28为16进制的数据,转换为十进制数据为40。s的类型为int,int对应的占位大小为4字节。s中的元素个数为40/4=10。对类C代码恢复结果如下所示:
unsigned int f()
{int s[10];
memset(s,0,0x28u);
}。
在本发明的另一个实施例中提供一种二进制反编译中数组数据结构恢复系统,图3为本发明实施例提供的二进制反编译中数组数据结构恢复系统整体结构示意图,该系统包括比较模块1和恢复模块2;其中:
比较模块1用于对于任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;
其中,目标反编译结果为需要进行数组数据结构恢复的反编译结果。目标反编译结果可以为基于IDA工具将编译生成的目标二进制文件进行反编译生成的类C代码。目标反编译结果中丢失了数组的数据结构。非指针变量为目标编辑结果中不为指针的变量。实际占位大小为数据实际占有的内存空间的大小。类型为int和string等。每种类型有相应的占位大小,如int类型的数据占4个字节,所以int类型对应的占位大小为4字节。比较模块1计算各非指针变量的实际占位大小与各非指针变量的类型对应的占位大小之间的差值,若差值大于第一预设阈值,说明非指针变量的类型对应的占位大小与非指针变量的实际占位大小不符,则将各非指针变量标记为目标变量。目标变量为有较大可能为数组的变量,需要对其进行进一步分析确定是否为数组变量。
恢复模块2用于获取目标变量在目标反编译结果中各使用位置对应的第一使用模式,若根据第一使用模式对应的第一权重确定目标变量为数组变量,则对数组变量的数据结构进行恢复。
其中,恢复模块2获取目标变量在目标反编译结果中每处的使用位置,确定每处使用位置对应的第一使用模式。第一使用模式为目标变量在目标反编译结果中各使用位置对应的使用模式,如各种函数调用、判断逻辑中的使用和运算中的使用等。例如,对于目标变量s,在目标反编译结果中有一处使用位置对应的第一使用模式为memset(&s,0,0x28),memset为C++程序中分配内存空间的函数,其中,第一个参数为指定的内存地址,第三个参数为内存空间的大小。第一权重为第一使用模式对应的权重。每种第一使用模式对应有一个第一权重,越可能为数组的使用模式,权重越大。权重可以采用经验与机器学习的方式进行设定。恢复模块2根据目标变量每处使用所属的使用模式对应权重,确定目标变量是否为数组变量。在确定目标变量为数组变量后,对目标变量的数据结构进行恢复。由于目标变量为数组变量,因此将目标反编译结果中的目标变量更改为数组数据结构的变量。
本实施例通过将目标反编译结果中各非指针变量的实际占位大小与各非指针变量的类型对应的占位大小进行比较,确定各非指针变量是否为目标变量,然后根据目标变量在目标反编译结果中各处使用的方式对应的权重进一步判断目标变量是否为数组变量,将为数组变量的目标变量进行数据结构恢复。本实施例实现了对反编译结果中数组数据结构的自动恢复,且提高了数组数据结构恢复的正确率,增强了反编译生成的类C代码的语义完整性。
在上述实施例的基础上,本实施例中还包括第一获取模块,用于若目标反编译结果中各非指针变量为局部变量,则获取非指针变量所属函数的栈结构,根据各非指针变量在栈结构中的位置获取各非指针变量的实际占位大小;若各非指针变量为全局变量,则获取各非指针变量的存储区结构,根据各非指针变量在存储区结构中的位置获取各非指针变量的实际占位大小。
在上述实施例的基础上,本实施例中还包括第二获取模块,用于根据各非指针变量在目标反编译结果中的各使用位置,从各使用位置对应函数的参数中获取各所述非指针变量的实际占位大小。
在上述实施例的基础上,本实施例中还包括第三获取模块,用于构建目标反编译结果的抽象语法树,根据抽象语法树获取目标反编译结果中各非指针变量的类型。
在上述实施例的基础上,本实施例中第一使用模式对应的第一权重为第一使用模式所属的使用类别对应的第一权重;其中,使用类别包括数组类使用、通用使用和非数组类使用。
在上述实施例的基础上,本实施例中恢复模块具体用于:根据目标反编译结果的抽象语法树,获取目标变量在目标反编译结果中的各使用位置和各使用位置对应的第一使用模式;根据各第一使用模式对应的第一权重,将目标变量在目标反编译结果中各使用位置对应的第一权重相加;若相加结果大于第二预设阈值,则获知目标变量为数组变量,对数组变量的数据结构进行恢复。
在上述实施例的基础上,本实施例中恢复模块还用于:若相加结果小于或等于第二预设阈值,且大于第三预设阈值,则获知目标变量为第一疑似数组变量;其中,第三预设阈值小于第二预设阈值;根据用户输入的第四预设阈值,确定是否对第一疑似数组变量的数据结构进行恢复;其中,第四预设阈值小于或等于第二预设阈值,且大于第三预设阈值。
在上述各实施例的基础上,本实施例中比较模块还用于:对于任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值小于或等于所述第一预设阈值,则将该非指针变量作为疑似目标变量;相应地,恢复模块还用于:获取疑似目标变量在目标反编译结果中各使用位置对应的第二使用模式,若根据第二使用模式对应的第二权重确定疑似目标变量为第二疑似数组变量,则根据用户输入的第五预设阈值确定是否对第二疑似数组变量的数据结构进行恢复。
在上述各实施例的基础上,本实施例中恢复模块具体用于:根据数组变量的实际占位大小和数组变量的类型,计算数组变量中元素的个数;根据数组变量中元素的个数,对各使用位置的目标变量增加数据结构。
本实施例提供一种二进制反编译中数组数据结构恢复设备,图4为本发明实施例提供的二进制反编译中数组数据结构恢复设备整体结构示意图,该设备包括:至少一个处理器41、至少一个存储器42和总线43;其中,
处理器41和存储器42通过总线43完成相互间的通信;
存储器42存储有可被处理器41执行的程序指令,所述处理器调用所述程序指令能够执行上述各方法实施例所提供的方法,例如包括:S11,对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;S12,获取所述目标变量在所述目标反编译结果中各使用位置对应的第一使用模式,若根据所述第一使用模式对应的第一权重确定所述目标变量为数组变量,则对所述数组变量的数据结构进行恢复。
本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:S11,对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;S12,获取所述目标变量在所述目标反编译结果中各使用位置对应的第一使用模式,若根据所述第一使用模式对应的第一权重确定所述目标变量为数组变量,则对所述数组变量的数据结构进行恢复。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的二进制反编译中数组数据结构恢复设备实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种二进制反编译中数组数据结构恢复方法,其特征在于,包括:
S11,对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;
S12,获取所述目标变量在所述目标反编译结果中各使用位置对应的第一使用模式,若根据所述第一使用模式对应的第一权重确定所述目标变量为数组变量,则对所述数组变量的数据结构进行恢复;
其中,S12具体包括:
S121,根据所述目标反编译结果的抽象语法树,获取所述目标变量在所述目标反编译结果中各使用位置和各所述使用位置对应的第一使用模式;
S122,根据各所述第一使用模式对应的第一权重,将所述目标变量在所述目标反编译结果中各使用位置对应的第一权重相加;
S123,若相加结果大于第二预设阈值,则获知所述目标变量为数组变量,对所述数组变量的数据结构进行恢复;
其中,S12中对数组变量的数据结构进行恢复的步骤具体包括:
根据所述数组变量的实际占位大小和所述数组变量的类型,计算所述数组变量中元素的个数;
根据所述数组变量中元素的个数,对各所述使用位置的目标变量增加数据结构。
2.根据权利要求1所述的方法,其特征在于,步骤S11之前还包括:
若目标反编译结果中各非指针变量为局部变量,则获取所述非指针变量所属函数的栈结构,根据各所述非指针变量在所述栈结构中的位置获取各所述非指针变量的实际占位大小;
若各所述非指针变量为全局变量,则获取各所述非指针变量的存储区结构,根据各所述非指针变量在所述存储区结构中的位置获取各所述非指针变量的实际占位大小。
3.根据权利要求1所述的方法,其特征在于,S11之前还包括:
根据各非指针变量在目标反编译结果中的各使用位置,从各所述使用位置对应函数的参数中获取各所述非指针变量的实际占位大小。
4.根据权利要求1所述的方法,其特征在于,S11之前还包括:
构建目标反编译结果的抽象语法树,根据所述抽象语法树获取所述目标反编译结果中各非指针变量的类型。
5.根据权利要求1所述的方法,其特征在于,所述第一使用模式对应的第一权重为所述第一使用模式所属的使用类别对应的第一权重;
其中,所述使用类别包括数组类使用、通用使用和非数组类使用。
6.根据权利要求1所述的方法,其特征在于,S123还包括:
若所述相加结果小于或等于所述第二预设阈值,且大于第三预设阈值,则获知所述目标变量为第一疑似数组变量;其中,所述第三预设阈值小于所述第二预设阈值;
根据用户输入的第四预设阈值,确定是否对所述第一疑似数组变量的数据结构进行恢复;其中,所述第四预设阈值小于或等于所述第二预设阈值,且大于所述第三预设阈值。
7.根据权利要求1-6任一所述的方法,其特征在于,S11还包括:
对于任一所述非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值小于或等于所述第一预设阈值,则将该非指针变量作为疑似目标变量;
相应地,S12还包括:
获取所述疑似目标变量在所述目标反编译结果中各使用位置对应的第二使用模式,若根据所述第二使用模式对应的第二权重确定所述疑似目标变量为第二疑似数组变量,则根据用户输入的第五预设阈值确定是否对所述第二疑似数组变量的数据结构进行恢复。
8.一种二进制反编译中数组数据结构恢复系统,其特征在于,包括:
比较模块,用于对于目标反编译结果中任一非指针变量,若该非指针变量的实际占位大小与该非指针变量的类型对应的占位大小之间的差值大于第一预设阈值,则将该非指针变量作为目标变量;
恢复模块,用于获取所述目标变量在所述目标反编译结果中各使用位置对应的第一使用模式,若根据所述第一使用模式对应的第一权重确定所述目标变量为数组变量,则对所述数组变量的数据结构进行恢复;
其中,恢复模块具体用于:
根据目标反编译结果的抽象语法树,获取目标变量在目标反编译结果中的各使用位置和各使用位置对应的第一使用模式;
根据各第一使用模式对应的第一权重,将目标变量在目标反编译结果中各使用位置对应的第一权重相加;
若相加结果大于第二预设阈值,则获知目标变量为数组变量,对数组变量的数据结构进行恢复;
其中,恢复模块具体用于:
根据数组变量的实际占位大小和数组变量的类型,计算数组变量中元素的个数;
根据数组变量中元素的个数,对各使用位置的目标变量增加数据结构。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810573717.3A CN108958739B (zh) | 2018-06-06 | 2018-06-06 | 一种二进制反编译中数组数据结构恢复方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810573717.3A CN108958739B (zh) | 2018-06-06 | 2018-06-06 | 一种二进制反编译中数组数据结构恢复方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108958739A CN108958739A (zh) | 2018-12-07 |
CN108958739B true CN108958739B (zh) | 2020-11-10 |
Family
ID=64492988
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810573717.3A Active CN108958739B (zh) | 2018-06-06 | 2018-06-06 | 一种二进制反编译中数组数据结构恢复方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108958739B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103049265A (zh) * | 2012-12-14 | 2013-04-17 | 武汉大学 | 一种在逆向反编译系统中标志位的处理方法 |
CN103294598A (zh) * | 2013-05-28 | 2013-09-11 | 华为技术有限公司 | 一种源代码检查方法及装置 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6477683B1 (en) * | 1999-02-05 | 2002-11-05 | Tensilica, Inc. | Automated processor generation system for designing a configurable processor and method for the same |
-
2018
- 2018-06-06 CN CN201810573717.3A patent/CN108958739B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103049265A (zh) * | 2012-12-14 | 2013-04-17 | 武汉大学 | 一种在逆向反编译系统中标志位的处理方法 |
CN103294598A (zh) * | 2013-05-28 | 2013-09-11 | 华为技术有限公司 | 一种源代码检查方法及装置 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
Also Published As
Publication number | Publication date |
---|---|
CN108958739A (zh) | 2018-12-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110609693B (zh) | 基于数据标准化的代码更新方法、装置及终端设备 | |
US10387236B2 (en) | Processing data errors for a data processing system | |
US11775414B2 (en) | Automated bug fixing using deep learning | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
CN112379917B (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
CN110990058B (zh) | 软件相似性度量方法及装置 | |
CN112667240A (zh) | 程序代码转换方法及相关设备 | |
JP2018505506A (ja) | 機械ベースの命令編集 | |
CN105122208A (zh) | 源程序分析系统、源程序分析方法和记录有程序的非瞬时记录介质 | |
CN112131122B (zh) | 一种源代码缺陷检测工具误报评估方法及装置 | |
WO2023241529A1 (zh) | 漏洞信息处理方法、服务装置和漏洞检测模块 | |
CN117113347A (zh) | 一种大规模代码数据特征提取方法及系统 | |
CN112131120A (zh) | 一种源代码缺陷检测方法及装置 | |
KR102550596B1 (ko) | 스마트 컨트랙트 코드 취약점 분석 장치 및 방법 | |
CN113536770B (zh) | 基于人工智能的文本解析方法、装置、设备及存储介质 | |
CN113918467A (zh) | 金融系统测试方法、装置、设备及存储介质 | |
CN114691196A (zh) | 动态语言的代码缺陷检测方法及装置、电子设备 | |
CN117435480A (zh) | 一种二进制文件检测方法、装置、电子设备及存储介质 | |
CN117940894A (zh) | 用于检测代码克隆的系统和方法 | |
CN108958739B (zh) | 一种二进制反编译中数组数据结构恢复方法及系统 | |
CN113760891A (zh) | 一种数据表的生成方法、装置、设备和存储介质 | |
CN112613176A (zh) | 慢sql语句预测方法及系统 | |
CN109670317B (zh) | 一种基于原子控制流图的物联网设备继承性漏洞挖掘方法 | |
CN113971284A (zh) | 基于JavaScript的恶意网页检测方法、设备及计算机可读存储介质 |
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 |