基于行为和代码长度的恶意样本逆向任务分配方法及系统

文档序号:25169465发布日期:2021-05-25 14:38阅读:60来源:国知局
基于行为和代码长度的恶意样本逆向任务分配方法及系统

本发明属于恶意代码检测与分析领域,具体涉及一种基于行为和代码长度的恶意样本逆向任务分配方法及系统。



背景技术:

近年来,恶意代码日益增加,给国家、社会、个人带来了不同程度的危害,如分布式拒绝服务攻击(ddos)、基于僵尸网络(botnet)的攻击、勒索病毒(ransomware)、高级可持续威胁(advancedpersistentthreat)攻击、利用远程控制木马的信息窃取等。根据av-test在2020年5月公布的数据,全网恶意代码数量规模逐年增长,在2020年已经达到的10.5519亿。目前网络安全形势严峻,网络环境的安全与健康需要依靠所有安全研究人员来维护。当前恶意代码分析形势主要是依赖人工提取特征码,相关资料显示,平均一名熟练的分析人员一天只能分析12.8个样本,供需矛盾严重。再加上近年攻击者为了躲避检测,采用了一系列对抗溯源的措施,恶意代码的质量与复杂程度大幅提高,一定程度上加大了恶意代码逆向分析的难度,给恶意样本逆向分析工作带来严峻的考验。

为了提高恶意代码的逆向分析效率,在同一个逆向分析组织中,通常会有多名分析人员对同一个恶意样本进行逆向分析。在协作的过程中,研究人员可以发挥其各自的长处,并且不用再独自一人面对庞大的恶意代码。通过多人协作进行样本分析涉及到对恶意样本逆向任务的分配问题。掌握好恶意样本的内部结构网络,能够在不破坏原有代码结构框架的基础上进行恶意样本逆向任务的分配和管理,一定程度上保证了恶意样本逆向任务的局部完整性,提高恶意样本的管理以及分配的科学性和合理性,有利于后续逆向分析结果的快速整合。如果管理者想要简化后续整合逆向分析结果的工作,在逆向任务分配的前期工作中就需要根据恶意样本局部功能之间的差别来进行分配管理。虽然在进行恶意样本逆向之前,逆向研究人员可以通过ida、ghidra等工具进行分析,了解恶意样本的总体功能。但是恶意样本内部和函数调用关系网结构错综复杂,单纯通过人工很难快速地整理出其内部结构网络,导致在前期逆向任务分配管理环节上消耗太多时间和精力。



技术实现要素:

本发明针对逆向分析恶意软件过程中逆向任务低效分发的问题,提出一种基于行为和代码长度的恶意样本逆向任务分配方法及系统。

本发明的技术方案为一种基于行为和代码长度的恶意样本逆向任务分配方法,包括函数调用图的获取过程和逆向任务分配过程,

所述函数调用图的获取,包括以下步骤,

步骤1,获取引入的动态链接库dll的数量,根据dll引入次序依次遍历每一个dll文件并获取dll文件的名称;对于每一个引入的dll文件,获取从该dll文件中引入的api函数列表;对于每个从dll文件引入的api函数,获取相关的交叉引用函数列表,得到api函数的所有调用者;将函数调用关系写入有向图中;记录函数关系的同时,记录下函数对应的代码长度,系统函数代码长度记为0;

步骤2,获取每一个代码段的地址,在每一个代码段中遍历改代码段使用到的所有函数的地址;对于每一个使用到的函数,获取相应交叉引用函数列表;获取调用与被调用双方的函数名称后,将函数调用关系写入有向图中,记录函数关系的同时,记录下函数对应的代码长度,所有函数遍历完成后得到的有向图是包含代码长度信息的函数调用图;

所述逆向任务分配过程,根据函数调用图进行逆向任务分配,包括以下步骤,

步骤3,读取函数调用图中的代码长度信息,计算并记录用户自定义函数代码长度的平均值和用户自定义函数集合,准备进行函数功能模块分割;

步骤4,根据不同恶意行为具有的特征api函数进行预分配,对于每一类恶意行为特征api函数列表中的函数,从步骤2中的函数调用图中获取与函数相关的路径;从得到的路径中提取所有函数调用关系,保存到路径集合中;从得到的路径中提取所有函数节点,保存到预分配函数节点集合中,并为每个节点添加用于标记函数功能的属性;将每一类特征api函数对应的预分配函数集合作为一项任务添加到预分配任务列表中,任务列表中每一项任务包含该任务的函数节点信息和代码总长度;

步骤5,将未进行预分配的节点与已进行预分配的节点分开,遍历步骤4所得函数节点集合列表,将函数节点集合列表中存在的节点从步骤3所得用户自定义函数集合中删除,最终得到未进行预分配的函数节点集合;

步骤6,按照函数代码长度进行再分配,直至所有任务列表都符合代码总长度小于代码长度平均值减去阈值的条件;

步骤7,处理未完成分配的函数节点,将剩余仍未被分配的函数节点添加到一个新的任务集合中,并计算该任务集合中所有函数的代码总长度;合并步骤6与步骤7得到任务列表,作为最终的逆向任务分配结果。

而且,步骤4中,不同恶意行为具有的不同特征api函数的类别包括文件操作、服务管理、网络连接、鼠标监控、socket连接、命令执行、加解密和进程管理注册表操作。

而且,步骤4的实现过程如下,

(1)预先定义9类特征api函数列表functions_of_interest[9],每次遍历一类特征api函数;

(2)对于每一类特征api函数,判断其中的特征api函数func是否存在于函数调用图g中,不存在则继续遍历;

(3)遍历函数调用图g的所有节点作为起始节点src,调用函数all_simple_paths(g,src,func),列出起始节点src到特征api函数func的全部路径path;

(4)从路径列表path中获取函数节点信息,添加到函数节点集合nodes中,同时记录该函数集合的代码总长度length;

(5)每一类特征api函数遍历完成之后,将得到的函数节点集合nodes和对应的长度信息length,保存至预分配任务列表autoassign_list中。

而且,步骤6中实现方式如下,

首先从预分配任务列表中读取函数节点列表和代码总长度;如果预分配任务列表为空,则新建一个任务列表,不为空则读取预分配任务列表中的函数节点信息和代码总长度;如果单项任务的代码总长度小于步骤3得到的代码长度平均值减去阈值,从未分配函数节点集合中查找在函数调用图中与预分配任务列表中函数节点至少有2处直接相连的函数节点,将该函数节点添加到该项任务的函数节点集合,将函数节点的代码长度累加至该项任务代码总长度,将该函数节点从未分配函数节点集合中删除;

重复以上过程,直至所有任务列表都符合代码总长度小于代码长度平均值减去阈值的条件。

另一方面,本发明提供一种基于行为和代码长度的恶意样本逆向任务分配系统,用于实现如上所述的一种基于行为和代码长度的恶意样本逆向任务分配方法。

而且,包括处理器和存储器,存储器用于存储程序指令,处理器用于调用存储器中的存储指令执行如上所述的一种基于行为和代码长度的恶意样本逆向任务分配方法。

而且,包括可读存储介质,所述可读存储介质上存储有计算机程序,所述计算机程序执行时,实现如上所述的一种基于行为和代码长度的恶意样本逆向任务分配方法。

本发明利用恶意代码的函数调用图得到程序内部的函数调用关系,根据不同恶意行为具有的不同特征api函数来将恶意软件划分为多个功能模块,根据各个功能模块需要进行分析的代码量差异来进行逆向分析任务的分配,减少了逆向任务分配过程中的人工干预,提高了任务分配流程的处理效率。

附图说明

图1是本发明实施例的函数调用图获取的流程图。

图2是本发明实施例根据函数调用图进行逆向任务分配的流程图。

具体实施方式

本发明针对逆向分析恶意软件过程中逆向任务低效分发管理的问题,提出一种基于行为和代码长度的恶意样本逆向任务分配方法及系统。本发明充分考虑了恶意代码内部不同功能模块之间的差异性,通过恶意代码的函数调用图,辅以不同功能模块之间的代码量差异来进行逆向任务的分配,具体功能分为两部分:一是函数调用图的获取,二是逆向任务分配,其中步骤1至步骤2对应函数调用图的获取,步骤3至步骤7对应根据函数调用图进行逆向任务分配。通过本发明能够准确地对恶意代码分析任务进行科学性分配,提升管理者在进行逆向分析任务分配的管理流程的效率。

实施例以wannacry勒索病毒对本发明的流程进行一个具体的阐述。实施例中使用到的函数涉及到networkx和idapython两类库函数,其中networkx用来处理图和网络问题,idapython是用来编写ida(interactivedisassembler)脚本的一类库函数。实施例提供的基于行为和代码长度的恶意样本逆向任务分配方法,具体实施流程如下:

步骤1:获取引入的动态链接库(dynamiclinklibrary,dll)的数量,根据dll引入次序依次遍历每一个dll文件并获取该dll文件的名称;对于每一个引入的dll文件,获取从该dll文件中引入的api函数列表;对于每个从dll文件引入的api函数,获取与其相关的交叉引用函数列表,即该api函数的所有调用者;将函数调用关系写入有向图中;记录函数关系的同时,记录下函数对应的代码长度,系统函数代码长度记为0;

实施例步骤1的具体实施方案为:

(1)新建一个networkx的有向图g。调用函数get_import_module_qty()获取引入的dll文件数量nimps。通过循环遍历0~nimps-1,每次循环处理一个引入的dll文件;

(2)对于第i个引入的dll文件,调用函数get_import_module_name(i)获取该dll文件的名称。调用函数enum_import_names(i)获取从第i个dll文件中引入的api函数;

(3)对于每一个引入的api函数,调用函数process_func()获取所有引用该api函数的函数地址,其中函数process_func()先通过函数get_first_cref_to()获取第一个交叉引用的位置,再根据返回结果决定是否调用函数get_next_cref_to()获取下一个交叉引用的位置,最后将结果保存在交叉引用函数列表call_from_1中;

(4)遍历交叉引用函数列表call_from_1,调用函数get_func_name()获取调用者和被调用者函数对应的函数名称;

(5)调用函数findfuncend()获取调用者函数的结束地址,通过计算调用者函数起始地址与结束地址之间的差值获得函数的代码长度。最后将调用者和被调用者函数调用关系以及相应的函数代码长度写入有向图g中。

循环处理完成后,进入步骤2。

步骤2:获取每一个代码段的地址,在每一个代码段中遍历改代码段使用到的所有函数的地址;对于每一个使用到的函数,获取其交叉引用函数列表,即该函数的所有调用者;获取调用与被调用双方的函数名称后,将函数调用关系写入有向图中,记录函数关系的同时,记录下函数对应的代码长度,所有函数遍历完成后得到的有向图即为包含代码长度信息的函数调用图;

实施例步骤2的具体实施方案为:

(1)调用函数segments()获取每一个段的首地址,通过segstart(ea),segend(ea)分别定位每个段的起始地址;

(2)调用函数functions(segstart(ea),segend(ea))获取每个段内调用的所有函数地址,并进行遍历;

(3)对于遍历过程中的每一个函数地址,按照实施例步骤1中(3)~(5)的方法进行相同处理,处理完成后得到最终的函数调用图g。

步骤3:读取函数调用图中的代码长度信息,计算并记录用户自定义函数代码长度的平均值和用户自定义函数集合,准备进行函数功能模块分割;

实施例步骤3的具体实施方案为:

(1)遍历函数调用图g的节点,将函数节点信息添加到用户自定义函数集合total中;

(2)读取每个函数节点的代码长度信息,对长度信息进行累计;

(3)累计值计算完成后,根据给定的人数计算逆向分析人员人均分析代码长度average。

步骤4:根据不同恶意行为具有的特征api函数进行预分配,对于每一类恶意行为特征api函数列表中的函数,从步骤2中的函数调用图中获取与该特征api函数相关的路径;从得到的路径中提取所有函数调用关系,保存到路径集合中;从得到的路径中提取所有函数节点,保存到预分配函数节点集合中,并为每个节点添加用于标记函数功能的属性;将每一类特征api函数对应的预分配函数集合作为一项任务添加到预分配任务列表中,任务列表中每一项任务包含该任务的函数节点信息和代码总长度;

实施例步骤4的具体实施方案为:

(1)预先定义9类特征api函数列表functions_of_interest[9],每次遍历一类特征api函数;

(2)对于每一类特征api函数,判断其中的特征api函数func是否存在于函数调用图g中,不存在则继续遍历;

(3)遍历函数调用图g的所有节点作为起始节点src,调用函数all_simple_paths(g,src,func),列出起始节点src到特征api函数func的全部路径path;

(4)从路径列表path中获取函数节点信息,添加到函数节点集合nodes中,同时记录该函数集合的代码总长度length;

(5)每一类特征api函数遍历完成之后,将得到的函数节点集合nodes和对应的长度信息length,保存至预分配任务列表autoassign_list中。

步骤4中提到的不同恶意行为具有的不同特征api函数包含但不限于以下类别:文件操作、服务管理、网络连接、鼠标监控、socket连接、命令执行、加解密、进程管理注册表操作等9类,每一类特征函数列表中分别包含但不限于以下函数:

(1)文件操作:createfile,createfilemapping,openfile,findfirstfile,findnextfile,getmodulefilename,getmodulehandle,loadlibraryexw,getstartupinfo,gettemppath,getwindowsdirectory,mapviewoffile,setfiletime,wow64disablewow64fsredirection;

(2)服务管理:startservicectrldispatchera,registerservicectrlhandlera,changeserviceconfig2a,setservicestatus,openscmanagera,createservicea,closeservicehandle,startservicea,openservicea;

(3)网络连接:internetopena,internetopen,internetopenurl,internetreadfile,internetwritefile,ftpputfile,internetopena,internetopenurla,internetclosehandle;

(4)鼠标监控:showcursor,getcursor,loadcursor,setcapture,getcapture,releasecapture;

(5)socket连接:closesocket,connect,htonl,htons,ioctlsocket,inet_addr,inet_ntoa,ntohl,recv,select,send,wsastartup,socket,accept,bind,connect,gethostbyname,gethostname,inet_addr;

(6)命令执行:shgetfolderpathw,shellexecuteexw;

(7)加解密:cryptacquirecontext,cryptreleasecontext,cryptenumproviders,cryptcreatehash,cryptgethashparam,cryptdestroyhash,crypthashdata,cryptderivekey,cryptgetprovparam,cryptsetkeyparam,cryptencrypt,cryptdecrypt,cryptdestroykey,cryptgenkey,cryptgetuserkey,cryptcontextaddref,cryptreleasecontext,cryptexportkey,cryptgenrandom,cryptacquirecontexta;

(8)进程管理:getthreadcontext,queueuserapc,virtualallocex,virtualprotectex;

(9)注册表操作:regclosekey,regcreatekey,regcreatekeyex,regdeletekey,regopenkey,regopenkeyex,regdeletevalue,regqueryvalue,regsetvalue,regsetvalueex,regqueryinfokey,regenumkey,regenumkeyex,regenumvalue,regloadkey,regreplacekey,regrestorekey,regsavekey,regconnectregistry,regnotifychangekeyvalue,regunloadkey。

步骤5:将未进行预分配的节点与已进行预分配的节点分开,遍历步骤4中的函数节点集合列表,将函数节点集合列表中存在的节点从步骤3得到的用户自定义函数集合中删除,最终得到未进行预分配的函数节点集合;

实施例步骤5的具体实施方案为:

(1)遍历步骤4生成的预分配任务列表autoassign_list,将预分配任务列表autoassign_list中存在的节点从用户自定义函数集合total中删除;

(2)预分配任务列表中每一项任务包含该任务的函数节点信息和代码总长度;

(3)遍历完成后用户自定义函数集合total中只剩下未进行预分配的函数节点。

步骤6:按照函数代码长度进行再分配,首先从预分配任务列表中读取函数节点列表和代码总长度;如果预分配任务列表为空,则新建一个任务列表,不为空则读取预分配任务列表中的函数节点信息和代码总长度;如果单项任务的代码总长度小于步骤3得到的代码长度平均值减去阈值,从未分配函数节点集合中查找在函数调用图中与预分配任务列表中函数节点至少有2处直接相连的函数节点,将该函数节点添加到该项任务的函数节点集合,将函数节点的代码长度累加至该项任务代码总长度,将该函数节点从未分配函数节点集合中删除,重复步骤6过程,直至所有任务列表都符合代码总长度小于代码长度平均值减去阈值的条件;

实施例步骤6的具体实施方案为:

(1)遍历步骤4生成的预分配任务列表autoassign_list,每次取出一项任务new_task;

(2)判断任务new_task的总代码长度length是否小于人均分析代码长度average,此处引入一个阈值threshold来设置average的上下浮动范围,当length<average-threshold时,从用户自定义函数集合total中取出一个函数节点加入到任务new_task中;

(3)从用户自定义函数集合total中取出一个新函数节点new_node,遍历任务new_task中所有的函数节点,记录新函数节点new_node与任务new_task中函数节点的调用关系,次数记为times,当times≥2时,即新函数节点new_node至少与任务new_task中的2个函数节点直接相连时,将新函数节点new_node添加到该任务new_task中;

(4)任务new_task再分配完成之后,将任务new_task添加到任务列表assign_list中。

步骤7:处理未完成分配的函数节点,将剩余仍未被分配的函数节点添加到一个新的任务集合中,并计算该任务集合中所有函数的代码总长度;合并步骤6与步骤7得到任务列表即为最终的逆向任务分配结果。

实施例步骤7的具体实施方案为:

(1)如果用户自定义函数集合total中仍存在未分配的函数节点,遍历用户自定义函数集合total中的每一个节点,将函数节点的添加到一项新任务中,同时累计每个函数节点的代码长度,记录到该项新任务中;

(2)遍历完成后将该任务也添加到任务列表assign_list中,得到的任务列表assign_list也就是最终需要生成的逆向任务分配方案。

具体实施时,本发明技术方案提出的方法可由本领域技术人员采用计算机软件技术实现自动运行流程,实现方法的系统装置例如存储本发明技术方案相应计算机程序的计算机可读存储介质以及包括运行相应计算机程序的计算机设备,也应当在本发明的保护范围内。

在一些可能的实施例中,提供一种基于行为和代码长度的恶意样本逆向任务分配系统,包括处理器和存储器,存储器用于存储程序指令,处理器用于调用存储器中的存储指令执行如上所述的一种基于行为和代码长度的恶意样本逆向任务分配方法。

在一些可能的实施例中,提供一种基于行为和代码长度的恶意样本逆向任务分配系统,包括可读存储介质,所述可读存储介质上存储有计算机程序,所述计算机程序执行时,实现如上所述的一种基于行为和代码长度的恶意样本逆向任务分配方法。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

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