首页> 中国专利> 一种动态链接库缺失的可执行程序的动态分析方法

一种动态链接库缺失的可执行程序的动态分析方法

摘要

本发明提供一种动态链接库缺失的可执行程序的动态分析方法。本发明通过分析可执行程序的导入表,获得其导入的动态链接库及其对应的导入函数信息,然后通过修改一个预先编译好的导出了若干函数的种子DLL文件的导出表,使其导出待分析的样本程序所需导入的函数,并修改该DLL的名称使之与样本程序所需的DLL名称相对应,最终生成程序样本所依赖的外部动态链接库文件,从而实现对动态链接库缺失的可执行程序进行动态分析。本发明无需运行可执行程序,并且对可执行程序没有修改,不破坏可执行程序完整性,同时本发明不仅适用于可执行程序的动态分析,也适用于动态链接库文件的动态分析,尤其适用于恶意软件的动态分析。

著录项

  • 公开/公告号CN107239703A

    专利类型发明专利

  • 公开/公告日2017-10-10

    原文格式PDF

  • 申请/专利权人 中国科学院软件研究所;

    申请/专利号CN201710265961.9

  • 发明设计人 应凌云;莫建平;聂眉宁;苏璞睿;

    申请日2017-04-21

  • 分类号

  • 代理机构北京君尚知识产权代理事务所(普通合伙);

  • 代理人邵可声

  • 地址 100190 北京市海淀区中关村南四街4号

  • 入库时间 2023-06-19 03:28:47

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-05-22

    授权

    授权

  • 2017-11-07

    实质审查的生效 IPC(主分类):G06F21/56 申请日:20170421

    实质审查的生效

  • 2017-10-10

    公开

    公开

说明书

技术领域

本发明属于网络安全技术领域,具体涉及一种动态链接库缺失的可执行程序的动态分析方法。

背景技术

随着计算机技术和互联网技术的不断发展,人们的生活的方方面面都越来越离不开计算机和计算机上运行的软件。恶意软件窃取个人数据和商业机密,发送垃圾邮件,控制用户电脑,对远程服务器发动拒绝服务攻击,给个人和企业造严重的困扰和经济损失。为了逃避检测,恶意软件往往藏身很多无害的软件中。要从大量的可执行程序样本中检测和清除恶意软件,首先要获得可执行程序样本的基本信息和程序行为,并从中提取、总结恶意软件所具有的特征。可执行程序分析技术可以帮助研究人员获得这些信息。可执行程序分析技术主要有静态分析和动态分析。

静态分析不运行程序样本,通过静态扫描程序样本,能够快速获得其基本信息:文件大小,文件类型,文件内容哈希,编译连接器版本,是否加壳等。它还可以对程序样本进行静态的语义分析,构建程序控制流图和数据依赖图,尝试理解程序行为,推断程序意图。静态分析通常借助特征字符串或特定的代码、数据片段对恶意代码进行检测。但是静态分析容易受到加壳,混淆,多态与变质等技术的干扰;缺乏输入、环境变量等运行时信息,使得静态的恶意程序行为分析的多数努力等于在做无用功并且误报率高。

动态分析通过在一个可控的模拟的真实环境里实际运行程序样本,给予程序输入,观察记录程序样本运行时行为:文件操作,注册表操作,网络操作,内存读写等。其天然具有抗加密、混淆、多态等优势,并且给以恶意输入数据,更有针对性,误报率低,模拟的真实环境,更能反映程序样本在实际主机上的真实行为。因而越来越受到安全研究人员和安全厂商的重视。

要想观察到可执行程序样本的真实行为,就需要首先让程序样本真正的运行起来。但是这个前提并不能总得到满足,其中一种情况就是缺少程序样本所依赖的其它程序组件,如外部动态链接库(DLL)文件。有的时候,能获得可执行程序样本的主体,却无法获得这些DLL文件,从而导致无法启动程序样本,动态分析失败。这种情况在分析恶意软件样本的时候更为普遍:为了逃避检测将自身分拆成多个文件,以及功能插件化、模块化开发等原因,恶意软件将程序的部分功能或恶意功能写到外部的DLL文件,在程序启动时由Windows加载器加载这些外部的DLL。因此,需要一种方法来解决程序样本由于缺乏依赖的外部DLL而无法启动的问题。

既然程序样本因为依赖外部的DLL而无法启动,那么一种思路就是满足程序样本的这种依赖。通过分析程序样本的导入表结构,得到程序样本导入的所有DLL,即其所依赖的所有的外部DLL文件,然后对比分析环境所提供的DLL文件和收集到与此程序样本所依赖的DLL文件,找出分析环境中缺失的DLL文件,然后修改程序样本的导入表,将分析环境中没有的DLL从导入表中移除,这样程序样本就能正常启动起来。但是这个方法需要对程序样本的导入表和PE头部结构进行修改,破坏了程序样本的完整性,如果程序样本有自我校验功能,当其检测到自身被修改时,可能不正常运行或是直接结束运行,分析平台就没法获得程序样本正常运行时的各种行为。另一种思路就是想办法满足程序样本的这种依赖,在无法收集到程序样本所依赖的外部DLL的时候,自动化的生成其所需DLL文件,使程序样本成功启动。

发明内容

本发明提供一种动态链接库缺失的可执行程序的动态分析方法,通过分析程序样本的导入表,获得其导入的动态链接库及其对应的导入函数信息,然后修改一个预先编译好的导出了若干函数的DLL的导出表,使其导出程序样本所需导入函数,并修改该DLL的名称使之与程序样本导入的DLL名称相对应,从而生成程序样本所缺失的DLL文件,使程序样本可以被动态分析。

一种动态链接库缺失的可执行程序的动态分析方法,包括如下步骤:

1)预先生成一种子DLL;

2)判断待分析的程序样本是否具有合法的导入表,如是,则执行步骤3),否则终止对该样本的分析并输出错误信息;

3)通过解析导入表结构,提取程序样本导入的DLL信息;

4)针对程序样本导入的每一个DLL都生成种子DLL的一个拷贝,并修改该拷贝名称使之与所针对的DLL名称一致;

5)根据步骤3)得到的DLL信息,对生成的DLL拷贝的导出表进行修改,使其形成程序样本依赖的DLL。

进一步地,还包括:6)根据步骤5)形成全部程序样本导入的DLL,将这些DLL移动到用户指定目录,并向用户报告生成结果。

进一步地,步骤1)中所述种子DLL导出了足够多函数。

进一步地,步骤1)中根据分析平台的系统版本,编译所述种子DLL;所述种子DLL导出了的函数的个数不小于9999个。

进一步地,步骤1)中编译所述种子DLL的同时记录分析平台所有的系统DLL名称;步骤3)提取程序样本导入的DLL信息时,排除步骤1)中记录的系统DLL。

进一步地,通过解析程序样本的文件头,判断程序样本是否具有合法的导入表。

进一步地,步骤3)中所述程序样本导入的DLL信息包括:程序样本导入的所有DLL名称及导入的各DLL对应的函数信息。

进一步地,所述函数信息包括按名称导入的函数的信息和按序号导入的函数的信息。

进一步地,按序号导入的函数的信息包括按函数序号导入的函数的序号值,按名称导入的函数的信息包括按函数名称导入的函数的字符串名和hint值。

进一步地,步骤5)中对DLL拷贝的导出表进行修改过程中,对于按名称导入的函数,在导出表中随机选取一项,修改其导出的函数名称,使之与导入的函数名称相同;对于按序号导入的函数,检查导出表中是否导出了具有该序号的函数。

通过上述技术方案,本发明通过静态扫描的方式,生成程序样本所依赖DLL文件,无需执行程序样本,快速安全。并且,本发明不会修改程序样本,因而在满足程序样本的外部DLL依赖的同时,能够避免触发程序样本完整性校验。最后,本发明不光可以为可执行的程序样本生成所依赖的外部DLL文件,同时也可以为DLL生成其所依赖的其它DLL文件,当获得程序样本的部分DLL,而这些DLL还对其它DLL有依赖时,由于DLL和可执行程序采用同样的文件格式(PE格式),因而可以从其文件头中的导入表获取其所依赖的其它DLL的信息,故采用同样的方法,本发明也能解决这类些依赖问题。

附图说明

图1为本发明一实施例中动态链接库缺失的可执行程序的动态分析方法的流程示意图。

具体实施方式

本发明的工作原理:

一个DLL想要导出某些函数给其它模块使用时,会将这些函数的信息声明在其导出表结构中,以便外部的程序能够在DLL中找到这些被导出的函数。函数的导出方式有两种,按函数名称导出或按函数序号导出。当程序需要使用外部的函数时,会在其PE文件头的导入表结构中声明需要引入的函数名称或是函数序号,以及这些函数存在于哪些DLL文件中。Windows加载器在启动程序时,根据程序的导入表,为程序加载相应的DLL到虚拟地址空间中,并根据被导入的函数名称或函数序号,从被加载的DLL中找到这些函数的真实地址并予以引用。为了能使程序正常的启动,程序的导入表结构应该是正确的,即使程序可能是恶意的。

下面结合附图详细说明本发明所提供的技术方案:

如图1所示,在一实施例中,提供的一种动态链接库缺失的可执行程序的动态分析方法,包括步骤:

1.种子DLL的生成和系统DLL列表的获取

首先需要生成一个特殊的DLL,称为种子DLL,由它为模板,生成所有程序样本导入的DLL。该DLL导出的函数个数应该足够多,因为程序在按序号导入函数时,序号值一般与要导入的DLL中的函数个数有对应关系,但也可以指定为任意值,不过这样并没有什么实际意义。导出9999个函数,在多数情况下应该够用了。当然,导出的函数个数并不限于该数值,本领域技术人员当可根据实际的运行环境和需求进行选取,在理解本发明核心主旨的前提下,知悉如何满足“足够多”的需求。

此外,DLL的名称(DLL文件头部导出表结构中域Name1指示的该DLL的真实名字,不是DLL文件名)和导出函数的名称应该足够长,因为在修改函数名或DLL名称时,只能从长的改为短的,例如,名称长度为128个字符多数情况下是足够的。同样地,该名称长度同样不限于该例举的数值。

种子DLL的版本应该和分析平台的系统版本相兼容,种子DLL同时按函数名称和序号值导出函数。

为了能够减少不必要的工作量,从分析平台的系统目录(一般是C:Windowssystem和C:Windowssystem32)中提取所有DLL名称,当程序样本需要导入的为这些系统DLL时,直接跳过。

2.判断程序样本是否有合法的导入表结构

解析程序样本的文件头,若其不是PE文件或没有合法的导入表结构,跳过该样本。直接判断为无效程序。

3.提取程序样本导入的DLL及相对应的导入函数

解析程序样本PE文件头中的导入表结构IMAGE_IMPORT_DESCRIPTOR,获取程序样本导入DLL模块名称,再根据IMAGE_THUNK_DATA得到按函数序号导入的函数的序号值,得到按函数名称导入的函数的字符串名和hint值。

4.生成程序样本依赖的外部DLL

针对程序样本导入的每一个DLL,先将步骤1中生成的种子DLL拷贝一份,文件名改为导入的DLL名称。然后修改拷贝后的种子DLL的导出表结构IMAGE_EXPORT_DIRECTORYSTRUCT中指定的模块真实名称为导入的DLL名称。

接着根据步骤3提取到的对应的导入函数信息,修改拷贝后的种子DLL的导出表结构,修改方法为:只按序号导入的函数,检查该序号是否被导出,若导出,则跳过,否则输出错误信息并终止该DLL的生成过程,继续尝试生成下一被导入的DLL。按函数名导入的函数,若其hint值为零,则在导出表中AddressOfNames域指出的导出函数名列表中随机选择一项,修改该项值为导入函数名称字符串;若其hint值不为零,则选择在导出表中由AddressOfNames域指出的导出函数名列表里以hint值为下标(下标编号从0开始)的那一项,修改其值为导入函数名称字符串,若hint值大于导出的函数个数,输出错误信息并终止该DLL的生成过程,继续尝试生成下一被导入的DLL。

5.输出生成结果

待程序样本导入的每个DLL都按步骤4处理完成后,将成功生成的DLL移动到用户指定的目录中,并向用户报告生成结果。

本发明提出的动态链接库缺失的可执行程序的动态分析方法,对于本领域的技术人员而言,在遵循本发明核心主旨的前提下,可以根据需要自己编译合适的种子DLL,设计导入表解析和导出表修改方法,从而快速高效地生成程序样本所依赖的外部DLL文件。

尽管为说明目的公开了本发明的具体实施例和附图,其目的在于帮助理解本发明的内容并据以实施,但是本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和附图所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号