一种利用运行时库识别编译器的方法及系统与流程

文档序号:11154424阅读:325来源:国知局
一种利用运行时库识别编译器的方法及系统与制造工艺

本发明涉及计算机网络安全领域,特别涉及一种利用运行时库识别编译器的方法及系统。



背景技术:

在计算机程序设计领域,运行时库是一种被编译器用来实现编程语言内置函数,以提供该语言程序运行时(执行)支持的一种特殊的计算机程序库。运行时库一般包括基本的输入输出或是内存管理等支持。运行时库由编译器决定,以面向编程语言,提供其最基本的执行时需要,比如Visual C++需要复杂的运行时库支持而C的运行时库则相对简单。

运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于新观念。所以这个时期的C运行时库都是单线程的。随着操作系统多线程技术的发展,最初的C运行时库无法满足程序的需求,出现了严重的问题。C运行时库使用了多个全局变量(例如errno)和静态变量,这可能在多线程程序中引起冲突。假设两个线程都同时设置errno,其结果是后设置的errno会将先前的覆盖,用户得不到正确的错误信息。因此,后续各个编译器的生产商在不同平台上都开发了对应的运行时库,但大部分实现都是与各个平台有关的。如Visual C++提供了两种版本的C运行时库。一个版本供单线程应用程序调用,另一个版本供多线程应用程序调用。Visual C++提供的多线程运行时库又分为静态链接库和动态链接库两类,而每一类运行时库又可再分为debug版和release版,因此Visual C++共提供了6个运行时库。

目前对于可执行文件的编译器的识别主要依靠在可执行文件中提取一段特征,如从入口点开始提取N个字节,计算HASH,组成编译器识别特征库,利用该特征库去识别编译器,由于没有区分和考虑不同编译器编译的可执行文件的不同,仅仅只是提取一段字符串特征,在识别过程中往往只能识别编译器类型,如识别是否为VC编译器,是否为gcc编译器等,而不能识别编译器的类型、版本、编译选项 (debug/Release版,控制台/MFC/windows,ANSI/UNICODE),另外也容易出现识别错误或不能识别的情况。



技术实现要素:

为了解决上述问题,本发明提出一种利用运行时库识别编译器的方法及系统,通过对程序入口点附近进行识别,确定编译器类型,解决了现有编译器识别方法不准确的问题。

本发明首先提出一种利用运行时库识别编译器的方法,包括:

提取已知不同类型及版本编译器编译出的二进制文件的运行时库特征码;

将提取到的运行时库特征码构造成为编译器识别特征库;

获取待识别的二进制可执行文件;

检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码,如果是,则所述待识别的二进制可执行文件编译器类型为可识别的,输出编译器信息;否则判断所述待识别的二进制可执行文件是否为压缩加密类型;

判断所述待识别的二进制可执行文件是否为压缩加密类型;如果是,则对待识别的二进制可执行文件进行解密处理后,再进行编译器识别;否则所述待识别的二进制可执行文件的编译器无法识别。

所述的方法中,所述编译器识别特征库中包括:运行时库特征码、偏移位置、编译器类型、编译器版本及编译器选项。

所述的方法中,所述检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码具体为:检测待识别的二进制可执行文件中入口点偏移位置中是否包含运行时库特征码。

所述的方法中,所述输出的编译信息包括:编译器类型、编译器版本及编译器选项。

本发明还相应提出一种利用运行时库识别编译器的系统,包括:

特征码提取模块,用于提取已知不同类型及版本编译器编译出的二进制文件的运行时库特征码;

特征库构造模块,用于将提取到的运行时库特征码构造成为编译器识别特征库;

文件获取模块,用于获取待识别的二进制可执行文件;

检测模块,用于检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码,如果是,则所述待识别的二进制可执行文件编译器类型为可识别的,输出编译器信息;否则判断所述待识别的二进制可执行文件是否为压缩加密类型;

加密判断模块,用于判断所述待识别的二进制可执行文件是否为压缩加密类型;如果是,则对待识别的二进制可执行文件进行解密处理后,再进行编译器识别;否则所述待识别的二进制可执行文件的编译器无法识别。

所述的系统中,所述编译器识别特征库包括:运行时库特征码、偏移位置、编译器类型、编译器版本及编译器选项。

所述的系统中,所述检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码具体为:检测待识别的二进制可执行文件中入口点偏移位置中是否包含运行时库特征码。

所述的系统中,所述输出的编译信息包括:编译器类型、编译器版本及编译器选项。

利用各种不同编译器编译的可执行文件的入口点一般包含运行时库提供的启动代码,其主要功能是对程序进行初始化、对全局变量进行赋初值、加载用户程序的真实入口main函数,因此不同编译器编译的可执行程序的入口点附近一定包含特有的运行时库代码特征。因此本发明通过提取不同类型不同版本编译器编译的二进制文件所包含的独有的运行时库特征码,组成编译器识别特征库,利用该特征库对可执行文件的编译器类型和版本进行精确识别。针对可执行文件的编译器识别,不再仅仅依靠在可执行文件的某个位置随机提取一段特特征码,而是结合可执行文件包含编译器运行时库特征这一特性,在可执行文件的特定位置提取运行时库特征码来精确识别编译器类型和编译器版本。

本发明的优势在于,能够快速识别二进制可执行文件的编译器类型,无需详细分析二进制可执行文件的内容,并且还能够精确识别编译器的版本、编译选项等信息。且本发明方法适用面广,对所有类型的编译器均适用,包括Microsoft VISUAL C++编译器、Microsoft VISUAL BASIC编译器、Microsoft FORTRAN编译器、mingw(gcc)编译器等各种类型的编译器。

附图说明

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

图1为本发明一种利用运行时库识别编译器的方法实施例流程图;

图2为本发明一种利用运行时库识别编译器的系统实施例结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明中技术方案作进一步详细的说明。

为了解决上述问题,本发明提出一种利用运行时库识别编译器的方法及系统,通过对程序入口点附近进行识别,确定编译器类型,解决了现有编译器识别方法不准确的问题。

首先给出一种利用运行时库识别编译器的方法实施例,如图1所示,包括:

S101:提取已知不同类型及版本编译器编译出的二进制文件的运行时库特征码;

S102:将提取到的运行时库特征码构造成为编译器识别特征库;不同编译器编译的二进制可执行程序的入口点附近一定包含特有的运行时库代码特征,因此提取不同类型不同版本编译器的运行时库特征码行程编译器识别特征库;

S103:获取待识别的二进制可执行文件;加载待识别的二进制可执行文件,快速定位程序入口点地址;

S104:检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码,如果是,则所述待识别的二进制可执行文件编译器类型为可识别的,输出编译器信息;否则执行S105;输出的编译器信息包括该运行时库特征码对应的编译器类型、编译器版本、编译器选项;

S105:判断所述待识别的二进制可执行文件是否为压缩加密类型;如果是,则执行S106;否则所述待识别的二进制可执行文件的编译器无法识别;如果待识别的二进制可执行文件入口点附近不包含编译器识别特征库中的任何特征,则该文件可能经过压缩加密处理,用于隐藏程序真正入口点,防止软件被破解,因此需要对该文件进行压缩加密类型识别处理;

S106:对待识别的二进制可执行文件进行解密处理后,再进行编译器识别。即对解压解密出的二进制可执行文件进行如上所述的编译器识别。

所述的方法中,所述编译器识别特征库中包括:运行时库特征码、偏移位置、编译器类型、编译器版本及编译器选项。所述偏移位置是指运行时库特征码在可执行文件中的入口点的偏移位置。

所述的方法中,所述检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码具体为:检测待识别的二进制可执行文件中入口点偏移位置中是否包含运行时库特征码。假设编译器识别特征库中的运行时库特征码包含运行时库特征码A和运行时库特征码在可执行文件中的入口点偏移位置B,检查二进制可执行文件中入口点偏移位置B中是否包含运行时库特征码A;

所述的方法中,所述输出的编译信息包括:编译器类型、编译器版本及编译器选项。

本发明还相应提出一种利用运行时库识别编译器的系统实施例,如图2所示,包括:

特征码提取模块201,用于提取已知不同类型及版本编译器编译出的二进制文件的运行时库特征码;

特征库构造模块202,用于将提取到的运行时库特征码构造成为编译器识别特征库;

文件获取模块203,用于获取待识别的二进制可执行文件;

检测模块204,用于检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码,如果是,则所述待识别的二进制可执行文件编译器类型为可识别的,输出编译器信息;否则判断所述待识别的二进制可执行文件是否为压缩加密类型;

加密判断模块205,用于判断所述待识别的二进制可执行文件是否为压缩加密类型;如果是,则对待识别的二进制可执行文件进行解密处理后,再进行编译器识别;否则所述待识别的二进制可执行文件的编译器无法识别。

所述的系统中,所述编译器识别特征库包括:运行时库特征码、偏移位置、编译器类型、编译器版本及编译器选项。

所述的系统中,所述检测待识别的二进制可执行文件入口点附近是否包含编译器识别特征库中的运行时库特征码具体为:检测待识别的二进制可执行文件中入口点偏移位置中是否包含运行时库特征码。

所述的系统中,所述输出的编译信息包括:编译器类型、编译器版本及编译器选项。

利用各种不同编译器编译的可执行文件的入口点一般包含运行时库提供的启动代码,其主要功能是对程序进行初始化、对全局变量进行赋初值、加载用户程序的真实入口main函数,因此不同编译器编译的可执行程序的入口点附近一定包含特有的运行时库代码特征。因此本发明通过提取不同类型不同版本编译器编译的二进制文件所包含的独有的运行时库特征码,组成编译器识别特征库,利用该特征库对可执行文件的编译器类型和版本进行精确识别。针对可执行文件的编译器识别,不再仅仅依靠在可执行文件的某个位置随机提取一段特特征码,而是结合可执行文件包含编译器运行时库特征这一特性,在可执行文件的特定位置提取运行时库特征码来精确识别编译器类型和编译器版本。

本发明的优势在于,能够快速识别二进制可执行文件的编译器类型,无需详细分析二进制可执行文件的内容,并且还能够精确识别编译器的版本、编译选项等信息。且本发明方法适用面广,对所有类型的编译器均适用,包括Microsoft VISUAL C++编译器、Microsoft VISUAL BASIC编译器、Microsoft FORTRAN编译器、mingw(gcc)编译器等各种类型的编译器。

虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1