发明内容
针对上述指出的现有软件行为技术研究的不足,本发明提出了一种基于函数模板的软件行为分析方法,通过建立软件行为模板实现对软件行为的有效评估。
如图1所示,本发明中所述基于函数模板的软件行为分析方法包括预处理、建模和检测,其中预处理是对软件源代码进行预处理操作;建模即对软件行为进行学习并建立软件行为模板;检测即对软件行为进行检测。
所述基于函数模板的软件行为分析方法包括以下步骤:
步骤1:预处理。
步骤1.1:在软件源代码的每两个函数间***自定义的分割函数,分割函数是为了模拟软件断点的运行而***源代码中。将每个分割函数作为一个标记,经过标记的软件源代码称为已标记源代码,相应的软件称为已标记软件。
步骤2:建模,所述建模是通过对所述预处理中获得的已标记源代码及已标记软件进行分析,获得软件源代码函数转移图和软件API最小功能块转移图,并以此作为该待测软件的软件行为模板。
步骤2.1:首先对所述建模中涉及的概念进行定义:
节点:本方法以函数为单位进行研究,节点的定义包括函数、函数所属的源文件名和同一函数的连续运行次数。本方法所述节点定义为:
[node]:function[file]:xxx.cpp{[constitute]:n}
其中,[node]为节点标记,表示以下内容为节点信息。function为该节点的函数名。[file]为源代码文件标记,表示冒号后xxx.cpp为函数所属源代码文件名。{…}内为节点可选内容,当函数运行次数>1时,标记[constitute]:n,n为函数运行连续运行次数。
跳转:在运行过程中,从一个节点执行到下一个节点的过程,称为跳转。一个节点可以跳转到多个节点。
步骤2.2:获得软件源代码函数转移图。
基于所述定义,根据所述已标记源代码中函数调用关系,生成软件源代码函数转移图。在生成的软件源代码函数转移图中,将已标记软件源代码中第一个被调用函数视为首个运行函数,该函数所在节点称为入口。在生成的软件源代码函数转移图中,存在无跳转的节点,称为出口。出口表示软件程序或一组函数的结束。
步骤2.3:获得软件API最小功能块转移图。
运行所述已标记软件,应用API(Application Programming Interface,应用程序编程接口)调用监视工具对所调用的API序列进行监控,得到已标记软件的API序列。因为位于函数间的分割函数在运行过程中所调用的API序列相同,所以称分割函数运行所调用API序列为分割序列。分割序列作为划分标记,用于将标记并分割所述已标记软件运行所调用的API序列。被分割序列分割形成的API序列片段,称为API功能块。将已标记软件调用的API序列根据序列的上下文内容用API功能块表示,称为已标记软件API功能块转移图。
由于计算机运行过程中,代码运行环境、加载状态、运行状态都有所改变,多次运行所述已标记软件,获取每一组API功能块,当运行结果满足以下条件,停止运行已标记软件:
已标记软件API功能块转移图涵盖的API序列/本次运行中获取的API序列x100%≥95%
对比分析获取的每一组API功能块,取最大公共部分作为该组API最小功能块,形成软件API最小功能块转移图。
将所述建模生成的软件源代码函数转移图和软件API最小功能块转移图作为待测软件的软件行为模板。
步骤3:检测。
步骤3.1:对可能受到攻击或篡改的待测软件源代码进行步骤1中所述预处理和建模处理,从而获得待测软件源代码函数转移图和待测软件API最小功能块转移图。
步骤3.2:将待测软件源代码函数转移图与步骤2中所述建模生成的软件源代码函数转移图进行比对,检验节点、跳转、入口、出口是否一致,当待测软件源代码函数转移图出现软件源代码函数转移图中不存在的路径,或者待测软件源代码函数转移图的路径文件内容与软件源代码函数转移图中不一致时,及时进行报警。
步骤3.3:待测软件源代码函数转移图检测无异常的基础上,将待测软件API最小功能块转移图与软件API最小功能块转移图进行比对,如果待测软件API最小功能块转移图与软件API最小功能块转移图不匹配,则及时进行报警。
本发明通过对软件源代码进行分析,获得软件行为模板并以此作为待测软件的行为规则。将待测软件真实运行时获得的待测软件源代码函数转移图和待测软件API最小功能块转移图与生成的软件行为模板进行比对,判断软件行为是否异常。本发明方法简单易行,可有效的实现软件行为检测。
实施例1
如图2所示,以对RSS阅读器软件进行检测为例。
步骤1:预处理。
步骤1.1:在RSS阅读器软件源代码的每两个函数间***分割函数int3,分割函数int3模拟软件断点的运行,将每个分割函数int3作为一个标记,经过标记的RSS阅读器软件源代码称为已标记RSS阅读器源代码,相应的软件称为已标记RSS阅读器软件(见图2(a))。
步骤2:建模。
步骤2.1:首先对所述建模涉及的概念进行定义:
节点:本方法以已标记RSS阅读器源代码中函数为单位进行分析,节点的定义包括已标记RSS阅读器源代码中函数、已标记RSS阅读器源代码中函数所属的源文件名和已标记RSS阅读器源代码中同一函数的连续运行次数。图2(a)中,CAgileReaderApp、InitInstance、CAgileReaderDoc……~CMainFramew为已标记RSS阅读器软件源代码中的函数。其中,函数CAgileReaderApp所属的源文件为AgileReader.cpp,且函数CAgileReaderApp多次被调用,用所述节点定义即表示为:
[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3
其中,node为函数所在节点,file为函数所在文件名。当函数运行次数>1时,标记[constitute]:n,n为函数运行连续运行次数。CAgileReaderApp[file]:AgileReader.cpp为[node]:CAgileReaderApp[file]:AgileReader.cpp的子函数。AgileReader.cpp函数连续运行次数为3次,大于1次,则以constitute标记符号进行标记。[constitute]:3表示函数CAgileReaderApp在RSS阅读器软件运行中,该函数连续运行次数最大值为3。
跳转:在运行过程中,从一个节点执行到下一个节点的过程,称为跳转。一个节点可以跳转到多个节点。[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3可以跳转到[node]:InitInstance[file]:AgileReader.cpp和[node]:CAgileReaderDoc[file]:AgileReaderDoc.cpp。
步骤2.2:获得待测软件源代码函数转移图。
基于所述定义,根据所述已标记RSS阅读器源代码中函数调用关系,生成RSS阅读器软件源代码函数转移图。在生成的RSS阅读器软件源代码函数转移图中,将已标记RSS阅读器软件源代码中第一个被调用函数CAgileReaderApp视为首个运行函数,该函数所在的节点称为入口。节点[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3为软件RSS阅读器运行的起始点,则[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3为图的入口。
在生成的RSS阅读器软件源代码函数转移图中,存在无跳转的节点,称为出口。出口表示软件程序或一组函数的结束。[node]:~CMainFrame[file]:MainFrm.cpp为无跳转节点,则为图的出口。
步骤2.3:获得RSS阅读器软件API最小功能块转移图。
运行所述已标记RSS阅读器软件,应用API调用监视工具对所调用的API序列进行监控,得到已标记RSS阅读器软件的API序列。因为位于函数间的分割函数int3在运行过程中所调用的API序列相同,所以称分割函数int3运行所调用API序列为int3分割序列。已标记RSS阅读器软件运行所调用的API序列被int3分割序列分为已标记RSS阅读器软件API序列片段,称为RSS阅读器软件API功能块。将已标记RSS阅读器软件调用的API序列根据序列的上下文内容用已标记RSS阅读器软件API功能块表示,称为RSS阅读器软件API功能块转移图。如[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3运行时所调用的API序列为
SetBkColor SH
GetFolderPathW
GetWindowRgnBox
GetWindowDC
SetBkMode
由于计算机运行过程中,代码运行环境、加载状态、运行状态都有所改变,通过四次运行,运行结果满足待测RSS阅读器软件API功能块转移图涵盖的API序列/第四次待测软件运行中获取的API序列x100%≥95%,停止运行已标记RSS阅读器软件。
其中,[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3的对应API序列分别为:
将获取的API序列的最大公共部分,即RSS阅读器软件API功能块的最大公共部分,作为该组API最小功能块。本组公共序列为
SetBkColor SH
GetFolderPathW
GetWindowRgnBox
GetWindowDC
该部分为[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3对应的API最小功能转块,形成的RSS阅读器软件API最小功能块转移图如图2(b)所示。
将生成的RSS阅读器软件源代码函数转移图和RSS阅读器软件API最小功能块转移图作为待测RSS阅读器软件行为模板。
步骤3:检测。
步骤3.1:对可能受到攻击或篡改的待测RSS阅读器软件源代码进行步骤1中所述预处理和建模处理,从而获得待测RSS阅读器软件源代码函数转移图和待测RSS阅读器软件API最小功能块转移图。
步骤3.2:将待测RSS阅读器软件源代码函数转移图与RSS阅读器软件源代码函数转移图进行比对,检验节点、跳转、入口、出口是否一致。
如RSS阅读器软件源代码中[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3,为连续运行次数最大为3,
若待测RSS阅读器软件源代码中[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3小于等于3,则检测正常;大于3,则检测异常,及时进行报警。
如RSS阅读器软件源代码函数转移图的顺序为[node]:CAgileReaderApp[file]:AgileReader.cpp[constitute]:3跳转到[node]InitInstance[file]:AgileReader.cpp、[node]:CAgileReaderDoc[file]:AgileReaderDoc.cpp,
若待测RSS阅读器软件源代码函数转移图为CAgileReaderApp[file]:AgileReader.cpp[constitute]:3跳转到[node]InitInstance[file]:AgileReader.cpp、[node]:CAgileReaderDoc[file]:AgileReaderDoc.cpp,检测无异常,进入步骤3.3;
若待测RSS阅读器软件源代码函数转移图为CAgileReaderApp[file]:AgileReader.cpp[constitute]:3跳转到函数[node]InitInstance[file]:AgileReader.cpp、[node]:CAgileReaderDoc[file]:AgileReaderDoc.cpp、[node]OnMove[file]:MainFrm.cpp,则与RSS阅读器软件源代码函数转移图不匹配,及时进行报警。
步骤3.3:待测RSS阅读器软件源代码函数转移图检测无异常的基础上,将待测RSS阅读器软件API最小功能块转移图与RSS阅读器软件API最小功能块转移图进行比对。
以待测RSS阅读器软件API最小功能块转移图中的AgileReader.cpp函数所在节点检测为例说明:
如已标记RSS阅读器软件API最小功能块转移图中AgileReader.cpp函数所在节点对应的API最小功能块为
SetBkColor SH
GetFolderPathW
GetWindowRgnBox
GetWindowDC
若待测RSS阅读器软件的AgileReader.cpp函数所在节点对应的API最小功能块为
SetBkColor SH
GetFolderPathW
GetWindowRgnBox
GetWindowDC
则待测RSS阅读器软件与RSS阅读器软件的API最小功能块转移图相匹配,运行无异常;
若待测RSS阅读器软件的AgileReader.cpp函数所在节点对应的API最小功能块为
SetBkColor SH
GetFolderPathW
GetUpdateRect(0x001002fc,0x0018e2f0,FALSE)
BeginPaint(0x001002fc,0x0018e304)
GetWindowRgnBox
GetWindowDC
则待测RSS阅读器软件API最小功能块转移图中AgileReader.cpp函数所在节点对应的API最小功能块增加了
GetUpdateRect(0x001002fc,0x0018e2f0,FALSE)
BeginPaint(0x001002fc,0x0018e304)
则待测RSS阅读器软件与RSS阅读器软件API最小功能块转移图不匹配,软件运行异常,及时进行报警。