一种检测运行环境真实性的方法及装置的制作方法

文档序号:6370946阅读:336来源:国知局
专利名称:一种检测运行环境真实性的方法及装置的制作方法
技术领域
本发明涉及计算机技术领域,特别是涉及一种检测运行环境真实性的方法及装置。
背景技术
·计算机文件按照其可执行情况可以分为可执行文件和非可执行文件两种。可执行文件是一种存储有特定的指令或代码,能够被加载到计算机内存中,并在计算机上运行其存储的指令或代码,以完成特定任务的文件。比如在常用的视窗(Windows)操作系统中,一些以.exe为后缀的可执行文件(如not印ad. exe等),用户可以通过运行这些可执行文件并利用其提供的功能完成一系列的任务,如执行notepad, exe可以实现对文本文档进行编辑、保存等操作。通常,可执行文件运行在特定的操作系统中,并由操作系统在其运行时,为其构造相应的运行环境,提供相应的服务支持,如内存的分配及调度等。在当今计算机日益普及和计算机软件产品大规模应用的背景下,软件产品也成了许多黑客攻击的目标,一些黑客通过技术手段破解和散布并没有得到合法授权的软件产品,其行为给软件产品的所有者造成了巨大的经济损失,出于对软件产品所有者权利的保护,除了利用法律的手段之外,通常在软件的开发过程中,从技术上也对软件产品实施了技术性的保护措施,加壳便是其中一种常用的手段。加壳可以在一定程度上阻止了黑客对软件的反向分析,从而达到了保护软件产品的目的。然而,随着破解者对于软件加壳技术的深入研究,破解软件加壳技术的脱壳技术也发展起来,在保护与破解的较量中,出现了“脱壳机”技术。该技术的主要原理是由“脱壳机”构造一个虚拟的运行环境,“脱壳机”模拟出的运行环境与真实的操作系统运行环境具有较高的相似度,使带有加壳技术保护的软件在该运行环境下运行,并监测其执行过程,然后将被保护的原始代码或文件解密出来,实现了对软件进行破解的目的。针对“脱壳机”的应用原理,运行环境检测技术开始在软件保护领域得到应用,然而随着虚拟环境模拟水平的提高,运行环境检测技术也出现了瓶颈,传统的检测手段不足以对抗越来越完美的虚拟环境模拟,因此,迫切需要本领域技术人员解决的技术问题就在于,如何能够更准确的检测运行环境是否正常,以便在软件运行前及时检测到异常并采取措施,以达到自我保护的目的。

发明内容
本发明提供了一种检测运行环境真实性的方法及装置,能够能够极大的提高检测运行环境真实性的准确度,并且能够在多中操作系统下运用本方法实现对运行环境真实性的检测。本发明提供了如下方案一种检测运行环境真实性的方法,包括获取应用程序编程接口 API在当前运行环境中的信息;
将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,得到一对比结果;所述API的指纹信息为API在真实运行环境中的特征信息;根据所述对比结果验证当前运行环境是否为真实运行环境。可选的,所述API在当前运行环境中的信息,包括获取至少两个API在当前运行环境中的信息;所述根据所述对比结果验证当前运行环境是否为真实运行环境包括如果各个API在当前运行环境中的信息均与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。可选的,所述获取API在当前运行环境中的信息,包括获取随机选取的API在当前运行环境中的信息;所述根据所述对比结果验证当前运行环境是否为真实运行环境包括如果所述随机选取的API在当前运行环境中的信息与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。可选的,同一 API对应有至少两种指纹信息;所述将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,包括对于同一 API,将其在当前运行环境中的信息,与预先获取到的该API的至少两种指纹信息分别进行对比;所述根据所述对比结果验证当前运行环境是否为真实运行环境包括对于同一 API,如果其在当前运行环境中的信息与预先获取到的该API的至少两种指纹信息均相同,则所述当前运行环境为真实运行环境。可选的,所述API的指纹信息包括,API本身的代码;
所述获取API在当前运行环境中的信息,包括获取相应API在当前运行环境中的代码;所述将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比包括将所述API在当前运行环境中的代码与预先获取到的相应API在真实运行环境中的代码进行对比。可选的,所述API的指纹信息包括,API在被调用的情况下产生的特征信息;所述获取API在当前运行环境中的信息,包括获取API在当前运行环境中被调用时产生的信息;所述将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比包括将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比。可选的,所述API在被调用的情况下产生的特征信息包括,API在被调用的情况下,寄存器的值;所述获取API在当前运行环境中的信息,包括获取API在当前运行环境中被调用时,寄存器的值;
所述将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比包括将所述API在当前运行环境中被调用时寄存器的值与预先获取到的相应API在真实运行环境中被调用时寄存器的值进行对比。可选的,所述API在被调用的情况下寄存器的值包括API运行返回后寄存器的值;或, 进程或线程启动并返回用户空间代码之后寄存器保存的值。可选的,所述API在被调用的情况下产生的特征信息包括API在被调用时产生的栈数据;所述获取API在当前运行环境中的信息,包括获取API在当前运行环境中被调用时产生的栈数据;所述将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比包括将所述API在当前运行环境中被调用时产生的栈数据与预先获取到的相应API在真实运行环境中被调用时产生的栈数据进行对比。可选的,所述API在被调用时产生的栈数据包括API运行并返回后的栈数据;或,进程或线程启动并返回用户空间代码之后的栈数据。一种检测运行环境真实性的装置,包括信息获取单元,用于获取应用程序编程接口 API在当前运行环境中的信息;对比单元,用于将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,得到一对比结果;所述API的指纹信息为API在真实运行环境中的特征信息;验证单元,用于根据所述对比结果验证当前运行环境是否为真实运行环境。可选的,所述信息获取单元,包括第一信息获取子单元,用于获取至少两个API在当前运行环境中的信息;所述验证单元包括第一验证子单元,用于如果各个API在当前运行环境中的信息均与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。可选的,所述信息获取单元,包括第二信息获取子单元,用于获取随机选取的API在当前运行环境中的信息所述验证单元包括第二验证子单元,用于如果所述随机选取的API在当前运行环境中的信息与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。可选的,同一 API对应有至少两种指纹信息;所述对比单元包括第一对比子单元,用于对于同一 API,将其在当前运行环境中的信息,与预先获取到的该API的至少两种指纹信息分别进行对比;所述验证单元包括第三验证子单元,用于对于同一 API,如果其在当前运行环境中的信息与预先获取到的该API的至少两种指纹信息均相同,则所述当前运行环境为真实运行环境。可选的,所述API的指纹信息包括,API本身的代码;所述信息获取单元,还包括第三信息获取子单元,用于获取相应API在当前运行环境中的代码;所述对比单元包括
·
第二对比子单元,用于将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比。可选的,所述API的指纹信息包括,API在被调用的情况下产生的特征信息;所述信息获取单元,还包括第四信息获取子单元,用于获取API在当前运行环境中被调用时产生的信息;所述对比单元包括第三对比子单元,用于将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比。可选的,所述API在被调用的情况下产生的特征信息包括,API在被调用的情况下寄存器的值;所述信息获取单元,包括寄存器值获取单元,用于获取API在当前运行环境中被调用时寄存器的值所述第三对比子单元具体用于将所述API在当前运行环境中被调用时寄存器的值与预先获取到的相应API在真实运行环境中被调用时寄存器的值进行对比。可选的,所述API在被调用的情况下寄存器的值包括API运行返回后寄存器的值;和/ 或,进程或线程启动并返回用户空间代码之后寄存器保存的值。可选的,所述API在被调用的情况下产生的特征信息包括包括,API在被调用时产生的栈数据;所述信息获取单元,包括栈数据获取单元,用于获取API在当前运行环境中被调用时产生的栈数据;所述第三对比子单元具体用于将所述API在当前运行环境中被调用时产生的栈数据与预先获取到的相应API在真实运行环境中被调用时产生的栈数据进行对比。可选的,所述API在被调用时产生的栈数据包括API运行并返回后的栈数据;和/ 或,进程或线程启动并返回用户空间代码之后的栈数据。根据本发明提供的具体实施例,本发明公开了以下技术效果通过本发明,利用操作系统提供的API在真实的运行环境和虚拟的运行环境下可以呈现出的不同特征作为参考,来检测运行环境是否为真实运行环境,由于API的数量众多,因此,极大的提高了模拟真实运行环境的难度,进而也就提高了检测运行环境真实性的准确度。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图I是本发明实施例提供的方法的流程图;图2是本发明实施例提供的装置的示意图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。首先需要说明的是,在软件破解与保护的对抗中,运行环境检测技术针对不同的检测对象、利用不同的检测原理发展了出若干检测手段,如环境块检测技术、异常检测技术等等,但由于这些传统的运行环境检测技术的检测对象有限,同时部分技术本身还存在着检测风险高,平台依赖性强等缺点。随着破解者对传统检测技术的深入研究,越来越接近真实运行环境的虚拟运行环境被模拟出来,使得传统的运行环境检测技术的检测效果大打折扣。此时,如何找到一种更有效的检测运行环境真实性的方法成了包括软件保护者在内的技术人员需要思考的问题。几乎所有操作系统都会使用应用程序编程接口(Application ProgrammingInterface, API ),用于向在操作系统上运行的应用程序提供服务,常用的操作系统一般都会为应用程序和开发者提供大量的API。本发明人在实现本发明的过程中发现,在真实的系统运行环境和虚拟的运行环境中,相应的API往往会呈现出不同的特征,这种不同的特征,不仅体现在API函数本身的代码上,还体现在当API在两种运行环境中被调用时所表现的不同的数据信息上等多个方面。因此,可以通过提取API在真实的系统运行环境特征,为API建立“指纹”,并以API指纹来检测运行环境的真实性。由于常见的操作系统都拥有大量的API,同时每个API在不同的运行环境里通常呈现出多个不同的特征,这就为通过API指纹检测测运行环境提供了丰富的检测依据。利用API指纹检测运行环境的真实性,可以大大提高虚拟环境的建造难度,同时,为运行环境的真实性检测提供了更加有效的手段。下面就对本发明实施例提供的检测运行环境真实性的方法进行详细地介绍。参见图I,该方法包括以下步骤SlOl :获取应用程序编程接口 API在当前运行环境中的信息;在需要对当前运行环境进行真实性检测时,获得API在当前运行环境中的信息。在具体实施时,比如在需要对某可执行程序进行保护时,可以在该可执行程序运行前,先执行对运行环境的真实性进行检测,而后可执行程序根据检测结果采取相应的措施,以达到自我保护的目的。在获取AP I在当前运行环境中的信息的过程中,可以选取一个或者多个特定的API,获得在当前运行环境中这一个或至少两个API的信息。在这种选取特定的API进行检测的情况下,相当于可以将具体检测哪个API直接写在检测代码中,这样,当检测代码运行时,就可以直接去获取代码中写明的这个或这些API在当前运行环境中的信息。或者,也可以从众多的API中随机选取一个或多个API,获取这一个或多个API在当前运行环境中的信息。随机选取API,有利于在进行环境真实性检测的过程中实现更大的灵活性,从而更加有效的对运行环境进行真实性检测,在破解与保护的对抗中争取更加有利的地位。对于同一个API,在真实的系统运行环境和虚拟的运行环境中,往往会从不同的角度,呈现出多个不同的特征。因此,在获取API指纹信息时,针对同一个API,还可以分别从多个角度去获取其指纹信息,也即,这样,由于操作系统中包括众多的API,每个API又可以分别从多个角度获取指纹信息,因此,可以作为指纹信息的数量就会非常庞大,只有在构造虚拟环境时模拟了所有可能获取到的指纹信息的情况下,才可能使得虚拟运行环境与真实运行环境达到完全一致的拟合度,但这基本上是不可能实现的,这也就进一步提高了检测的准确性。在获取API在当前运行环境中的信息时,可以根据待检测AP I在真实的系统运行环境和虚拟的运行环境中表现的一个或几个方面的不同特征,获取待检测API的特征信息。在角度的选取上,选择待检测的API在真实的系统运行环境和虚拟的运行环境中,最具特征性的一个或多个方面的不同特征来进行信息获取,显然更具特征性的信息对于检测运行环境的真实性更加具有参考价值。具体在获取某API在当前运行环境中的信息时,获取到的信息可以是该API自身的代码,此时,可以首先获取到该API在内存中的地址,然后到该地址处读取出该API的代码,作为后续比对的基础即可。或者,获取到的信息也可以是该API被调用时产生的一些信息,例如,API运行返回时寄存器(具体可以是易失寄存器)中的彳目息等等。此时,可以在当前运行环境中调用该API,然后获取调用过程中或者调用完成之后产生的一些信息,作为后续比对的基础即可。需要说明的是,具体在调用某API时,由于API本身是函数,而调用函数时需要传入一定的参数,才能得到相应的运行结果。因此,本发明实施例在当前运行环境中调用API时,同样可以为该API传入一些参数。当然,由于本发明实施例中涉及到的API调用仅仅是用于检测,因此,调用时传入怎样的参数是需要考虑的问题。具体实现时,可以如下进行针对当前调用的API,可以根据其指纹信息的具体情况来选择参数,例如,某API的输入参数具有一定的范围,而其指纹信息对于该范围内的所有数值都表现出相同的特征,则在调用该API时,可以在该范围内任意选择一个参数来调用该API即可。当然,如果该API的指纹进行仅在某个或某几个特定参数下才会体现出某特征,则在调用该API时,选择这种特定的参数作为其输入即可。S102 :将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,得到一对比结果;所述API的指纹信息为API在真实运行环境中的特征信息;其中,具体在获取API的指纹信息时,可以从多个方面去获取API本身的代码或者API在真实运行环境中被调用的情况下产生的特征信息。其中,API在被调用的情况下产生的特征信息可以包括API在真实运行环境中被调用时寄存器的值,或者,API在真实运行环境中被调用时产生的栈数据。所谓的AP I在真实运行环境中被调用时寄存器的值、可以包括API (例如异常处理函数等)运行返回时寄存器的值,或者,进程或线程启动并返回用户空间代码后寄存器的值。而所谓的API在真实运行环境中被调用时产生的栈数据可以包括:API运行返回时的栈数据,或者,进程或线程启动并返回用户空间代码后的栈数据等等。需要说明的是,所谓的用户空间代码是相对于内核代码而言的,进程/线程启动时,会首先由内核调用相关的函数做设置运行环境等操作,然后返回执行用户空间代码。以上所说的从多个方面去获取指纹信息,有以下两层含义首先,对于不同的API,最终选取指纹信息时,可能是从不同方面去选取的。例如,对于第一个API,其可能在本身代码上就能体现出一些符合条件的特征,因此,可以选取其本身代码作为该API的指纹;而对于第二个API,可能在本身代码上无法体现出某些特定的特征,但是在运行返回时易失寄存器的值却符合一定的特征(这种特征可以是在API使用过程中具有特定含义,并且在API退出后这种含义不会消失),能够作为指纹信息,因此,就可以选取运行返回时易失寄存器的值作为该API的指纹信息,等等。 其次,对于同一 API,也可以从多个方面去选取其指纹信息。例如,对于某API,如果其自身代码、运行返回时易失寄存器中的值等等都能体现出一些相对稳定的特征,则可以分别从这些方面都获取指纹信息,也即,一个API可以具有多个指纹信息。也就是说,对于同一 API,在真实的系统运行环境和虚拟的运行环境中,通常又会在多个方面会表现出不同的特征。因此,可以根据同一 API在在真实的系统运行环境和虚拟的运行环境中表现出的多方面的不同特征,将API在真实运行环境中的多种角度的特征作为该API的指纹。当然在实际应用中,API在真实的系统运行环境和虚拟的运行环境中的不同特征还可以表现在更多的方面,以上只是举例说明,但在实际应用中并不应限于以上所列举的方面,也不应看做是对本发明的限制。在获取到待检测API在当前运行环境的信息后,将AP I在当前运行环境中的信息,与相应API的指纹信息进行对比,以得到API在当前运行环境的信息与相应API指纹信息是否一致的对比结果。具体在将API在当前运行环境的信息与相应API的指纹信息进行对比的过程中,可以采取全面对比的策略,即获取API在当前运行环境的全方面的可以作为检测运行环境真实性参考信息的特征信息,与相应API的指纹信息进行全面的对比,得到一个相对全面的对比结果,这种获取信息和对比信息的策略能够比较全面的比较API在当前运行环境的信息和API指纹信息,由此产生的对比结果更加全面和准确。也可以采取选择部分信息进行对比策略,在当前运行环境中获取API在真实的系统运行环境和虚拟的运行环境中,一个或多个角度的不同特征信息,从对应角度与相应API的指纹信息进行对比,这种选择部分特征进行对比的效率优先策略,能够提高当前运行环境真实性的检测效率。当然,如果选择待检测的API在真实的系统运行环境和虚拟的运行环境中相比最具特征性的一个或多个角度的信息进行对比,则能够在提高检测效率的同时,兼顾了运行环境真实性检测的可靠性。具体在对比API在当前运行环境的信息与API指纹信息时,可以根据实际情况,采取不同的策略。例如,有的API的指纹信息是某固定的值,而有的API的指纹信息则是一个取值范围,换言之,在真实的系统运行环境和虚拟的运行环境中,有些API的特征性信息呈现出具体数据在数值上的不相等,而对于有的API则表现在具体数据在数值所属范围上的不同;对于前者,可以根据其特点,对比API在真实的系统运行环境和虚拟的运行环境中,特征性信息呈现出具体数据在数值上的是否相等,来得到对比结果;例如,某API的指纹信息中显示,该API运行返回后易失寄存器的值为某固定的值,则就可以在当前运行环境中,调用该API,运行后返回易失寄存器的值,然后比较该值与指纹信息中的值是否相等即可,如果不相等,则证明当前运行环境可能并不是真实的运行环境。而对于后者,则可以对比特征性信息呈现出的取值范围上是否相同,来得到比较结果。例如,某API的指纹信息中显示,该API运行返回后易失寄存器的值是一段有效地址空间(例如,notepad, exe在内容中所占的地址等等),此时,在当前运行环境中调用该API之后,如果运行后返回易失寄存器的值在该有效地址空间范围内,则证明当前运行环境可能是真实的运行环境,否则,如果超出了该有效地址空间范围,则证明当前运行环境可能是一个虚拟的运行环境,等等。以上只是举例说明具体在对比API在当前运行环境的信息与API指纹信息时的比较方法,实际的应用中,可以根据实际需求,确定符合实际情况的比较方法,以得到更加科学和符合实际的比 较结果。S103 :根据所述对比结果验证当前运行环境是否为真实运行环境。对比API在当前运行环境中的信息与API在真实运行环境里指纹特征信息,根据比对的结果,可以确定API在当前运行环境的信息与在真实的运行环境里是否一致,或者具有相同的必要性特征,进而判断当前运行环境为虚拟的系统运行环境,或者真实的系统运行环境。例如,在选取一个特定的或者随机的API进行检测时,如果该AP I在当前运行环境中的信息与其在真实运行环境中对应的指纹信息相同,则可以确定当前运行环境是真实的运行环境。当然,为了提高检测的准确性,在选取多个特定的或者随机的API进行检测时,可以将各个API在当前运行环境中的信息与各自在真实运行环境中对应的指纹信息,如果均相同,则可以确定当前运行环境是真实的运行环境;否则,只要有其中一个API在当前运行环境中的信息与其对应的指纹信息不同,就可以确定当前运行环境是虚拟环境。当然,在针对同一个API进行多种不同的指纹信息的比对的情况下,只有API在当前运行环境中的信息与其对应的各个指纹信息都相同,才能证明当前运行环境是真实的运行环境,否贝U,只要有其中某一种信息与其对应的指纹信息不同,则可以确定当前运行环境是虚拟环境。如前文所述,对于同一个API,在真实的系统运行环境和虚拟的运行环境中,往往会从API本身的代码、API在两种环境下运行返回时寄存器的值、API在两种环境下运行返回时的栈数据、在两种环境下触发异常时异常处理函数运行返回后的寄存器的值、在两种环境下触发异常时异常处理函数返回后的的栈数据、在两种环境下进程或线程启动并返回用户代码后寄存器的值以及栈数据等诸多不同的方面和角度,呈现出多个不同的特征。下面从其中的几个方面和角度,详细地举例说明一下获取API在当前运行环境中的信息,与API指纹信息进行对比,进而验证当前运行环境真实性的具体实施方式
。I.以API函数本身的代码作为其指纹及判断运行环境真实性这里以Windows系统下的kernel32. dll动态链接库导出的GetProcAddress函数为例来进行说明。对此函数的分析可以发现,GetProcAddress函数入口偏移0x30的位置,此处的汇编指令为
7C80AC58 FF75 08 PUSH DWORD PTR SS [EBP+8]7C80AC5B E8 C2ECFFFF CALL kernel32. 7C809922可以选择
:0xE80875FF 为本 API 的指纹。0x7C80AC28 是GetProcAddress的函数地址,可以通过读取GetProcAddress函数地址偏移Ox 30的值,然后跟0xE80875FF进行比较,来判断当前运行环境的真实性比较结果相同则表示该运行环境为真实Windows操作系统;如果不相同,则认为当前运行环境是虚拟构造的。2.以API运行返回之后易失寄存器的值作为其指纹及判断运行环境真实性这里选取Windows系统下kernel32. dll动态链接库导出的IstrlenA函数为例来
进行说明。通过分析其汇编代码
.text7C80C6E0 ; xnt __stdcall IstrlenA(LPCSTR IpString)
.text7C80C6E0push 8 ; lstrlen
.text7C80C6E2push offset dw〇rd—7C80C718
text:7C80C6E7call sub_7C8024CB
text7C80C6ECmov eax, [ebp+8]
text7C80C6EFtest eax, eax
.text:7C80C6F1jzl〇c_7C822D7C
text7C80C6F7and dword ptr [ebp-4] t 0 .text7C80C6FB lea edx, [eax+1]
.text:7C80C6FE loc—7C80C6FE:;
text7C80C6FEmov Cl, [eax]
text7C80C700inc eax
text7C80C701test cl, cl
.text7C80C703jnz short loc—7C80C6FE
.text:7C80C705sub eax, edx
text:7C80C707or dword ptr [ebp-4] , OFFFFFFFFh .text:7C80C70B
.text:7C80C70B loc_7C80C70B;
.text:7C80C70Bcall sub_7C80250B
.text7C80C710retn 4可以看出,EDX寄存器只在0x7C80C6FB处赋值。通过阅读代码,当向该函数传递有效参数时,0x7C80C6EC处代码会将第一个参数的地址传给EDX寄存器,之后再将EDX+1的值赋予EDX寄存器,而之后就只是读取EDX寄存器的值。再通过分析0x7C80C70B处callsub_7C80250B 函数
text 7C80250B sub—7C80250B procnear; CODE XREF
.text7C80250Bmovecx, [ebp-lOh]
text7C80250Emovlarge fs: 0, ecx
text7C802515popecx
text7C802516popedi
text7C802517popesi
text7C802518popebx
text7C802519leave·
text7C80251Apushecx
text7C80251Bretn可以看到,此处函数并未使用EDX寄存器。因此,可以确定EDX可以作为此API的指纹。在IstrlenA函数返回之后,EDX保存参数地址偏移一位的地址。当IstrlenA函数返回之后,读取EDX+1的值,与IstrlenA参数的值相比较,如果相同,则认为是运行环境是真实的Windows操作系统;如果不同,则认为当前环境是虚拟构造的运行环境。3. SHl异常处理函数返回之后以易失寄存器的值作为指纹为了让系统和应用程序代码都可以简单方便地支持异常处理,Windows定义了一套标准的机制来规范异常处理代码的设计和编译,这套机制被称为结构化异常处理(Structured Exception Handling),简称为 SEH。从系统的角度来看,SElH 是对 Windows 操作系统中的异常分发和处理机制的总称,其实现遍布在Windows系统的很多模块和数据结构中。异常注册链表的表头是登记在每个线程的线程信息块(TIB)中。从编程的角度来看,SEH是一套规范,利用这套规范,程序员可以编写处理代码来复用系统的异常处理设施。SHl异常处理函数的处理需要通过系统函数,先在用户代码中设置SHl处理函数,
然后制造异常,使得代码的执行流程转向异常处理函数,例如下面的代码
004IC9F9 2BC9sub ecx, ecx
0041C9FB 64 : FF31push dword ptr f s: [ecx]
0041C9FE 648921mov dword ptr fs[ecx], esp;
//设置异常处理函数
0041CA01 Flinti
0041CA02 FFOlxnc dword ptr [ecx]当执行0041CA02处的地址时,发生异常,转到系统处理函数。在系统将控制权交
异常处理函数之前,代码如下
权利要求
1.一种检测运行环境真实性的方法,其特征在于,包括 获取应用程序编程接口 API在当前运行环境中的信息; 将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,得到一对比结果;所述API的指纹信息为API在真实运行环境中的特征信息; 根据所述对比结果验证当前运行环境是否为真实运行环境。
2.根据权利要求I所述的方法,其特征在于,所述API在当前运行环境中的信息,包括获取至少两个API在当前运行环境中的信息; 所述根据所述对比结果验证当前运行环境是否为真实运行环境包括 如果各个API在当前运行环境中的信息均与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。
3.根据权利要求I所述的方法,其特征在于,所述获取API在当前运行环境中的信息,包括 获取随机选取的API在当前运行环境中的信息; 所述根据所述对比结果验证当前运行环境是否为真实运行环境包括 如果所述随机选取的API在当前运行环境中的信息与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。
4.根据权利要求I所述的方法,其特征在于,同一API对应有至少两种指纹信息; 所述将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,包括 对于同一 API,将其在当前运行环境中的信息,与预先获取到的该API的至少两种指纹信息分别进行对比; 所述根据所述对比结果验证当前运行环境是否为真实运行环境包括 对于同一 API,如果其在当前运行环境中的信息与预先获取到的该API的至少两种指纹信息均相同,则所述当前运行环境为真实运行环境。
5.根据权利要求I至4任一项所述的方法,其特征在于,所述API的指纹信息包括,API本身的代码; 所述获取API在当前运行环境中的信息,包括 获取相应API在当前运行环境中的代码; 所述将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比包括 将所述API在当前运行环境中的代码与预先获取到的相应API在真实运行环境中的代码进行对比。
6.根据权利要求I至4任一项所述的方法,其特征在于,所述API的指纹信息包括,API在被调用的情况下产生的特征信息; 所述获取API在当前运行环境中的信息,包括 获取API在当前运行环境中被调用时产生的信息; 所述将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比包括 将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比。
7.根据权利要求6所述的方法,其特征在于,所述API在被调用的情况下产生的特征信息包括,API在被调用的情况下,寄存器的值; 所述获取API在当前运行环境中的信息,包括 获取API在当前运行环境中被调用时,寄存器的值; 所述将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比包括 将所述API在当前运行环境中被调用时寄存器的值与预先获取到的相应API在真实运行环境中被调用时寄存器的值进行对比。
8.根据权利要求7所述的方法,其特征在于,所述API在被调用的情况下寄存器的值包括 API运行返回后寄存器的值; 或, 进程或线程启动并返回用户空间代码之后寄存器保存的值。
9.根据权利要求6所述的方法,其特征在于,所述API在被调用的情况下产生的特征信息包括API在被调用时产生的栈数据; 所述获取API在当前运行环境中的信息,包括 获取API在当前运行环境中被调用时产生的栈数据; 所述将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比包括 将所述API在当前运行环境中被调用时产生的栈数据与预先获取到的相应API在真实运行环境中被调用时产生的栈数据进行对比。
10.根据权利要求9所述的方法,其特征在于,所述API在被调用时产生的栈数据包括 API运行并返回后的栈数据; 或, 进程或线程启动并返回用户空间代码之后的栈数据。
11.一种检测运行环境真实性的装置,其特征在于,包括 信息获取单元,用于获取应用程序编程接口 API在当前运行环境中的信息; 对比单元,用于将所述API在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,得到一对比结果;所述API的指纹信息为API在真实运行环境中的特征信息; 验证单元,用于根据所述对比结果验证当前运行环境是否为真实运行环境。
12.根据权利要求11所述的装置,其特征在于,所述信息获取单元,包括 第一信息获取子单元,用于获取至少两个API在当前运行环境中的信息; 所述验证单元包括 第一验证子单元,用于如果各个API在当前运行环境中的信息均与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。
13.根据权利要求11所述的装置,其特征在于,所述信息获取单元,包括第二信息获取子单元,用于获取随机选取的API在当前运行环境中的信息 所述验证单元包括 第二验证子单元,用于如果所述随机选取的API在当前运行环境中的信息与相应API的指纹信息相同,则所述当前运行环境为真实运行环境。
14.根据权利要求11所述的装置,其特征在于,同一API对应有至少两种指纹信息; 所述对比单元包括 第一对比子单元,用于对于同一 API,将其在当前运行环境中的信息,与预先获取到的该API的至少两种指纹信息分别进行对比; 所述验证单元包括 第三验证子单元,用于对于同一 API,如果其在当前运行环境中的信息与预先获取到的该API的至少两种指纹信息均相同,则所述当前运行环境为真实运行环境。
15.根据权利要求11至14任一项所述的装置,其特征在于,所述API的指纹信息包括,API本身的代码; 所述信息获取单元,还包括 第三信息获取子单元,用于获取相应API在当前运行环境中的代码; 所述对比单元包括 第二对比子单元,用于将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比。
16.根据权利要求11至14任一项所述的装置,其特征在于,所述API的指纹信息包括,API在被调用的情况下产生的特征信息; 所述信息获取单元,还包括 第四信息获取子单元,用于获取API在当前运行环境中被调用时产生的信息; 所述对比单元包括 第三对比子单元,用于将所述API在当前运行环境中被调用时产生的信息与预先获取到的相应API在真实运行环境中被调用时产生的信息进行对比。
17.根据权利要求16所述的装置,其特征在于,所述API在被调用的情况下产生的特征信息包括,API在被调用的情况下寄存器的值; 所述信息获取单元,包括 寄存器值获取单元,用于获取API在当前运行环境中被调用时寄存器的值所述第三对比子单元具体用于将所述API在当前运行环境中被调用时寄存器的值与预先获取到的相应API在真实运行环境中被调用时寄存器的值进行对比。
18.根据权利要求17所述的装置,其特征在于,所述API在被调用的情况下寄存器的值包括 API运行返回后寄存器的值; 和/或, 进程或线程启动并返回用户空间代码之后寄存器保存的值。
19.根据权利要求16所述的装置,其特征在于,所述API在被调用的情况下产生的特征信息包括包括,API在被调用时产生的栈数据; 所述信息获取单元,包括栈数据获取单元,用于获取API在当前运行环境中被调用时产生的栈数据; 所述第三对比子单元具体用于将所述API在当前运行环境中被调用时产生的栈数据与预先获取到的相应API在真实运行环境中被调用时产生的栈数据进行对比。
20.根据权利要求19所述的装置,其特征在于,所述API在被调用时产生的栈数据包括 API运行并返回后的栈数据; 和/或, 进程或线程启动并返回用户空间代码之后的栈数据。
全文摘要
本发明公开了一种检测运行环境真实性的方法及装置,其中,所述方法包括获取应用程序编程接口API在当前运行环境中的信息;将所述AP I在当前运行环境中的信息,与预先获取到的相应API的指纹信息进行对比,得到一对比结果;所述API的指纹信息为API在真实运行环境中的特征信息;根据所述对比结果验证当前运行环境是否为真实运行环境。通过本发明,能够极大的提高检测运行环境真实性的准确度,并且能够在多种操作系统下运用本发明提供的方法实现对运行环境真实性的检测。
文档编号G06F21/00GK102722672SQ20121018264
公开日2012年10月10日 申请日期2012年6月4日 优先权日2012年6月4日
发明者周辉, 唐杰, 徐传宇, 李智鹏 申请人:奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1