一种获取可执行文件输入表的方法及装置.pdf

上传人:62****3 文档编号:1027563 上传时间:2018-03-26 格式:PDF 页数:18 大小:599.25KB
返回 下载 相关 举报
摘要
申请专利号:

CN200910171415.4

申请日:

2009.08.28

公开号:

CN102004884A

公开日:

2011.04.06

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 21/22申请日:20090828|||公开

IPC分类号:

G06F21/22; G06F9/445

主分类号:

G06F21/22

申请人:

华为技术有限公司; 电子科技大学

发明人:

刘丹; 李毅超; 余三超; 贾范兵; 杨晗; 赵忠树; 张大成

地址:

518129 广东省深圳市龙岗区坂田华为总部办公楼

优先权:

专利代理机构:

深圳市深佳知识产权代理事务所(普通合伙) 44285

代理人:

彭愿洁;李文红

PDF下载: PDF下载
内容摘要

本发明实施例公开了一种获取可执行文件输入表方法,本发明实施例还提供相应的装置。本发明实施例通过在建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址,查找与获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更通用,且不需要人工干预,自动化程度高。

权利要求书

1.一种获取可执行文件输入表方法,其特征在于,包括:获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括:所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;所述动态链接库信息列表中还包括:所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;对所述目标加壳程序的代码进行反汇编,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;在所述动态链接库信息列表中,查找与获取的控制流跳转类指令的目的地址相同的地址;根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。2.根据权利要求1所述的方法,其特征在于,所述获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容之后,所述查找与获取的控制流跳转类指令的目的地址相同的地址之前,所述方法还包括:去除所述获取所有控制流跳转类指令的目的地址中包括的,非可执行地址范围内的地址;则所述查找与获取的控制流跳转类指令的目的地址相同的地址,具体包括:查找与控制流跳转类指令的目的地址相同的地址,所述控制流跳转类指令的目的地址,为去除非执行地址范围内地址的控制流跳转类指令的目的地址。3.根据权利要求1所述的方法,其特征在于,所述非可执行地址范围至少包括:空指针区域,内核区域,或者保留状态的地址其中任一项。4.根据权利要求1所述的方法,其特征在于,所述获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容之后,所述查找与获取的控制流跳转类指令的目的地址相同的地址之前,所述方法还包括:获取所有控制流跳转类指令的目的地址中的最大值,从所述最大值开始,向地址大于所述最大值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;和/或,获取所有控制流跳转类指令的目的地址中最小值,从所述最小值开始,向地址小于所述最小值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;所述查找与获取的控制流跳转类指令的目的地址相同的地址,具体包括:查找与获取的控制流跳转类指令的目的地址相同的地址,和,查处与搜索到的地址相同的地址。5.根据权利要求1所述的方法,其特征在于,所述方法还包括:当控制流跳转类指令的目的地址为:在所述动态链接库信息列表中,没有查找到与所述控制流跳转类指令的目的地址相同的地址时,对所述控制流跳转类指令的目的地址指向的内容,进行反汇编,得到反汇编后的代码;判断所述反汇编后的代码中是否有应用程序接口调用;如果有,获取所述应用程序接口调用的地址;则,根据查找结果中包括的导出函数的地址,所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,所述应用程序接口调用的地址,和所述应用程序接口调用的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表。6.一种获取可执行文件输入表装置,其特征在于,包括:动态链接库(DLL)信息获取单元,用于获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括:所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;所述动态链接库信息列表中还包括:所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;反汇编单元,用于对所述目标加壳程序的代码进行反汇编;控制流跳转类指令获取地址单元,用于从所述反汇编单元中输出的反汇编代码中,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;有效地址获取单元,用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址;输入表重构单元;用于根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。7.根据权利要求6所述的装置,其特征在于,所述装置还包括:筛选单元,用于去除所述获取所有控制流跳转类指令的目的地址中包括的,非可执行地址范围内的地址;则所述有效地址获取单元,具体用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与控制流跳转类指令的目的地址相同的地址,所述控制流跳转类指令的目的地址,为去除非执行地址范围内地址的控制流跳转类指令的目的地址。8.根据权利要求6所述的装置,其特征在于,所述装置还包括:搜索单元,用于获取所有控制流跳转类指令的目的地址中的最大值,从所述最大值开始,向地址大于所述最大值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;和/或,获取所有控制流跳转类指令的目的地址中最小值,从所述最小值开始,向地址小于所述最小值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;则有效地址获取单元,具体用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址,和,查处与搜索到的地址相同的地址。9.根据权利要求6所述的装置,其特征在于,所述有效地址获取单元,具体包括:第一判断单元,用于判断所述获取的控制流跳转类指令的目的地址,是否在所述动态链接库信息列表中查找到,如果是,通知第一填写单元;第一填写单元,用于将在所述动态链接库信息列表中查找到的,与所述控制流跳转类指令的目的地址相同的地址,填写到第二输入地址表中;则所述输入表重构单元,具体用于根据所述第二输入地址表,和动态链接库信息列表,建立所述目标加壳程序的输入表。10.根据权利要求9所述的装置,其特征在于,所述有效地址获取单元,还包括:第二反汇编单元,用于当所述第一判断单元判断出,控制流跳转类指令的目的地址为:在所述动态链接库信息列表中,没有查找到与所述控制流跳转类指令的目的地址相同的地址时,对所述控制流跳转类指令的目的地址指向的内容,进行反汇编,得到反汇编后的代码;第二判断单元,用于判断所述反汇编后的代码中是否有应用程序接口调用,如果有,通知第二填写单元;第二填写单元,用于将所述应用程序接口调用的地址,填写到所述第二输入地址表。

说明书

一种获取可执行文件输入表的方法及装置

技术领域

本发明涉及计算机及通信技术领域,具体涉及一种获取可执行文件输入表的方法及装置。

背景技术

壳(Shell)是一种二进制代码的变换方式,是一种附着在目标程序之上,负责保护软件使其难以被分析的程序。由于这种保护功能,所以被形象地称之为壳。壳通常都是先于程序执行,获取到控制权,然后完成它们保护目标软件的任务。

加壳被广泛运用于软件保护和恶意代码反检测领域。对软件加壳,通常包括三方面的内容,一是对目标软件的二进制代码进行混淆变换或者加密;二是对目标软件的软件结构进行变换,使系统信息加载中断或者变更,破坏软件运行必需的环境,其中,最主要的手段就是更改可执行文件的输入表,隐藏软件运行所必须引入的应用程序编程接口(API,Application ProgrammingInterface);三是加入对抗、校验代码等以干扰调试、脱壳。

当要运行加壳后的目标软件,就需要对目标软件进行脱壳。一种通用的脱壳方法是:直接逆向脱壳方法,即针对某种特定的加壳方法,分析其实现,寻找逆算法进行脱壳。直接逆向脱壳方法具体操作包括:

首先,通过入口点代码等特征识别目标软件所加的壳是何种壳;之后,人工分析其代码加密方法和输入表变换方法,获取到解密方法;解密后,去掉对抗及校验代码,完成脱壳;最后,将壳特征和脱壳方法入库,待下次匹配成功,直接调用该方法进行脱壳。

在对现有技术的研究和实践过程中,本申请的发明人发现,上述脱壳方法针对特定的目标种类的壳进行脱壳。一旦出现壳变种、新壳,即使是加密代码中一个简单加密子的变换,也会使该方法彻底失效,因此,上述现有技术中的脱壳方法不具有普遍适用性。

而且,人工分析其代码加密方法和输入表变换方法,使得该方法自动化程度不高,效率低。

现有技术中还有其它脱壳方法,主要是针对脱壳过程中如何解密代码,通过解密可以正确还原二进制代码,去除对抗、校验代码,便于目前常规的特征码匹配杀毒和静态的逆向分析。但是仅恢复二进制代码,不对输入表进行修复使脱壳的程序无法再运行。

发明内容

本发明实施例提供一种获取可执行文件输入表方法及装置,提供了一种普遍适用、不需人工干预,可获取并重构目标加壳程序的输入表的技术方案,使得脱壳后目标程序可以正常运行。

本发明实施例提供一种获取可执行文件输入表方法,包括:

获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括:所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;

所述动态链接库信息列表中还包括:所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;

对所述目标加壳程序的代码进行反汇编,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;

在所述动态链接库信息列表中,查找与获取的控制流跳转类指令的目的地址相同的地址;

根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。

本发明实施例还提供一种获取可执行文件输入表装置,包括:

动态链接库(DLL)信息获取单元,用于获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括:所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;

所述动态链接库信息列表中还包括:所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;

反汇编单元,用于对所述目标加壳程序的代码进行反汇编;

控制流跳转类指令获取地址单元,用于从所述反汇编单元中输出的反汇编代码中,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;

有效地址获取单元,用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址;

输入表重构单元;用于根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。

本发明实施例通过在建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表和IAT_3建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更通用,且不需要人为分析,自动化程度高。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例一提供一种获取可执行文件输入表方法流程简图;

图2是本发明实施例一中提供的一种创建的DLL信息列表的表头示意图;

图3是本发明实施例一中提供的包括地址和该地址指向的内容的列表示意图;

图4是本发明实施例一中提供的建立输入表示意图;

图5是本发明实施例二提供一种获取可执行文件输入表方法流程简图;

图6是本发明实施例三提供一种获取可执行文件输入表装置的逻辑单元示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供一种获取可执行文件输入表方法,本发明实施例还提供相应的执行装置。以下分别进行详细说明。

为了便于理解本发明各实施例提供的技术方案,需要说明的是,设备先加载目标加壳程序,在代码解密完成处,即呈现的原始入口点(OEP,orignal entrypoint),设置断点,本发明实施例提供的获取可执行文件输入表的方法从此时开始执行,通过本发明实施例提供的方法,从加密的目标加壳程序中最终获取到输入表。当该断点被触发,则解密后具有输入表的目标程序就可以动态加载DLL,从而可以执行目标程序。以下分别进行详细说明。

实施例一、

本发明实施例提供一种获取可执行文件输入表方法。在对本实施例提供的方法做说明之前,首先对输入表这一概念做说明,以便于对本发明实施例提供的方法的理解。

要运行的加壳的目标软件是由可执行文件组成的,该可执行文件中会调用一个或者多于一个的动态链接库(DLL,Dynamic Link Library)中的DLL文件,即调用DLL的代码或者数据,该调用的DLL的代码或数据,称为输入。输入函数地址的定位是在可执行文件加载时,操作系统通过输入表决定的。输入表(Improt Table)是可执行文件结构中不可或缺的部分。当可执行文件需要调用其他文件函数时,需要查找输入表进行寻址。输入表中的内容全部是其他文件可被调用的函数的地址。其中,所说的可被调用的函数,即是指API函数,它不是目标可执行文件本身的,而是系统提供的,所以目标要调用它,必须通过输入表找到调用的地址。

输入表是多个数组组成的数据结构,包括:输入描述表(IID,IMAGE_IMPORT_DESCRIPTOR)、输入名称表(INT,Import Name Table)、输入地址表(IAT,Import Address Table)和输入函数名(IIN,IMAGE_IMPORT_BY_NAME)。操作系统通过IID、INT及IIN定位引入函数地址,并将引入的函数地址写入IAT,完成DLL加载。而加壳的目标软件通常删除IID、INT和IIN,由加壳的目标软件自行填充IAT。因此,现有技术中脱壳后,填充IAT的IID、INT、IIN三项的代码被移除,而由加壳的目标软件自行填充的IAT显然不能被操作系统所正常识别,导致目标软件无法运行。

本发明实施例提供的一种获取输入表的方法,能够识别可执行文件调用DLL代码或者数据的输入地址表(IAT),修复IAT,重新建立输入表(ImportTable)。参见图1所述,该方法包括:

步骤1:获取目标加壳程序所加载的所有动态链接库DLL,根据获取的DLL建立DLL信息列表,该DLL信息列表中包括以下内容中的任何一项:

目标加壳程序所加载的所有DLL的名称,

目标加壳程序所加载的每个DLL的基址,

目标加壳程序所加载的每个DLL占用的内存范围,

目标加壳程序所加载的每个DLL中导出函数的地址其中所有项,以及

目标加壳程序所加载的每个DLL中导出函数的名称,和

目标加壳程序所加载的每个DLL中导出函数的序号其中任一项。

如图2所示,为创建的DLL信息列表的表头,即DLL信息列表中各项的名称。

其中,步骤1中根据获取的目标加壳程序所加载的所有动态链接库DLL,建立DLL信息列表的具体出操作可以包括:

步骤A1:获取目标加壳程序所加载的所有DLL的名称,每个DLL名称所对应的基址和目标加壳程序所加载的每个DLL占用的内存范围;

步骤A2:根据获取目标加壳程序所加载的所有DLL的名称、获取到目标加壳程序所加载的每个DLL中的导出函数的名称和目标加壳程序所加载的每个DLL中导出函数的序号其中任一项;还可以获取每个导出函数相对基址的偏移;

步骤A3:根据步骤A1中获取的DLL名称所对应的基址,和步骤A2中获取的每个导出函数相对于基址的偏移,获取每个DLL中导出函数的地址;从而建立DLL信息列表。

其中,该DLL信息列表中,包括:

步骤A1中获取的目标加壳程序所加载的所有DLL的名称、DLL名称所对应的基址和目标加壳程序所加载的每个DLL占用的内存范围;和

步骤A2中获取的目标加壳程序所加载的每个DLL中的导出函数的名称,或者目标加壳程序所加载的每个DLL中导出函数的序号;以及

该步骤A3中获取的每个DLL中导出函数的地址。

其中,步骤A3中获取的每个DLL中导出函数的地址为该导出函数所在的DLL的基址与该导出函数相对基址的偏移量的和。

通过上述对步骤A1至A3的说明,使得系统可以获知目标加壳程序所加载的所有动态链接库DLL的相关信息,即建立上述DLL信息列表。其中,该目标加壳程序中所调用的所有函数的地址,都可以在该DLL信息列表中的导出函数的地址项中的查找到。因此,该DLL信息列表在后续的操作中发挥重要作用。

步骤2:对目标加壳程序代码进行反汇编,获取所有控制流跳转类指令的目的地址和该目的地址指向的内容;

如图3所示,为步骤2中获取的控制流跳转类指令的目的地址和该目的地址指向的内容所组成的列表的表头,即该列表中各项的名称。

其中,在步骤2中目标加壳程序代码都为二进制,为了便于理解和识别该目标加壳程序中的指令是什么,需要对目标加壳程序代码进行反汇编;通过反汇编,识别出目标加壳程序中的所有控制流跳转类指令,从而获取所有控制流跳转类指令的目的地址,该类指令的目的地址通常为要调用的函数的地址,即控制流跳转类指令的目的地址通常为API函数的地址。控制流跳转类指令的目的地址也可以是非可执行文件的地址。

其中,控制流跳转类指令的格式可以是:jmp[xxx],或者call[xxx],或者其它格式,此处具体举例不应理解为对本发明实施例的限制。其中,xxx为被调用函数的地址(或者API函数的地址)。步骤2中所说的“该地址指向的内容”可以是指该地址指向API函数本身;如果控制流跳转类指令的目的地址为非可执行文件的地址,则“该地址指向的内容”为其它数据。

步骤3:在步骤1中已经建立的DLL信息列表中包括的,目标加壳程序所加载的每个DLL中导出函数的地址中,查找与步骤2中获取的控制流跳转类指令的目的地址相同的地址,将查找到的地址和该查找到的地址指向的内容作为第三输入地址表(即IAT_3);

便于理解的是,IAT_3的列表格式可以参考图3。

其中,所有控制流跳转类指令的目的地址中,可以包括目标程序调用的系统函数的地址(即API的地址),通过将控制流跳转类指令的目的地址,与步骤1中获取的目标加壳程序所加载的每个DLL中导出函数的地址进行对比,查找出相同的地址,那么这些相同的地址,就应该是系统调用函数的地址(即API的地址),如果目标加壳程序中的控制流跳转类指令的目的地址为API地址,可以将目标加壳程序跳转到该API地址,从而调用系统DLL中的函数(该函数对DLL自身为导出函数,该导出函数的地址为该API的地址)。

为了便于理解,这里还需要说明的是,步骤3中,在DLL信息列表中,没有找到与步骤2中获取的控制流跳转类指令的目的地址相同的地址,这类地址所对应的导出函数,可以统一称为需要修复的地址,在修复前还可以去掉非可执行地址(因为是不可执行的所以没有必要修复),以减轻时间消耗。

相似的,在步骤2中获取的控制流跳转类指令的目的地址中,没有找到与步骤1中DLL信息列表中包括的导出函数的地址相同的地址,这类控制流跳转类指令的目的地址为非可执行文件的地址,或者是,这类控制流跳转类指令的目的地址需要修复(具体修复的说明在后续的文字中会说明,此处先不介绍)。本段文字只是便于理解的说明,而非绝对,不应该理解为对本发明实施例的限制。

步骤4:根据获取的IAT_3中包括的所有地址,该地址指向的内容,和在已经建立的DLL信息列表中该地址对应的所有信息,建立该目标加壳程序的输入表。

其中,步骤4中将IAT_3中地址与DLL信息列表中导出函数地址进行匹配,与导出函数的地址相同的IAT_3中地址,按照DLL信息列表中的DLL名称分类,与同属于一个DLL名称中的导出函数的地址相同的IAT_3中地址,被填写在一张输入表中的IAT中,且根据IAT_3中地址,从DLL信息列表获取对应的信息,填入输入表的IID,INT,IAT和IIN中,并且,建立IID,INT,IAT和IIN之间的指针关系。

其中,可以参考图4所示,为某一DLL所对应的输入表,该输入表中的IAT中填写的地址,为DLL信息列表中同一个名称的DLL中导出函数地址,并且,该导出函数地址全部包括在IAT_3中。

其中,每一个DLL名称对应如图4所示结构相同的输入表,每一个DLL中包括多个导出函数,因此,相同DLL名称的输入表中,在IAT中包括一个或者多于一个的调用函数地址。

由于IAT_3中的地址都包括在DLL信息列表中,则一种具体的填写输入表的方法可以是:

步骤C1:将IAT_3中的一个地址与DLL信息列表中导出函数地址进行匹配;

步骤C2:判断是否存在一张输入表,该输入表中DLL名称为上述一个地址所对应的,DLL信息列表中的DLL名称,如果没有,则进入步骤C3;如果有,则进入步骤C5;

步骤C3:创建一张输入表,将该地址填写在创建的输入表中IAT中,然后,执行步骤C4;

步骤C4:将匹配后获取的DLL信息列表中的DLL名称、该DLL的基址、和该DLL所占内存范围所有项,填入该输入表中的IID中;将匹配后获取的导出函数的名称或者导出函数的序号,填入该输入表中的IIN中和INT中;建立IID、IIN、IAT、和INT所有项之间的指针;

其中,IIN与INT中填写的内容相同,包括匹配后获取的导出函数的名称和/或导出函数的序号。

步骤C5:将该地址填写在创建的输入表中IAT中,匹配后获取的导出函数的名称或者导出函数的序号,填入该输入表中的IIN中和INT中;建立IIN,IAT和INT对应项的指针。其中,上述对步骤C5的理解,也可以结合图4,即根据步骤C2中判断出已经存在一张输入表,该输入表中DLL名称为上述一个地址所对应的,DLL信息列表中的DLL名称,那么,就在输入表的IAT列表中增加一行,用于填写IAT_3中的该一个地址。

其中,建立IID、IIN、IAT、和INT所有项之间的指针,如图4中所示的箭头方向,为指针方向。具体的建立输入表中IID、IIN、IAT、和INT所有项之间的指针的方法是现有技术,此处不详述。

步骤C6:将IAT_3中的每个地址都执行上述步骤C1至C5,然后结束。

通过上述对步骤C1至C6的说明,可以更加清楚的理解本发明实施例中的步骤4。

通过对上述步骤1至步骤4的说明,通过在步骤1中已经建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与步骤2中获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更具普适性,且不需要人工干预,自动化程度高。

实施例二、

本发明实施例提供一种获取可执行文件输入表的方法,该方法与实施例一提供的方法相似,都可以对获取到目标加壳程序的输入表;而本发明实施例提供的方法,在实施例一的基础上增加了一些操作,使得获取的输入表更准确,也可以使得该操作过程效率更高。

下面结合附图5对本实施例提供的方法做说明,该方法包括:

步骤D1、步骤D2与实施例一中步骤1、步骤2相同,请参考步骤1、步骤2中说明;

步骤D3:去除步骤D2中获取的所有控制流跳转类指令的目的地址中的非可执行地址范围内的地址,及该非可执行地址范围内的地址指向的内容;从而获取到IAT_1,该IAT_1中包括:没有去除的控制流跳转类指令的目的地址,和该没有去除的控制流跳转类指令的目的地址指向的内容。

便于理解的是,IAT_1的列表格式可以参考图3。

其中,上述步骤D3中所述的非可执行地址范围,通常至少包括:空指针区域,内核区域,或者其他禁入区域地址其中任一项;非可执行地址范围也可以包括:属于保留状态(未分配的空间)的地址。

还需要说明的是,由于执行了步骤D3,使得后续步骤D7至D9中对无效地址的修复操作时,减少修复的次数,提高了方法执行的速度。

步骤D4:获取IAT_1中没有去除的控制流跳转类指令的目的地址的最大值,从该最大值开始,向地址大于该最大值的方向搜索,当搜索中遇到地址指向的内容为空(或者为零)时停止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;

和/或,获取IAT_1中没有去除的控制流跳转类指令的目的地址的最小值,从该最小值开始,向地址小于该最小值的方向搜索,当搜索中遇到地址指向的内容为空(或者为零)时停止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;

其中,与实施例一相比,增加该步骤D4,由于执行了步骤D4,使得IAT_1中地址的范围,比步骤D2中只是获取所有控制流跳转类指令的目的地址的范围要大,使得最终获取的输入表最大程度上接近未加壳时目标程序的输入表。

步骤D5:判断IAT_1中每一项地址是否都可以在DLL信息列表中,查找到与该IAT_1中的地址相同的地址,如果是,则执行步骤D6;如果否,则执行步骤D7;

步骤D6:将在DLL信息列表中查找到相同地址的IAT_1中地址,填写到IAT_2中;

便于理解的是,IAT_2的列表格式也可以参考图3。

其中,在DLL信息列表中查找到相同地址的IAT_1中地址,也可以称为“有效地址”;在DLL信息列表中没有查找到相同地址的IAT_1中地址,也可以称为“无效地址”。

步骤D7:对在DLL信息列表中没有查找到相同地址的IAT_1中地址的内容,进行反汇编,得到反汇编后的代码;

步骤D8:判断反汇编后的代码中是否有API调用,如果有,执行步骤D9;如果没有,则结束流程;

步骤D9:获取反汇编后的代码中第一个API调用的地址,将该地址填写入IAT_2中;

其中,与实施例一相比,该实施例二中增加的步骤D7至步骤D9,设备可以对无效地址进行修复,即获取到无效地址指向的内容中API调用的地址。在已经创建的DLL信息列表中,可以找到与该API调用的地址相同的导出函数地址。从而,在后续的步骤D10中可以实现重构输入表。

步骤D10:与实施例一中步骤4相似,根据步骤D6和步骤D9而获取的IAT_2中包括的所有地址,该地址指向的内容,和在已经建立的DLL信息列表中该地址对应的所有信息,建立该目标加壳程序的输入表。

其中,IAT_2的作用于实施例一中IAT_3的作用相同。对步骤D10的说明,请参考实施例一中关于步骤4的说明,此处不重述。

通过对上述步骤D1至步骤D10的说明,通过在建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与IAT_2中地址相同的地址,从而获取有效地址和无效地址,对无效地址进行修复,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更具普适性,且不需要人工干预,自动化程度高。

进一步,该方法中去除了非可执行地址范围内的地址的操作,减少了后续操作中对无效地址的不必要修复,从而提高了该方法的执行效率;

进一步,该方法中增加了步骤D4中从地址最大值和/或最小值开始搜索地址,防止在IAT_1遗漏可能的调用的API地址,使得最终获取的输入表更准确。

进一步,该方法中增加步骤D7至D9的操作,对无效地址进行修复,可以获取到控制流跳转类指令间接调用的API地址,使得最终获取的输入表更准确。

实施例三、

本发明实施例提供一种获取可执行文件输入表的装置,如图6所示,该装置包括:动态链接库(DLL)信息获取单元100,反汇编单元101,控制流跳转类指令地址获取单元102,有效地址获取单元103,和输入表重构单元104。

其中,DLL信息获取单元100,用于获取目标加壳程序所加载的所有动态链接库DLL,根据获取的DLL建立DLL信息列表,该DLL信息列表中包括:目标加壳程序所加载的所有DLL的名称,目标加壳程序所加载的每个DLL的基址,目标加壳程序所加载的每个DLL占用的内存范围,目标加壳程序所加载的每个DLL中导出函数的地址其中所有项,和目标加壳程序所加载的每个DLL中导出函数的名称,与目标加壳程序所加载的每个DLL中导出函数的序号其中任一项;

反汇编单元101,用于对目标加壳程序代码进行反汇编;

控制流跳转类指令地址获取单元102,用于从反汇编单元101中反汇编的结果中,获取所有控制流跳转类指令的目的地址和该地址指向的内容;

有效地址获取单元103,用于在获取DLL信息单元100中已经建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与控制流跳转类指令地址获取单元102中获取的控制流跳转类指令的目的地址相同的地址,将查找结果中包括的地址和该地址指向的内容制作为IAT_3;

输入表重构单元104,用于根据获取的IAT_3中包括的所有地址,该地址指向的内容,和在已经建立的DLL信息列表中该地址对应的所有信息,建立该目标加壳程序的输入表。

其中,还需要说明的是,该装置的逻辑单元还可以划分为:输入地址表识别模块,输入地址表修复模块,和输入表重建模块。

应该理解的是:输入地址表识别模块可以包括:上述说明的获取动态链接库(DLL)信息单元100,反汇编单元101,和控制流跳转类指令地址获取单元102这三个单元;

输入地址表修复模块可以包括:上述说明的有效地址获取单元103;

输入表重建模块可以包括:上述说明的输入表重构单元104。

为了更清楚了理解本实施例提供的装置,可以结合实施例一中提供的方法的说明。

通过对本发明实施例提供的装置的说明,该装置通过在已经建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立输入表。该装置对于任何加壳方法都适用,与现有技术相比,该装置更具普适性,且不需要人工干预,自动化程度高。

进一步,为了去除控制流跳转类指令地址获取单元102中非可执行地址范围内的地址,该装置中还可以包括:筛选单元105,用于去除控制流跳转类指令地址获取单元102中,获取的所有控制流跳转类指令的目的地址中的非可执行地址范围内的地址,及该非可执行地址范围内的地址指向的内容;从而获取到IAT_1,该IAT_1中包括:没有去除的控制流跳转类指令的目的地址,和该没有去除的控制流跳转类指令的目的地址指向的内容。

进一步,为了不遗漏输入地址,扩大获选的输入地址范围,该装置还可以包括:搜索单元106,用于从控制流跳转类指令地址获取单元102,或者筛选单元105其中任一项中的输出结果中,获取地址的最大值,从该最大值开始,向地址大于该最大值的方向搜索,当搜索中遇到地址指向的内容为空(或者为零)时停止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;

和/或,获取地址的最小值,从该最小值开始,向地址小于该最小值的方向搜索,当搜索中遇到地址指向的内容为空(或者为零)时停止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;

其中,这里的IAT_1中可以保存没有去除的控制流跳转类指令的目的地址及地址指向的内容,也可以保存从控制流跳转类指令地址获取单元102中,获取的所有从控制流跳转类指令地址即及其地址指向的内容。

进一步,本发明实施例提供的装置中的有效地址获取单元103可以具体包括:第一判断单元2001和第一填写单元2002。

其中,第一判断单元2001,用于判断IAT_1中每一项地址是否都可以在DLL信息列表中,查找到与该IAT_1中的地址相同的地址;将判断结果通知第一填写单元2002;

第一填写单元2002,用于将第一判断单元2001中判断出的,在DLL信息列表中查找到相同地址的IAT_1中地址,填写到IAT_2中。

需要说明的是,上述获取的IAT_2中的地址,是有效地址,但没有包括被修复的地址,根据当前的IAT_2也可以在输入表重构单元104中建立正确的输入表。而事实上,有效地址获取单元103还可以对无效地址进行修复,因此,有效地址获取单元103还可以包括:第二反汇编单元2003、第二判断单元2004、和第二填写单元2005。

其中,第二反汇编单元2003,用于对第一判断单元2001中判断出的,在DLL信息列表中没有查找到相同地址的IAT_1中地址的内容,进行反汇编,得到反汇编后的代码;

第二判断单元2004,用于判断第二反汇编单元2003中获取的反汇编后的代码中是否有API调用,如果有,通知第二填写单元2005,如果没有,不执行任何操作;

第二填写单元2005,用于获取反汇编后的代码中第一个API调用的地址,将该地址填写入IAT_2中。

其中,为了防止混淆,还需要解释的是:上述IAT_3中记录的是控制流跳转类指令地址获取单元102获取的结果,将该结果输出给输入表重构单元104;而IAT_2是当装置增加了筛选单元105,或者搜索单元106、或者在该装置增加了修复功能后,最终输出给输入表重构单元104的地址。

通过增加上述第二反汇编单元2003、第二判断单元2004、和第二填写单元2005,使得该装置具有修复无效地址的功能,使得最终获取的输入表更准确。

其中,对本发明实施例提供的一种获取可执行文件输入表的装置的理解,也可以参考实施例一、二中的说明。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。

以上对本发明实施例所提供的一种获取可执行文件输入表方法以及装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

一种获取可执行文件输入表的方法及装置.pdf_第1页
第1页 / 共18页
一种获取可执行文件输入表的方法及装置.pdf_第2页
第2页 / 共18页
一种获取可执行文件输入表的方法及装置.pdf_第3页
第3页 / 共18页
点击查看更多>>
资源描述

《一种获取可执行文件输入表的方法及装置.pdf》由会员分享,可在线阅读,更多相关《一种获取可执行文件输入表的方法及装置.pdf(18页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN102004884A43申请公布日20110406CN102004884ACN102004884A21申请号200910171415422申请日20090828G06F21/22200601G06F9/44520060171申请人华为技术有限公司地址518129广东省深圳市龙岗区坂田华为总部办公楼申请人电子科技大学72发明人刘丹李毅超余三超贾范兵杨晗赵忠树张大成74专利代理机构深圳市深佳知识产权代理事务所普通合伙44285代理人彭愿洁李文红54发明名称一种获取可执行文件输入表的方法及装置57摘要本发明实施例公开了一种获取可执行文件输入表方法,本发明实施例还提供相应的装置。本发。

2、明实施例通过在建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址,查找与获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更通用,且不需要人工干预,自动化程度高。51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书3页说明书10页附图4页CN102004897A1/3页21一种获取可执行文件输入表方法,其特征在于,包括获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括。

3、所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;所述动态链接库信息列表中还包括所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;对所述目标加壳程序的代码进行反汇编,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;在所述动态链接库信息列表中,查找与获取的控制流跳转类指令的目的地址相同的地址;根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库。

4、信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。2根据权利要求1所述的方法,其特征在于,所述获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容之后,所述查找与获取的控制流跳转类指令的目的地址相同的地址之前,所述方法还包括去除所述获取所有控制流跳转类指令的目的地址中包括的,非可执行地址范围内的地址;则所述查找与获取的控制流跳转类指令的目的地址相同的地址,具体包括查找与控制流跳转类指令的目的地址相同的地址,所述控制流跳转类指令的目的地址,为去除非执行地址范围内地址的控制流跳转类指令的目的地址。3根据权利要求1所述的。

5、方法,其特征在于,所述非可执行地址范围至少包括空指针区域,内核区域,或者保留状态的地址其中任一项。4根据权利要求1所述的方法,其特征在于,所述获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容之后,所述查找与获取的控制流跳转类指令的目的地址相同的地址之前,所述方法还包括获取所有控制流跳转类指令的目的地址中的最大值,从所述最大值开始,向地址大于所述最大值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;和/或,获取所有控制流跳转类指令的目的地址中最小值,从所述最小值开始,向地址小于所述最小值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜。

6、索到的地址和搜索到的地址指向的内容;所述查找与获取的控制流跳转类指令的目的地址相同的地址,具体包括查找与获取的控制流跳转类指令的目的地址相同的地址,和,查处与搜索到的地址相同的地址。5根据权利要求1所述的方法,其特征在于,所述方法还包括当控制流跳转类指令的目的地址为在所述动态链接库信息列表中,没有查找到与所述控制流跳转类指令的目的地址相同的地址时,对所述控制流跳转类指令的目的地址指向的内容,进行反汇编,得到反权利要求书CN102004884ACN102004897A2/3页3汇编后的代码;判断所述反汇编后的代码中是否有应用程序接口调用;如果有,获取所述应用程序接口调用的地址;则,根据查找结果中。

7、包括的导出函数的地址,所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,所述应用程序接口调用的地址,和所述应用程序接口调用的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表。6一种获取可执行文件输入表装置,其特征在于,包括动态链接库DLL信息获取单元,用于获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地。

8、址其中所有项;所述动态链接库信息列表中还包括所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;反汇编单元,用于对所述目标加壳程序的代码进行反汇编;控制流跳转类指令获取地址单元,用于从所述反汇编单元中输出的反汇编代码中,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;有效地址获取单元,用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址;输入表重构单元;用于根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接。

9、库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。7根据权利要求6所述的装置,其特征在于,所述装置还包括筛选单元,用于去除所述获取所有控制流跳转类指令的目的地址中包括的,非可执行地址范围内的地址;则所述有效地址获取单元,具体用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与控制流跳转类指令的目的地址相同的地址,所述控制流跳转类指令的目的地址,为去除非执行地址范围内地址的控制流跳转类指令的目的地址。8根据权利要求6所述的装置,其特征在于,所述装置还包括搜索单元,用于获取所。

10、有控制流跳转类指令的目的地址中的最大值,从所述最大值开始,向地址大于所述最大值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;和/或,获取所有控制流跳转类指令的目的地址中最小值,从所述最小值开始,向地址小于所述最小值的方向搜索,当搜索中遇到地址指向的内容为空时停止,记录搜索到的地址和搜索到的地址指向的内容;则有效地址获取单元,具体用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接库中导出函数的地址中,查找与获取的控制流跳转类指令的目的权利要求书CN102004884ACN102004897A3/3页4地址相同的地址,和,查处与搜。

11、索到的地址相同的地址。9根据权利要求6所述的装置,其特征在于,所述有效地址获取单元,具体包括第一判断单元,用于判断所述获取的控制流跳转类指令的目的地址,是否在所述动态链接库信息列表中查找到,如果是,通知第一填写单元;第一填写单元,用于将在所述动态链接库信息列表中查找到的,与所述控制流跳转类指令的目的地址相同的地址,填写到第二输入地址表中;则所述输入表重构单元,具体用于根据所述第二输入地址表,和动态链接库信息列表,建立所述目标加壳程序的输入表。10根据权利要求9所述的装置,其特征在于,所述有效地址获取单元,还包括第二反汇编单元,用于当所述第一判断单元判断出,控制流跳转类指令的目的地址为在所述动态。

12、链接库信息列表中,没有查找到与所述控制流跳转类指令的目的地址相同的地址时,对所述控制流跳转类指令的目的地址指向的内容,进行反汇编,得到反汇编后的代码;第二判断单元,用于判断所述反汇编后的代码中是否有应用程序接口调用,如果有,通知第二填写单元;第二填写单元,用于将所述应用程序接口调用的地址,填写到所述第二输入地址表。权利要求书CN102004884ACN102004897A1/10页5一种获取可执行文件输入表的方法及装置技术领域0001本发明涉及计算机及通信技术领域,具体涉及一种获取可执行文件输入表的方法及装置。背景技术0002壳SHELL是一种二进制代码的变换方式,是一种附着在目标程序之上,负。

13、责保护软件使其难以被分析的程序。由于这种保护功能,所以被形象地称之为壳。壳通常都是先于程序执行,获取到控制权,然后完成它们保护目标软件的任务。0003加壳被广泛运用于软件保护和恶意代码反检测领域。对软件加壳,通常包括三方面的内容,一是对目标软件的二进制代码进行混淆变换或者加密;二是对目标软件的软件结构进行变换,使系统信息加载中断或者变更,破坏软件运行必需的环境,其中,最主要的手段就是更改可执行文件的输入表,隐藏软件运行所必须引入的应用程序编程接口API,APPLICATIONPROGRAMMINGINTERFACE;三是加入对抗、校验代码等以干扰调试、脱壳。0004当要运行加壳后的目标软件,就。

14、需要对目标软件进行脱壳。一种通用的脱壳方法是直接逆向脱壳方法,即针对某种特定的加壳方法,分析其实现,寻找逆算法进行脱壳。直接逆向脱壳方法具体操作包括0005首先,通过入口点代码等特征识别目标软件所加的壳是何种壳;之后,人工分析其代码加密方法和输入表变换方法,获取到解密方法;解密后,去掉对抗及校验代码,完成脱壳;最后,将壳特征和脱壳方法入库,待下次匹配成功,直接调用该方法进行脱壳。0006在对现有技术的研究和实践过程中,本申请的发明人发现,上述脱壳方法针对特定的目标种类的壳进行脱壳。一旦出现壳变种、新壳,即使是加密代码中一个简单加密子的变换,也会使该方法彻底失效,因此,上述现有技术中的脱壳方法不。

15、具有普遍适用性。0007而且,人工分析其代码加密方法和输入表变换方法,使得该方法自动化程度不高,效率低。0008现有技术中还有其它脱壳方法,主要是针对脱壳过程中如何解密代码,通过解密可以正确还原二进制代码,去除对抗、校验代码,便于目前常规的特征码匹配杀毒和静态的逆向分析。但是仅恢复二进制代码,不对输入表进行修复使脱壳的程序无法再运行。发明内容0009本发明实施例提供一种获取可执行文件输入表方法及装置,提供了一种普遍适用、不需人工干预,可获取并重构目标加壳程序的输入表的技术方案,使得脱壳后目标程序可以正常运行。0010本发明实施例提供一种获取可执行文件输入表方法,包括0011获取目标加壳程序所加。

16、载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序加载的每个动态链接库的基址,所述目标加壳程序加说明书CN102004884ACN102004897A2/10页6载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;0012所述动态链接库信息列表中还包括所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;0013对所述目标加壳程序的代码进行反汇编,获取所有控制流跳转类指令的目的。

17、地址和所述目的地址指向的内容;0014在所述动态链接库信息列表中,查找与获取的控制流跳转类指令的目的地址相同的地址;0015根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。0016本发明实施例还提供一种获取可执行文件输入表装置,包括0017动态链接库DLL信息获取单元,用于获取目标加壳程序所加载的所有动态链接库,根据获取的所有动态链接库,建立动态链接库信息列表,所述动态链接库信息列表中包括所述目标加壳程序加载的所有动态链接库的名称,所述目标加壳程序。

18、加载的每个动态链接库的基址,所述目标加壳程序加载的每个动态链接库占用的内存范围,所述目标加壳程序加载的每个动态链接库中导出函数的地址其中所有项;0018所述动态链接库信息列表中还包括所述目标加壳程序加载的每个动态链接库中导出函数的名称,与所述目标加壳程序加载的每个动态链接库中导出函数的序号其中任一项;0019反汇编单元,用于对所述目标加壳程序的代码进行反汇编;0020控制流跳转类指令获取地址单元,用于从所述反汇编单元中输出的反汇编代码中,获取所有控制流跳转类指令的目的地址和所述目的地址指向的内容;0021有效地址获取单元,用于在所述动态链接库信息列表中包括的,所述目标加壳程序加载的每个动态链接。

19、库中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址;0022输入表重构单元;用于根据查找结果中包括的导出函数的地址,和所述导出函数的地址在所述动态链接库信息列表中对应的所有信息,建立所述目标加壳程序的输入表;所述查找结果中包括的导出函数的地址为所述输入表中输入地址表中的地址。0023本发明实施例通过在建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表和IAT_3建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更通用,且不需要人为分析,自动化程。

20、度高。附图说明0024为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可说明书CN102004884ACN102004897A3/10页7以根据这些附图获得其他的附图。0025图1是本发明实施例一提供一种获取可执行文件输入表方法流程简图;0026图2是本发明实施例一中提供的一种创建的DLL信息列表的表头示意图;0027图3是本发明实施例一中提供的包括地址和该地址指向的内容的列表示意图;0028图4是本发明实施例一中提供。

21、的建立输入表示意图;0029图5是本发明实施例二提供一种获取可执行文件输入表方法流程简图;0030图6是本发明实施例三提供一种获取可执行文件输入表装置的逻辑单元示意图。具体实施方式0031下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。0032本发明实施例提供一种获取可执行文件输入表方法,本发明实施例还提供相应的执行装置。以下分别进行详细说明。0033为了便于理解本发明各实施例提供的技。

22、术方案,需要说明的是,设备先加载目标加壳程序,在代码解密完成处,即呈现的原始入口点OEP,ORIGNALENTRYPOINT,设置断点,本发明实施例提供的获取可执行文件输入表的方法从此时开始执行,通过本发明实施例提供的方法,从加密的目标加壳程序中最终获取到输入表。当该断点被触发,则解密后具有输入表的目标程序就可以动态加载DLL,从而可以执行目标程序。以下分别进行详细说明。0034实施例一、0035本发明实施例提供一种获取可执行文件输入表方法。在对本实施例提供的方法做说明之前,首先对输入表这一概念做说明,以便于对本发明实施例提供的方法的理解。0036要运行的加壳的目标软件是由可执行文件组成的,该。

23、可执行文件中会调用一个或者多于一个的动态链接库DLL,DYNAMICLINKLIBRARY中的DLL文件,即调用DLL的代码或者数据,该调用的DLL的代码或数据,称为输入。输入函数地址的定位是在可执行文件加载时,操作系统通过输入表决定的。输入表IMPROTTABLE是可执行文件结构中不可或缺的部分。当可执行文件需要调用其他文件函数时,需要查找输入表进行寻址。输入表中的内容全部是其他文件可被调用的函数的地址。其中,所说的可被调用的函数,即是指API函数,它不是目标可执行文件本身的,而是系统提供的,所以目标要调用它,必须通过输入表找到调用的地址。0037输入表是多个数组组成的数据结构,包括输入描述。

24、表IID,IMAGE_IMPORT_DESCRIPTOR、输入名称表INT,IMPORTNAMETABLE、输入地址表IAT,IMPORTADDRESSTABLE和输入函数名IIN,IMAGE_IMPORT_BY_NAME。操作系统通过IID、INT及IIN定位引入函数地址,并将引入的函数地址写入IAT,完成DLL加载。而加壳的目标软件通常删除IID、INT和IIN,由加壳的目标软件自行填充IAT。因此,现有技术中脱壳后,填充IAT的IID、INT、IIN三项的代码被移除,而由加壳的目标软件自行填充的IAT显然不能被操作系统所正常识别,导致目标软件无法运行。说明书CN102004884ACN1。

25、02004897A4/10页80038本发明实施例提供的一种获取输入表的方法,能够识别可执行文件调用DLL代码或者数据的输入地址表IAT,修复IAT,重新建立输入表IMPORTTABLE。参见图1所述,该方法包括0039步骤1获取目标加壳程序所加载的所有动态链接库DLL,根据获取的DLL建立DLL信息列表,该DLL信息列表中包括以下内容中的任何一项0040目标加壳程序所加载的所有DLL的名称,0041目标加壳程序所加载的每个DLL的基址,0042目标加壳程序所加载的每个DLL占用的内存范围,0043目标加壳程序所加载的每个DLL中导出函数的地址其中所有项,以及0044目标加壳程序所加载的每个D。

26、LL中导出函数的名称,和0045目标加壳程序所加载的每个DLL中导出函数的序号其中任一项。0046如图2所示,为创建的DLL信息列表的表头,即DLL信息列表中各项的名称。0047其中,步骤1中根据获取的目标加壳程序所加载的所有动态链接库DLL,建立DLL信息列表的具体出操作可以包括0048步骤A1获取目标加壳程序所加载的所有DLL的名称,每个DLL名称所对应的基址和目标加壳程序所加载的每个DLL占用的内存范围;0049步骤A2根据获取目标加壳程序所加载的所有DLL的名称、获取到目标加壳程序所加载的每个DLL中的导出函数的名称和目标加壳程序所加载的每个DLL中导出函数的序号其中任一项;还可以获取。

27、每个导出函数相对基址的偏移;0050步骤A3根据步骤A1中获取的DLL名称所对应的基址,和步骤A2中获取的每个导出函数相对于基址的偏移,获取每个DLL中导出函数的地址;从而建立DLL信息列表。0051其中,该DLL信息列表中,包括0052步骤A1中获取的目标加壳程序所加载的所有DLL的名称、DLL名称所对应的基址和目标加壳程序所加载的每个DLL占用的内存范围;和0053步骤A2中获取的目标加壳程序所加载的每个DLL中的导出函数的名称,或者目标加壳程序所加载的每个DLL中导出函数的序号;以及0054该步骤A3中获取的每个DLL中导出函数的地址。0055其中,步骤A3中获取的每个DLL中导出函数的。

28、地址为该导出函数所在的DLL的基址与该导出函数相对基址的偏移量的和。0056通过上述对步骤A1至A3的说明,使得系统可以获知目标加壳程序所加载的所有动态链接库DLL的相关信息,即建立上述DLL信息列表。其中,该目标加壳程序中所调用的所有函数的地址,都可以在该DLL信息列表中的导出函数的地址项中的查找到。因此,该DLL信息列表在后续的操作中发挥重要作用。0057步骤2对目标加壳程序代码进行反汇编,获取所有控制流跳转类指令的目的地址和该目的地址指向的内容;0058如图3所示,为步骤2中获取的控制流跳转类指令的目的地址和该目的地址指向的内容所组成的列表的表头,即该列表中各项的名称。0059其中,在步。

29、骤2中目标加壳程序代码都为二进制,为了便于理解和识别该目标加壳程序中的指令是什么,需要对目标加壳程序代码进行反汇编;通过反汇编,识别出目标加说明书CN102004884ACN102004897A5/10页9壳程序中的所有控制流跳转类指令,从而获取所有控制流跳转类指令的目的地址,该类指令的目的地址通常为要调用的函数的地址,即控制流跳转类指令的目的地址通常为API函数的地址。控制流跳转类指令的目的地址也可以是非可执行文件的地址。0060其中,控制流跳转类指令的格式可以是JMPXXX,或者CALLXXX,或者其它格式,此处具体举例不应理解为对本发明实施例的限制。其中,XXX为被调用函数的地址或者AP。

30、I函数的地址。步骤2中所说的“该地址指向的内容”可以是指该地址指向API函数本身;如果控制流跳转类指令的目的地址为非可执行文件的地址,则“该地址指向的内容”为其它数据。0061步骤3在步骤1中已经建立的DLL信息列表中包括的,目标加壳程序所加载的每个DLL中导出函数的地址中,查找与步骤2中获取的控制流跳转类指令的目的地址相同的地址,将查找到的地址和该查找到的地址指向的内容作为第三输入地址表即IAT_3;0062便于理解的是,IAT_3的列表格式可以参考图3。0063其中,所有控制流跳转类指令的目的地址中,可以包括目标程序调用的系统函数的地址即API的地址,通过将控制流跳转类指令的目的地址,与步。

31、骤1中获取的目标加壳程序所加载的每个DLL中导出函数的地址进行对比,查找出相同的地址,那么这些相同的地址,就应该是系统调用函数的地址即API的地址,如果目标加壳程序中的控制流跳转类指令的目的地址为API地址,可以将目标加壳程序跳转到该API地址,从而调用系统DLL中的函数该函数对DLL自身为导出函数,该导出函数的地址为该API的地址。0064为了便于理解,这里还需要说明的是,步骤3中,在DLL信息列表中,没有找到与步骤2中获取的控制流跳转类指令的目的地址相同的地址,这类地址所对应的导出函数,可以统一称为需要修复的地址,在修复前还可以去掉非可执行地址因为是不可执行的所以没有必要修复,以减轻时间消。

32、耗。0065相似的,在步骤2中获取的控制流跳转类指令的目的地址中,没有找到与步骤1中DLL信息列表中包括的导出函数的地址相同的地址,这类控制流跳转类指令的目的地址为非可执行文件的地址,或者是,这类控制流跳转类指令的目的地址需要修复具体修复的说明在后续的文字中会说明,此处先不介绍。本段文字只是便于理解的说明,而非绝对,不应该理解为对本发明实施例的限制。0066步骤4根据获取的IAT_3中包括的所有地址,该地址指向的内容,和在已经建立的DLL信息列表中该地址对应的所有信息,建立该目标加壳程序的输入表。0067其中,步骤4中将IAT_3中地址与DLL信息列表中导出函数地址进行匹配,与导出函数的地址相。

33、同的IAT_3中地址,按照DLL信息列表中的DLL名称分类,与同属于一个DLL名称中的导出函数的地址相同的IAT_3中地址,被填写在一张输入表中的IAT中,且根据IAT_3中地址,从DLL信息列表获取对应的信息,填入输入表的IID,INT,IAT和IIN中,并且,建立IID,INT,IAT和IIN之间的指针关系。0068其中,可以参考图4所示,为某一DLL所对应的输入表,该输入表中的IAT中填写的地址,为DLL信息列表中同一个名称的DLL中导出函数地址,并且,该导出函数地址全部包括在IAT_3中。0069其中,每一个DLL名称对应如图4所示结构相同的输入表,每一个DLL中包括多个导出函数,因此。

34、,相同DLL名称的输入表中,在IAT中包括一个或者多于一个的调用函数地说明书CN102004884ACN102004897A6/10页10址。0070由于IAT_3中的地址都包括在DLL信息列表中,则一种具体的填写输入表的方法可以是0071步骤C1将IAT_3中的一个地址与DLL信息列表中导出函数地址进行匹配;0072步骤C2判断是否存在一张输入表,该输入表中DLL名称为上述一个地址所对应的,DLL信息列表中的DLL名称,如果没有,则进入步骤C3;如果有,则进入步骤C5;0073步骤C3创建一张输入表,将该地址填写在创建的输入表中IAT中,然后,执行步骤C4;0074步骤C4将匹配后获取的DL。

35、L信息列表中的DLL名称、该DLL的基址、和该DLL所占内存范围所有项,填入该输入表中的IID中;将匹配后获取的导出函数的名称或者导出函数的序号,填入该输入表中的IIN中和INT中;建立IID、IIN、IAT、和INT所有项之间的指针;0075其中,IIN与INT中填写的内容相同,包括匹配后获取的导出函数的名称和/或导出函数的序号。0076步骤C5将该地址填写在创建的输入表中IAT中,匹配后获取的导出函数的名称或者导出函数的序号,填入该输入表中的IIN中和INT中;建立IIN,IAT和INT对应项的指针。其中,上述对步骤C5的理解,也可以结合图4,即根据步骤C2中判断出已经存在一张输入表,该输。

36、入表中DLL名称为上述一个地址所对应的,DLL信息列表中的DLL名称,那么,就在输入表的IAT列表中增加一行,用于填写IAT_3中的该一个地址。0077其中,建立IID、IIN、IAT、和INT所有项之间的指针,如图4中所示的箭头方向,为指针方向。具体的建立输入表中IID、IIN、IAT、和INT所有项之间的指针的方法是现有技术,此处不详述。0078步骤C6将IAT_3中的每个地址都执行上述步骤C1至C5,然后结束。0079通过上述对步骤C1至C6的说明,可以更加清楚的理解本发明实施例中的步骤4。0080通过对上述步骤1至步骤4的说明,通过在步骤1中已经建立的DLL信息列表中,包括的目标加壳程。

37、序所加载的每个DLL中导出函数的地址中,查找与步骤2中获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更具普适性,且不需要人工干预,自动化程度高。0081实施例二、0082本发明实施例提供一种获取可执行文件输入表的方法,该方法与实施例一提供的方法相似,都可以对获取到目标加壳程序的输入表;而本发明实施例提供的方法,在实施例一的基础上增加了一些操作,使得获取的输入表更准确,也可以使得该操作过程效率更高。0083下面结合附图5对本实施例提供的方法做说明,该方法包括0084步骤D1、步。

38、骤D2与实施例一中步骤1、步骤2相同,请参考步骤1、步骤2中说明;0085步骤D3去除步骤D2中获取的所有控制流跳转类指令的目的地址中的非可执行地址范围内的地址,及该非可执行地址范围内的地址指向的内容;从而获取到IAT_1,该IAT_1中包括没有去除的控制流跳转类指令的目的地址,和该没有去除的控制流跳转类指令的目的地址指向的内容。说明书CN102004884ACN102004897A7/10页110086便于理解的是,IAT_1的列表格式可以参考图3。0087其中,上述步骤D3中所述的非可执行地址范围,通常至少包括空指针区域,内核区域,或者其他禁入区域地址其中任一项;非可执行地址范围也可以包括。

39、属于保留状态未分配的空间的地址。0088还需要说明的是,由于执行了步骤D3,使得后续步骤D7至D9中对无效地址的修复操作时,减少修复的次数,提高了方法执行的速度。0089步骤D4获取IAT_1中没有去除的控制流跳转类指令的目的地址的最大值,从该最大值开始,向地址大于该最大值的方向搜索,当搜索中遇到地址指向的内容为空或者为零时停止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;0090和/或,获取IAT_1中没有去除的控制流跳转类指令的目的地址的最小值,从该最小值开始,向地址小于该最小值的方向搜索,当搜索中遇到地址指向的内容为空或者为零时停止,将搜索到的地址和搜索到的地址指向的内容填写。

40、到IAT_1;0091其中,与实施例一相比,增加该步骤D4,由于执行了步骤D4,使得IAT_1中地址的范围,比步骤D2中只是获取所有控制流跳转类指令的目的地址的范围要大,使得最终获取的输入表最大程度上接近未加壳时目标程序的输入表。0092步骤D5判断IAT_1中每一项地址是否都可以在DLL信息列表中,查找到与该IAT_1中的地址相同的地址,如果是,则执行步骤D6;如果否,则执行步骤D7;0093步骤D6将在DLL信息列表中查找到相同地址的IAT_1中地址,填写到IAT_2中;0094便于理解的是,IAT_2的列表格式也可以参考图3。0095其中,在DLL信息列表中查找到相同地址的IAT_1中地。

41、址,也可以称为“有效地址”;在DLL信息列表中没有查找到相同地址的IAT_1中地址,也可以称为“无效地址”。0096步骤D7对在DLL信息列表中没有查找到相同地址的IAT_1中地址的内容,进行反汇编,得到反汇编后的代码;0097步骤D8判断反汇编后的代码中是否有API调用,如果有,执行步骤D9;如果没有,则结束流程;0098步骤D9获取反汇编后的代码中第一个API调用的地址,将该地址填写入IAT_2中;0099其中,与实施例一相比,该实施例二中增加的步骤D7至步骤D9,设备可以对无效地址进行修复,即获取到无效地址指向的内容中API调用的地址。在已经创建的DLL信息列表中,可以找到与该API调用。

42、的地址相同的导出函数地址。从而,在后续的步骤D10中可以实现重构输入表。0100步骤D10与实施例一中步骤4相似,根据步骤D6和步骤D9而获取的IAT_2中包括的所有地址,该地址指向的内容,和在已经建立的DLL信息列表中该地址对应的所有信息,建立该目标加壳程序的输入表。0101其中,IAT_2的作用于实施例一中IAT_3的作用相同。对步骤D10的说明,请参考实施例一中关于步骤4的说明,此处不重述。0102通过对上述步骤D1至步骤D10的说明,通过在建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与IAT_2中地址相同的地址,从而获取有效地址和无效地址,对无效。

43、地址进行修复,从而获取IAT_3;根据DLL信息列表,和说明书CN102004884ACN102004897A8/10页12IAT_3,从而建立输入表。该方法对于任何加壳方法都适用,与现有技术相比,该方法更具普适性,且不需要人工干预,自动化程度高。0103进一步,该方法中去除了非可执行地址范围内的地址的操作,减少了后续操作中对无效地址的不必要修复,从而提高了该方法的执行效率;0104进一步,该方法中增加了步骤D4中从地址最大值和/或最小值开始搜索地址,防止在IAT_1遗漏可能的调用的API地址,使得最终获取的输入表更准确。0105进一步,该方法中增加步骤D7至D9的操作,对无效地址进行修复,可。

44、以获取到控制流跳转类指令间接调用的API地址,使得最终获取的输入表更准确。0106实施例三、0107本发明实施例提供一种获取可执行文件输入表的装置,如图6所示,该装置包括动态链接库DLL信息获取单元100,反汇编单元101,控制流跳转类指令地址获取单元102,有效地址获取单元103,和输入表重构单元104。0108其中,DLL信息获取单元100,用于获取目标加壳程序所加载的所有动态链接库DLL,根据获取的DLL建立DLL信息列表,该DLL信息列表中包括目标加壳程序所加载的所有DLL的名称,目标加壳程序所加载的每个DLL的基址,目标加壳程序所加载的每个DLL占用的内存范围,目标加壳程序所加载的每。

45、个DLL中导出函数的地址其中所有项,和目标加壳程序所加载的每个DLL中导出函数的名称,与目标加壳程序所加载的每个DLL中导出函数的序号其中任一项;0109反汇编单元101,用于对目标加壳程序代码进行反汇编;0110控制流跳转类指令地址获取单元102,用于从反汇编单元101中反汇编的结果中,获取所有控制流跳转类指令的目的地址和该地址指向的内容;0111有效地址获取单元103,用于在获取DLL信息单元100中已经建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与控制流跳转类指令地址获取单元102中获取的控制流跳转类指令的目的地址相同的地址,将查找结果中包括的地址。

46、和该地址指向的内容制作为IAT_3;0112输入表重构单元104,用于根据获取的IAT_3中包括的所有地址,该地址指向的内容,和在已经建立的DLL信息列表中该地址对应的所有信息,建立该目标加壳程序的输入表。0113其中,还需要说明的是,该装置的逻辑单元还可以划分为输入地址表识别模块,输入地址表修复模块,和输入表重建模块。0114应该理解的是输入地址表识别模块可以包括上述说明的获取动态链接库DLL信息单元100,反汇编单元101,和控制流跳转类指令地址获取单元102这三个单元;0115输入地址表修复模块可以包括上述说明的有效地址获取单元103;0116输入表重建模块可以包括上述说明的输入表重构单。

47、元104。0117为了更清楚了理解本实施例提供的装置,可以结合实施例一中提供的方法的说明。0118通过对本发明实施例提供的装置的说明,该装置通过在已经建立的DLL信息列表中,包括的目标加壳程序所加载的每个DLL中导出函数的地址中,查找与获取的控制流跳转类指令的目的地址相同的地址,从而获取IAT_3;根据DLL信息列表,和IAT_3,从而建立说明书CN102004884ACN102004897A9/10页13输入表。该装置对于任何加壳方法都适用,与现有技术相比,该装置更具普适性,且不需要人工干预,自动化程度高。0119进一步,为了去除控制流跳转类指令地址获取单元102中非可执行地址范围内的地址,。

48、该装置中还可以包括筛选单元105,用于去除控制流跳转类指令地址获取单元102中,获取的所有控制流跳转类指令的目的地址中的非可执行地址范围内的地址,及该非可执行地址范围内的地址指向的内容;从而获取到IAT_1,该IAT_1中包括没有去除的控制流跳转类指令的目的地址,和该没有去除的控制流跳转类指令的目的地址指向的内容。0120进一步,为了不遗漏输入地址,扩大获选的输入地址范围,该装置还可以包括搜索单元106,用于从控制流跳转类指令地址获取单元102,或者筛选单元105其中任一项中的输出结果中,获取地址的最大值,从该最大值开始,向地址大于该最大值的方向搜索,当搜索中遇到地址指向的内容为空或者为零时停。

49、止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;0121和/或,获取地址的最小值,从该最小值开始,向地址小于该最小值的方向搜索,当搜索中遇到地址指向的内容为空或者为零时停止,将搜索到的地址和搜索到的地址指向的内容填写到IAT_1;0122其中,这里的IAT_1中可以保存没有去除的控制流跳转类指令的目的地址及地址指向的内容,也可以保存从控制流跳转类指令地址获取单元102中,获取的所有从控制流跳转类指令地址即及其地址指向的内容。0123进一步,本发明实施例提供的装置中的有效地址获取单元103可以具体包括第一判断单元2001和第一填写单元2002。0124其中,第一判断单元2001,用于。

50、判断IAT_1中每一项地址是否都可以在DLL信息列表中,查找到与该IAT_1中的地址相同的地址;将判断结果通知第一填写单元2002;0125第一填写单元2002,用于将第一判断单元2001中判断出的,在DLL信息列表中查找到相同地址的IAT_1中地址,填写到IAT_2中。0126需要说明的是,上述获取的IAT_2中的地址,是有效地址,但没有包括被修复的地址,根据当前的IAT_2也可以在输入表重构单元104中建立正确的输入表。而事实上,有效地址获取单元103还可以对无效地址进行修复,因此,有效地址获取单元103还可以包括第二反汇编单元2003、第二判断单元2004、和第二填写单元2005。012。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1