发明内容
本发明针对现有技术存在的上述不足,提供一种基于进程模拟的二进制程序分析***,针对现有技术的不足之处,从程序的底层即***硬件结构和操作***的级别对程序进行运行环境的模拟,不干涉程序的正常运行,而对程序的运行过程如数据流向等内容进行监控。本发明不依赖于对程序的静态逆向分析,而采用完全动态分析的方法,能够避免大部分程序保护技术造成的影响。通过对分析***进行扩展并自定义攻击行为,本发明能够在攻击代码被执行前进行检测和拦截;并且通过引入动态污点分析等手段,能够对敏感数据流向进行分析和跟踪,避免造成数据和隐私的泄露。并且,本发明不依赖于程序的静态分析结果,能够对动态生成代码进行完整分析。
本发明是通过以下技术方案实现的,本发明包括:模拟器引擎模块、内存管理模块、进程管理模块、***调用接口、线程管理模块、中央处理模块和提供应用程序接口的分析组件接口,其中:模拟器引擎模块分别连接内存管理模块、进程管理模块、***调用接口和分析组件接口,分别传输运行状态信息和运行指令、进程管理和线程调度信息、***API调用数据、调试信息和分析组件事件等,控制、协调各个模块并降低不同模块之间的耦合度;进程管理模块分别与中央处理模块、内存管理模块和***调用接口相连,分别传输处理器调度信息和运行状态信息、内存管理数据以及***调用参数转换及封装等信息,线程管理模块分别与进程管理模块、内存管理模块和中央处理模块相连,分别传输线程运行状态及调度信息、线程内存数据访问以及处理器运行状态;
所述的模拟器引擎模块为各个组件提供统一的协调控制,并驱动各个组件运行完成被模拟进程的加载、初始化、运行和清除,该模拟器引擎模块包括:驱动单元、操作***挂钩单元和调试单元,其中:驱动单元与内存管理模块和进程管理模块相连,接收运行状态信息,发送运行指令;操作***挂钩单元与进程管理模块相连,接收进程管理模块的***API调用并传递给底层操作***,返回API调用结果;调试单元连接***调用接口和分析组件接口进行应用程序调试;
所述的内存管理模块包括:虚拟内存管理单元、堆管理单元和栈管理单元,其中:虚拟内存管理单元向线程管理模块传输内存访问数据,并与模拟器引擎模块的驱动单元相连以传输运行状态信息;堆管理单元从进程管理模块接收堆管理指令,完成进程中堆内存的管理;栈管理单元从线程管理模块接收线程运行状态,完成所有线程中栈内存的管理。
所述的虚拟内存管理单元采用分页方案对4GB虚拟内存进行管理;同时模拟Windows的虚拟内存管理行为,完成操作***级别的内存分配、回收及访问权限控制。
所述的堆管理单元和栈管理单元分别传输的进程中堆的管理信息、进程中各线程栈内存的管理,全局虚拟内存页分配与回收等。
所述的进程中堆的管理信息包括:堆的建立销毁和内存分配;堆内存权限设置;堆容量调整与重分配等。
所述的进程管理模块包括:线程调度管理单元、状态驱动单元和***API封装单元,其中:线程调度管理单元与中央处理模块相连接收进程中所有线程的调度信息,完成线程的调度以及创建和销毁;状态驱动单元与模拟器引擎模块相连,接收模拟器引擎模块的运行指令,完成主线程及其他线程的运行驱动并传输运行状态信息;***API封装单元与***调用接口相连接收线程管理模块的***API调用,封装参数并传输至模拟器引擎模块进行调用。
所述的进程管理模块用于对进程的完整执行流程进行驱动;维护该进程所包含的所有线程及其调度;进程中***句柄(Handle)维护及内存地址分配;以及进程PEB(ProcessEnvironmentBlock)等数据结构的创建及维护。
所述的线程管理模块包括:环境信息模拟单元、驱动线程单元和执行单元,其中:环境信息模拟单元与进程管理单元相连,接收线程的运行时状态信息并建立模拟运行时环境供线程使用;驱动线程单元与进程管理单元相连,接收线程运行指令并传输线程运行状态;执行单元与中央处理模块的线程状态单元相连用于完成处理器指令循环并在结束时终止线程。
所述的环境信息模拟模块建立的供线程使用的模拟运行时环境包括:入口点、参数、标志位、堆栈地址和大小及TEB(ThreadEnvironmentBlock);
所述的线程管理模块维护模拟进程中单个线程的环境信息,并驱动线程从入口点开始的执行过程,同时判断终止条件并结束线程;同时用于由该线程动态加载的其他模块(DLL)的载入和初始化;
所述的中央处理模块内置有分别与进程管理模块和线程管理模块相连的寄存器和状态单元且分别传输处理器调度信息和线程运行状态及调度信息。
所述的传输处理器调度信息和线程运行状态及调度信息包括:处理器标志位(eflags)、运行状态信息;并对x86指令集、x87FPU指令集、MMX指令集和SSE指令集提供了解释模拟函数,从而实现完整处理器功能的模拟。
所述的中央处理模块上设有异常管理器,用于传递处理器异常信息及异常处理结果,该异常管理器构造异常的环境信息并执行异常处理函数。
所述的分析组件接口为***提供API接口,使得分析人员能够很容易地编写分析组件,完成自动化程序分析;
所述的模拟器引擎模块分别连接加载器、反汇编引擎和与附加的调试组件相连、用于进行应用程序调试的调试接口,其中:加载器解析待分析进程的可执行PE文件并将解析结果通过模拟器引擎模块加载至内存管理模块,反汇编引擎对单条x86指令进行反汇编,解析出指令的操作码、源操作数、目的操作数等信息;调试接口用于传递调试信息,可进行应用程序及模拟器自身的调试;
所述的待分析进程的可执行PE文件是指:Windows中的可执行程序以PE格式存在,模拟器加载并解析PE文件使其能够被模拟执行;
本发明涉及一种基于上述***的进程优化方法,包括以下步骤:
步骤一、对待分析进程进行轻量级x86指令集模拟,即以程序运行效率损失在两个数量级以内的前提下进行x86指令集的模拟处理和虚拟内存环境,
所述的步骤一具体包括:
1.1使用启发式递归反汇编算法对于每条处理器指令提供静态的反汇编信息;
所述的启发式递归反汇编算法包括以下步骤:
1.1.1针对PE文件中的各条指令进行以下步骤的判断。
1.1.2定位入口点指令E,当该指令E为有效指令则对其进行反汇编处理后执行步骤1.1.3,否则跳过该条指令并重新执行步骤1.1.2。
1.1.3当反汇编处理后的指令E为跳转指令,则对指令E的跳转目标进行反汇编处理。
1.1.4在指令E的尾部添加该指令的长度信息并返回步骤1.1.2处理下一条指令,直至完成所有指令的处理后返回反汇编处理得到的指令集合S。
1.2利用反汇编信息模拟各条指令的执行流程,包括寄存器、内存数据以及标志位的值。
1.3提取内存访问数据、寄存器值变化信息用于程序分析。
所述的内存访问数据包括:内存地址和内存数据、寄存器值、标志位改变信息以及异常信息。
步骤二、模拟若干操作***行为保证待分析进程运行在可控的环境中,具体包括:
2.1进程初始化阶段对被模拟的程序进行加载和初始化,确定进程中各模块中各段(section)的内存分布情况,并确定入口点以及终止条件。
2.2内存管理使用分页式的内存管理机制,包括:以页为单位的虚拟内存分配、回收和访问权限控制。
2.3线程管理模块用于维护多线程程序中的线程建立、销毁以及线程调度,使多线程程序在共享内存的模型下能够被正常执行。
2.4异常处理用于在处理器发生异常时的操作***异常处理机制,使程序的异常处理例程能够运行在模拟环境中。
步骤三、对进程中的操作***API调用进行封装,交由操作***直接执行;
所述的操作***API是指:操作***提供给用户进程的应用程序接口,使用户程序能够利用操作***功能。
3.1拦截所有模拟进程的API调用,核心API由模拟器引擎模块直接模拟执行,其他API发送至操作***执行;
所述的核心API包括:内存管理API、线程管理API、调试API、操作***参数获取API等。
3.2完成API调用时的参数转换,包括:模拟内存地址和真实地址的映射。
3.3操作***在API执行完毕后返回模拟器引擎模块,处理执行结果。
步骤四、为模拟执行过程中的动态运行时信息提供应用程序接口,并将模拟器各组件的执行过程封装为事件,以事件处理的方式提供应用程序接口,最终使得分析程序能够利用这些信息进行程序优化。
所述的动态运行时信息包括:指令流、数据流和控制流。
所述的事件包括:指令执行事件、内存访问事件、操作***API调用事件、线程调度事件。
技术效果
1)对被分析程序进行指令级别的模拟执行,使用轻量级x86指令集解释器来提供细粒度的运行时信息;
2)对待分析进程中与程序分析无关的内容,如***调用的执行采用包装或模拟的方式,交由底层操作***执行,保证分析效率;
3)模拟若干操作***行为如内存管理、线程管理及异常处理等,保证被分析程序运行在可控的环境中;
4)为程序的自动化分析提供良好的接口,使得程序的模拟执行和分析能够同步高效进行。
与目前已有的分析方案相比,本发明几乎不受反调试手段的影响,同时不修改待分析进程的原始指令和数据,运行效率比全***模拟提高了一至二个数量级,同时稳定性和兼容性较二进制插桩有了极大的提高。在该分析***的基础上,能够高效进行程序的算法及协议分析、漏洞挖掘及检测、程序性能分析、内存调试、程序行为分析以及恶意程序检测等多种自动化分析手段,对程序安全分析提供了可靠的支持。
实施例1
以常用多线程网络通信程序curl.exe(http://curl.haxx.se)为例,说明具体的实施过程。
如图1所示,包括:模拟器引擎模块、内存管理模块、进程管理模块、***调用接口、线程管理模块、中央处理模块和提供应用程序接口的分析组件接口,其中:模拟器引擎模块分别连接内存管理模块、进程管理模块、***调用接口和分析组件接口,分别传输内存访问数据、线程调度和处理器访问数据、***调用参数及其封装以及模拟器事件和环境信息,控制、协调各个模块并降低不同模块之间的耦合度;进程管理模块分别与内存管理模块、中央处理模块和***调用接口相连,分别传输内存管理数据如内存分配回收、处理器调度信息以及***调用参数转换及封装等信息,线程管理模块分别与内存管理模块、进程管理模块和中央处理模块相连,分别传输线程数据在内存中的分布情况、线程运行状态及调度信息、以及处理器运行状态;
所述的模拟器引擎模块包括:公用的***接口,为各个组件提供统一的协调控制,并驱动各个组件运行完成被模拟进程的加载、初始化、运行和清除;
所述的内存管理模块分别与堆和栈相连,分别传输进程中堆的管理信息如堆的建立销毁和内存分配、进程中各线程栈内存的管理,内存管理模块包括:虚拟内存管理单元,采用分页方案对4GB虚拟内存进行管理;同时模拟Windows的虚拟内存管理行为,完成操作***级别的内存分配、回收及访问权限控制;
内存管理模块:模拟Windows的分页内存管理机制,用于待分析进程的内存分配和回收以及权限管理,为***的内存管理API提供底层的模拟实现,同时维护待分析进程的堆和栈;
所述的进程管理模块包括:用于对进程的完整执行流程进行驱动;维护该进程所包含的所有线程及其调度;进程中***句柄(Handle)维护及内存地址分配;以及进程PEB(ProcessEnvironmentBlock)等数据结构的创建及维护;
进程管理模块:维护待分析进程相关的上下文信息,管理待分析进程的所有线程;
所述的线程管理模块包括:维护模拟进程中单个线程的环境信息,如入口点、参数、标志位、堆栈地址和大小及TEB等,并驱动线程从入口点开始的执行过程,同时判断终止条件并结束线程;同时用于由该线程动态加载的其他模块(DLL)的载入和初始化;
所述的中央处理模块包括:为完整的中央处理模块提供模拟环境、包括寄存器、处理器标志位(eflags)、运行状态信息等;并对x86指令集、x87FPU指令集、MMX指令集和SSE指令集提供了解释模拟函数,从而实现完整处理器功能的模拟;以及子模块异常管理器;其中异常管理器与处理器模块连接,传递处理器异常信息及异常处理结果;
线程管理模块和中央处理模块:为每个线程维护独立的中央处理模块环境,包括寄存器、处理器标志位及寄存器其它运行时数据,中央处理模块对待分析进程的各条指令进行模拟解释执行;
***调用接口:接管待分析进程中的API调用,对核心API,如内存相关,采用模拟执行,其他API则交由操作***直接运行,保证运行效率;
分析组件接口为***提供API接口,使得分析人员能够很容易地编写分析组件,完成自动化程序分析;
所述的模拟器引擎模块分别连接加载器、反汇编引擎和与附加的调试组件相连、用于进行应用程序调试的调试接口,其中:加载器解析待分析进程的可执行PE文件并将解析结果通过模拟器引擎模块加载至内存管理模块,反汇编引擎对单条x86指令进行反汇编,解析出指令的操作码、源操作数、目的操作数等信息;调试接口用于传递调试信息,可进行应用程序及模拟器自身的调试;
所述的待分析进程的可执行PE文件是指:Windows中的可执行程序以PE格式存在,模拟器加载并解析PE文件使其能够被模拟执行;
实施例2
如图2所示,本发明所述***运行时经历加载、初始化、运行分析、终止等过程。
步骤一、加载待分析进程的PE文件和依赖的动态链接库,建立完整的Windowsx86虚拟运行时环境;
所述的运行时环境包括线性内存地址空间、中央处理模块环境以及相关的操作***功能;
步骤二、对待分析进程进行指令模拟执行,使用轻量级的x86指令集模拟器提供细粒度的运行时信息,并进行后续分析,具体步骤包括:
2.1使用启发式递归反汇编算法尝试反汇编所有指令;
2.2构造处理器模拟环境,利用反汇编信息精确模拟各条指令的执行流程;
2.3提取内存访问数据、寄存器值等信息用于程序分析;
所述的轻量级的x86指令集模拟器是指:高性能的、以低代价运行的x86指令集模拟器,能够在对程序正常执行不造成显著影响的情况下对x86指令集进行模拟执行;
所述的细粒度的划分具体是:精确到对操作***可见的最细粒度,即指令、寄存器这一级别,而非诸如动态二进制插桩等方案常采用的基本块或函数这一级别;
所述的运行时信息具体是指:内存访问信息如内存地址和内存数据、寄存器值、标志位改变信息以及可能产生的异常信息等;
步骤三、模拟若干操作***行为保证待分析进程运行在可控的环境中,具体步骤包括:
3.1加载curl.exe的程序主体和依赖的***模块(DLL),使用地址空间随机化(ASLR)分配各组件的基地址,确定内存布局;同时确定程序入口点以及终止条件;
3.2对进程虚拟内存空间采用分页管理,其中页面大小为4KB;对每个页面维护其状态信息(空闲、保留或提交)以及访问控制权限(可读、可写、可执行)等,并由虚拟内存管理单元统一管理内存页面的分配和回收;
3.3线程管理模块用于管理进程中的所有线程,包括在程序初始化时的主线程、执行过程中的线程建立和销毁;
3.4异常处理器接管在处理器发生异常时的操作***异常处理机制,在模拟器环境中运行程序的异常处理例程;
所述的操作***行为具体是指:进程初始化、内存管理、线程管理、异常处理等;
步骤四、对进程中的所有操作***API进行封装,并部分交由操作***直接执行,具体步骤包括:
4.1拦截所有模拟进程的API调用,对核心API(如内存分配APIVirtualAlloc())由模拟器直接模拟执行,其他API(如网络APIsocket())发送至操作***执行;
4.2完成API调用时的参数转换,对其中的指针类型参数进行模拟内存地址和真实地址的映射,对于复杂结构体和新分配的堆数据进行深度拷贝映射至模拟内存空间;
4.3API执行完毕后返回模拟器控制,清除堆栈并解析API返回结果;
所述的操作***API是指操作***提供给用户进程的应用程序接口,使用户程序能够利用操作***功能。
步骤五、为模拟执行过程中的动态运行时信息如指令流、数据里和控制流提供应用程序接口,使得分析程序能够利用这些信息进行程序分析,具体为:将模拟器的执行过程封装为事件,以事件处理的方式提供应用程序接口;主要包括指令执行事件、内存访问事件、操作***API调用事件、线程调度事件等等;针对curl.exe的执行流程,能够获取到其中的所有指令执行事件,包括寄存器和标志位改变等参数;能够获取诸如网络API调用事件,并能够从中解析网络数据;同时能够重建程序运行时环境用于描述程序行为等。