CN105653905B - 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法 - Google Patents

一种基于api安全属性隐藏与攻击威胁监控的软件保护方法 Download PDF

Info

Publication number
CN105653905B
CN105653905B CN201510997890.2A CN201510997890A CN105653905B CN 105653905 B CN105653905 B CN 105653905B CN 201510997890 A CN201510997890 A CN 201510997890A CN 105653905 B CN105653905 B CN 105653905B
Authority
CN
China
Prior art keywords
api
address
instruction
node
dll
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN201510997890.2A
Other languages
English (en)
Other versions
CN105653905A (zh
Inventor
汤战勇
郝朝辉
房鼎益
龚晓庆
陈�峰
陈晓江
叶贵鑫
张洁
张恒
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Northwest University
Original Assignee
Northwest University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Northwest University filed Critical Northwest University
Priority to CN201510997890.2A priority Critical patent/CN105653905B/zh
Publication of CN105653905A publication Critical patent/CN105653905A/zh
Application granted granted Critical
Publication of CN105653905B publication Critical patent/CN105653905B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于API安全属性隐藏与攻击威胁监控的软件保护方法,该方法的步骤包括获取待保护文件的原始输入信息记录表、提取文件的执行控制流图、提取API调用点、提取API传参代码块、提取API返回值解密点、转储DLL,计算新的API入口地址、构造跳板函数块、在返回值解密点插入异常指令、构造节点,生成节点库、部署节点网,构造节点背景、构造返回值解密处理函数、PE文件重构。本方法从内、外两方面对软件进行保护,从攻击者逆向工程的角度出发,分析不同API边界信息在逆向分析过程中的作用,把需要隐藏的API安全属性和检测节点库置于程序新节中,并对新节入口进行了加密处理,进一步使得攻击者难以逆向分析保护后的PE文件。

Description

一种基于API安全属性隐藏与攻击威胁监控的软件保护方法
技术领域
本发明属于计算机软件安全领域,特别是一种针对Windows系统上目标二进制代码中API安全属性隐藏及结合攻击实例对软件所面临的潜在攻击威胁进行总结、分类,为这些攻击威胁设计有效的检测盒处理方式,加大攻击难度的软件保护方法。
背景技术
软件产业已经成为推动社会发展的主要动力,深入到人类生活的各个方面。根据马斯洛的需求层次理论,安全需求是仅次于生理需求的第二大需求。因此软件安全不仅是软件产业健康发展的基本需求,也是国民经济和国家安全的重要保障。由于破解技术和工具随手可得,软件攻击者可以利用反汇编器、调试器等代码分析工具窥探软件执行流程,篡改软件机密信息(如商业逻辑、知识产权、身份隐私等),破解关键算法。因此,当前的软件处于危机四伏的“白盒攻击环境”(White-Box Attack Context)。
软件的逆向分析技术是软件攻击者实施攻击过程的主要手段,软件自身的资源信息为攻击者提供切入点,攻击者不会对软件中的指令进行逐条分析,而是充分利用软件的内部状态信息来快速分析软件。API是软件中一类重要内部状态信息,常被用于分析软件行为或定位关键算法。Choi S指出API的执行序列和参数在一定程度上刻画出了软件的行为功能,并根据特定API的执行序列和参数可推测定位出软件中某些关键算法或数据的位置。Collberg提出需确保软件处在一个安全的环境中执行,提出建立黑白名单威胁库,在软件运行时对这些威胁进行监控;Gu提出软件白盒攻击环境下的14种安全模式,因此,对执行中的软件进行威胁检测,能够在一定程度上降低攻击成功率,提高软件安全性。
现有的API信息隐藏方法主要采用加壳工具对可执行文件进行保护,主要分为以下两类:①加密输入表:即对这些信息变形隐藏,使他们以密文形式呈现,以抵御攻击者的静态分析。②拦截输入地址表:在软件执行过程中,运行到API调用地址处时,才依次解密相应的密文信息,解析该符号地址。但该信息并不回填,当再次运行到该位置时,依然会执行密文解密、符号解析的代码,内存中不会出现完整的输入表明文内容。但上述方法仍存在不足:方法①在程序被载入运行后,若攻击者对输入表进行dump,就可得到程序所用的API名称等信息;方法②则不能抵御攻击者利用一些动态收集工具(如SoftSnoop)来获取API的其他信息。
现有的软件攻击威胁监控主要方法有:①张璇提出一种基于信息熵和攻击面的软件安全度量方法,利用各资源的信息熵来评估每种资源的安全威胁程度;②在软件中部署多个安全哨兵用于检测软件是否遭受篡改;③提高安全哨兵自身安全性,提出采用三线程和安全哨兵结合的方法。然而,目前在软件中处理的攻击威胁类型较单一,且威胁处理片段易被去除,同时对可被逆向分析利用的软件可用信息缺乏理论上的分析与较深入的研究案例。
发明内容
针对上述现有API信息隐藏与攻击威胁监控技术存在的缺陷和不足,本发明的目的在于,提出基于API信息隐藏与攻击威胁监控相结合的软件保护方法(SoftwareProtection Based on Combining Hiding API Information With Monitoring AttackThreats,HIMTASP),该方法从内、外两方面对软件进行保护,最终达到阻碍逆向分析、保护软件的目的。
为了实现上述任务,本发明采用以下技术方案:
(1)对于API安全属性隐藏。本发明拟从逆向分析的角度出发,首先,发掘不同API边界信息在攻击时的作用,将影响软件安全性的API边界信息定义为API安全属性;其次,提取API安全属性在软件中的呈现形式和主要获取途径;再次,针对不同API安全属性的呈现形式和获取途径,设计出隐藏这些API安全属性的软件保护方法,以增加攻击者获取它们的难度,进一步阻止对软件的逆向分析。
(2)执行过程中的攻击威胁分类。分析软件在执行过程中潜在的攻击威胁及其实施方式、作用对象、影响范围,提取每种威胁出现的特征,进一步得到每种威胁的有效检测方法。
(3)威胁监控节点的部署。首先,构造节点库。具体来说:①在(1)的基础上,为不同攻击威胁设计对应的检测代码片段(每个代码片段称为一个节点),形成检测节点;②设计用于判断检测结果的节点;③设计用于处理检测结果的响应节点;其次,根据节点自身的特点,将这些节点插入到软件的不同位置中。具体方案如下:
一种基于API安全属性隐藏与攻击威胁监控的软件保护方法,包括以下步骤:
步骤一,从待保护的PE文件的输入表中提取DLL文件信息,将DLL文件信息记录在一个输入信息记录表imp_tab中;
步骤二,提取PE文件的执行控制流图CFG;
步骤三,提取API调用点,得到调用点集合cs_set;
步骤四,提取API传参代码块;
步骤五,提取API返回值解密点;
步骤六,转储输入信息记录表imp_tab中的DLL文件信息至新的地址空间,计算转储后新的API入口地址;
步骤七,构造跳板函数块SpringBlock,以正确指导步骤六转储的API从旧地址到新地址的寻址;
步骤八,在返回值解密点插入异常指令,以保证保护后的PE文件在执行过程中,遇到异常指令时,程序转入预先设置的返回值解密处理函数中;
步骤九,构造能检测软件执行过程中所面临威胁的节点,生成节点库;首先,使用<威胁目的,实施方式,作用对象>的描述方式对这其中威胁进行细致划分和形式化表示;其次,提取威胁特征,考虑时可以结合三个因素:①威胁的实施方式,②威胁的作用对象,③威胁造成的影响;最后,根据特征构造检测此威胁的代码片,及检测结点;
步骤十,部署节点网,构造节点网通信的数据结构;
步骤十一,构造返回值解密处理函数;
步骤十二,对PE文件进行重构
计算保护方案各个部分的总大小为size,申请size大小的由Pbase指向的存储空间,将所述各个部分保存到该空间内;创建一个PE新节,将Pbase处的大小为size的内容复制到该新节里,保存修改后的PE文件。
进一步地,所述的步骤三的具体过程包括:
步骤S30,提取Intel X86指令集中调用API的指令格式模板template_call;
步骤S31,在PE文件结构中,找到代码区段的起始地址start和该区段的大小,计算代码区段的结束地址end;
步骤S32,反汇编start至end之间的二进制数据得到汇编指令,并按照汇编指令的地址顺序组成一个汇编指令序列,记为ins_list;
步骤S33,在汇编指令序列ins_list中,从start开始逐条取指令,依次判断所取指令所对应的二进制数据是否与template_call的指令格式匹配,如匹配,则将该条指令地址csi和该条指令insi存储到调用点集合cs_set中,否则,继续查看下一条指令,直至到达end处。
进一步地,所述的步骤四的具体过程包括:
步骤S40,根据步骤一得到的输入信息记录表imp_tab,逐一解析每一个API的参数个数和参数的数据类型;
步骤S41,从调用点集合cs_set中的第一条记录<cs1,ins1>开始,逐条确定每一个API调用指令insi所在的基本块bj
步骤S42,确定每一个API调用点地址csi所在基本块bj的直接前驱基本块集合presetj
步骤S43,对于cs_set中的每一条API调用指令,从它的csi开始,按照指令地址递减的顺序,查找传参功能的代码块,直至该API的所有参数传递完毕或对应查找的代码块集合遍历结束时退出,标记所找到的传参代码块为OPCi=<headi,taili>;按照同样的方法,处理其他的API调用指令,直至遍历完整个cs_set。
进一步地,所述的步骤五的具体过程包括:
步骤S50,确定每一个API调用点csi所在基本块bj的直接后继基本块集合nextsetj
步骤S51,对于cs_set中的每一条API调用指令,从它的csi开始,按照指令地址递增的顺序,查找首次使用返回值的指令,直至找到该指令或遍历完所述的直接后继基本块集合nextsetj结束时退出;记录返回值指令信息retinfoi=<csi,addri,ins_reti>;其中csi为当前API调用点,addri为该条指令的地址,ins_reti为该条指令。
进一步地,所述的步骤六的具体过程包括:
步骤S60,在PE文件中定位PEB结构,在其偏移0Ch找到Ldr所指向的三个链表,确定kernel32.dll的基址;搜索kernel32.dll的导出表,在导出表中找到LoadLibraryA、FreeLibraryA和GetProcAddress的地址,并记录这三个函数的地址偏移;
步骤S61,依次利用LoadLibraryA查询加载输入信息记录表imp_tab,根据其记录的信息查询到DLL地址后加载,并记录DLL基址base和大小size;
步骤S62,从第一个DLL开始,申请size大小的空间,空间起始地址记为newbasei,从base处复制size大小的内容到newbase;
步骤S63,使用FreeLibraryA释放掉该DLL;
步骤S64,在newbase处查找导出表,定位该DLL下每个API的相对虚拟地址RVA,计算新API的虚拟地址ep_new并保存,其中ep_new=newbase+RVA;
重复步骤S61-S64的操作,直至处理完所有DLL中的API;最后,申请空间Ep_New,将imp_tab中所有API的新地址ep_new保存在里面。
进一步地,所述的步骤七的具体过程包括:
步骤S70,对每一个传参代码块OPCi,申请空间NPC_Addr,并拷贝OPCi所指向的代码到NPC_Addr,在每一个NPC_Addr的末尾添加数据0xC3;
步骤S71,根据步骤一的结果,按顺序为每一个API申请空间SpringBlock。
本发明与现有技术相比具有以下技术特点:
1.本发明从攻击者逆向工程的角度出发,分析不同API边界信息在逆向分析过程中的作用,确定出API安全属性集,即本发明拟隐藏的对象;
2.提出一种描述攻击威胁的三元组表示方式<威胁目的,实施方式,作用对象>,分析每种威胁的特点并设计对应的检测方法,对软件在执行过程中面临的攻击威胁进行形式化描述;
3.本发明创新性的把需要隐藏的API安全属性和检测节点库置于程序新节中,并对新节入口进行了加密处理,进一步使得攻击者难以逆向分析保护后的PE文件。
附图说明
图1是本发明方法的系统框架图;
图2是程序控制流图CFG;
图3是一个SpringBlock的逻辑示意图;
图4是返回值解密函数的逻辑示意图;
图5是构造返回值解密处理函数流程图;
图6是节点调度函数执行流程图;
图7是节点Context结构图。
具体实施方式
遵从上述技术方案,如图所示,一种基于API安全属性隐藏与攻击威胁监控的软件保护方法,包括以下步骤:
步骤一,从待保护PE文件输入表中提取DLL文件信息,将DLL文件信息记录在一个输入信息记录表imp_tab中;
上述的PE文件为Windows平台下可移植、可执行的程序文件。根据PE文件的结构特征,找到输入表的存储位置,依次提取输入表中每一个DLL名字及其FirstThunk值,同时统计该DLL中的API的个数,记录每一个API名字的长度、名字(或序号);每一个DLL的信息采用如下DLL输入信息记录表imp_tab的格式来记录:
表1 DLL信息记录表
FirstThunki DLLi名字长度 API个数 API1名字长度 API1名字 API2名字长度 API2名字 ...
步骤二,提取PE文件的执行控制流图CFG,将CFG中的每一个节点记为一个基本块;
采用可执行文件代码分析工具提取程序的执行控制流图CFG,如图2所示,CFG中的每一个节点,即一个基本块记为bi(bi=<b_addr,e_addr>),即CFG={bi|i∈N};本实施例中,采用工具IDA Pro获取CFG。
步骤三,提取API调用点,得到调用点集合cs_set;
步骤S30,提取Intel X86指令集中调用API的指令格式模板template_call,一般为:“0xFF 0x15+双字数据”;该数据为存放API入口地址的虚拟地址;
步骤S31,在PE文件结构中,找到代码区段的起始地址start和该区段的大小size,计算代码区段的结束地址end(end=start+size);这里的代码区段是指.text段,即执行代码Section,通常命名为.text;
步骤S32,使用反汇编工具(如OllyDbg、IDA Pro)反汇编start至end之间的二进制数据得到汇编指令,并按照汇编指令的地址顺序组成一个汇编指令序列,记为ins_list;
步骤S33,在汇编指令序列ins_list中,从start开始逐条取指令,依次判断所取指令所对应的二进制数据是否与template_call的指令格式匹配,如匹配,则将该条指令地址csi和该条指令insi存储到调用点集合cs_set中,否则,继续查看下一条指令,直至到达end处;这里的匹配是指指令格式相似。
本方案中所用到的参数名词,均为本领域的常规参数名词,程序中参数、函数的命名规则也遵循本领域一般命名规则。
步骤四,提取API传参代码块
步骤S40,根据步骤1中得到的DLL输入信息记录表imp_tab,对照MSDN(MicrosoftDeveloper Network,涵盖了微软劝导可开发产品线的技术开发文档和科技文档<包括源代码>)逐一解析每一个API的参数个数和参数的数据类型;
步骤S41,调用点集合cs_set中存放的是从代码区段提取得到的所有API指令,在本步骤中,从调用点集合cs_set中的第一条记录<cs1,ins1>开始,逐条确定每一个API调用指令insi所在的基本块bj;<csi,insi>所在基本块bj满足条件:bj.b_addr≤csi≤bj.e_addr(调用指令insi所在的地址csi满足在基本块bj的开始地址<bj.begin_address>和结束地址<bj.end_address>之间);
步骤S42,确定每一个API调用点地址csi所在基本块bj的直接前驱基本块集合presetj,具体步骤如下:
步骤S42-1,定义节点间路径P(x,y)为程序的控制流图CFG中节点x到节点y之间所经过的节点集合;
步骤S42-2,定义节点入出度Degreebi为CFG中节点的入度与出度,记为Degreebi=<in,out>;
步骤S42-3,在程序控制流图CFG中,符合bj的直接前驱基本块集合presetj要求的节点需满足以下两个条件:
条件1:“→”指为了进一步解释,该条件的意思是bi的直接前驱基块一定在P(begin,target)上,其中,begin节点为CFG的入口节点、target节点为API调用点所在的节点;
条件2:即bi的入度不超过1且出度为1;
例如,在图2中当目标节点target=b3,入口节点begin=b0时,preset={b2}。
步骤S43,对于cs_set中的每一条API调用指令记录(从代码区段提取得到的所有API调用指令),从它的csi(i指顺序,这里指从第一个指令开始)开始,按照指令地址递减的顺序,查找传参功能的代码块,直至该API(是指API调用指令insi)的所有参数传递完毕或对应preseti遍历结束时退出,标记所找到的传参代码块为OPCi=<headi,taili>;其中,headi和taili表示该传参代码块的起、止地址。按照同样的方法,处理其他的API调用指令,直至遍历完整个cs_set。具体步骤如下:
步骤S43-1,提取具有压栈功能的指令模板template_push。一般地,在X86指令集中,代码中常见的具有压栈功能的指令如表2所示:
表2:压栈指令组合
步骤S43-2,逐条从cs_set中取记录<csi,insi>,根据步骤S41中的csi---bj之间的映射关系,查找bj所对应的presetj。置参数计数器初值为0,从csi开始依次按照csi→bj→presetj中指令地址递减的顺序,逐条读取指令,并判断所读入指令是否符合template_push。若是,则将参数计数器加1并记录该条指令的地址;反之,继续处理下一条指令。直至参数计数器等于该API参数数目或presetj遍历结束时退出。此时,得到传参代码块OPCi=<csi,headi,taili>。其中,headi为参数计数器为1时的指令地址,taili为参数计数器最后一次赋值时的指令地址。
同理,按照上述方法处理得到其他csi的传参代码块。
步骤五,提取API返回值解密点
步骤S50,确定每一个API调用点csi所在基本块bj的直接后继基本块集合nextsetj,具体步骤如下:
步骤S50-1,在控制流图CFG中,符合bj的直接后继基本块nextsetj要求的节点需满足以下两个条件:
条件1:(该条件是指bi的直接后继基本块一定在P(target,exit)上;其中,target节点为API调用点所在的节点、exit节点为CFG的出口节点;
条件2:即bi的入度为1且出度不超过1。
例如,在图2中当目标节点target=b3,出口节点begin=b6时,NextSet={b4,b5}。
步骤S51,对于cs_set中的每一条API调用指令记录,从它的csi开始,按照指令地址递增的顺序,查找首次使用返回值的指令,直至找到该指令或该nextset遍历结束时退出;记录返回值指令信息retinfoi=<csi,addri,ins_reti>;其中csi为当前API调用点,addri为该条指令的地址,ins_reti为该条指令;具体步骤如下:
步骤S51-1,确定在X86指令集中,用于保存返回值的特定寄存器reg,一般情况下,reg为EAX;
步骤S51-2,逐条从cs_set中取记录<csi,insi>,根据步骤S41中中的csi---bj之间的映射关系,查找bj所对应的nextsetj。从csi开始依次按照csi→bj→nextsetj中指令地址递增的顺序,逐条读取汇编指令,并判断所读入指令是否使用了寄存器reg,若是,记录当前cs、该条指令及其地址,即返回值指令信息retinfoi=<cs,addr,ins_ret>;反之,继续处理下一条指令,直至找到retinfoi或nextsetj遍历结束时退出。
同理,按照上述方法处理得到其它csi的返回值解密点。
注:本方案中涉及的参数下标不影响该参数的释义,例如下标为i和j,当i和j不同时是指该参数的位置、顺序等不同。
步骤六,转储输入信息记录表imp_tab中的DLL文件信息至新的地址空间,计算转储后新的API入口地址;
步骤S60,在PE文件中定位PEB(Process Environment Block)结构,在其偏移0Ch找到Ldr所指向的三个链表,确定kernel32.dll的基址;搜索kernel32.dll的导出表,在导出表中找到LoadLibraryA、FreeLibraryA和GetProcAddress的地址,并记录这三个函数的地址偏移;
步骤S61,按照步骤一中的DLL遍历顺序,依次利用LoadLibraryA查询加载输入信息记录表imp_tab,根据其记录的信息查询到DLL地址后加载,并记录DLL基址base和大小size;
步骤S62,从第一个DLL开始,申请size大小的空间,空间起始地址记为newbasei,从base处复制size大小的内容到newbase;
步骤S63,使用FreeLibraryA释放掉该DLL;
步骤S64,在newbase处查找导出表,定位该DLL下每个API的相对虚拟地址RVA,计算新API的虚拟地址ep_new并保存,其中ep_new=newbase+RVA;
重复该步骤S61-S65的操作,直至处理完所有DLL中的API;最后,申请空间Ep_New,将imp_tab中所有API的新地址ep_new按照步骤一的遍历顺序保存在里面。
步骤七,构造跳板函数块SpringBlock,以正确指导步骤六转储的API从旧地址到新地址的寻址;
步骤S70,对每一个传参代码块OPCi,申请空间NPC_Addr,并拷贝OPCi所指向的代码到NPC_Addr,在每一个NPC_Addr的末尾添加数据0xC3,即X86汇编的ret指令;
步骤S71,根据步骤一的结果,按顺序为每一个API申请空间SpringBlock。任意SpringBlocki的逻辑结构如图3所示,依次为确定当前csi、转入csj所对应的NPC_Addri中、执行API的新入口点epni、获取系统当前时间作为加密密钥keyi、保存加密密钥keyi、用异或算法加密返回值reg。构造一个SpringBlocki的具体步骤如下:
步骤S71-1,获取栈顶数据得到API调用点csi处的下一条指令地址next_addr,计算当前的API调用点csi,其中csi=next_addr-6;
步骤S71-2,根据程序中存在的如下关系(Sum(obj)指对象obj在程序中的数目):
关系1:Sum(SpringBlock)=Sum(store_addr)=Sum(ep_new)≤Sum(cs)
关系2:Sum(cs)=Sum(OPC)=Sum(NPC_Addr)=Sum(retinfo)
结合步骤四的结果确定出所需的传参代码块OPCj=<csj,headj,tailj>,进而确定NPC_Addrj。通过汇编指令call dword ptr[NPC_Addrj]来执行传参代码块;
步骤S71-3,SpringBlocki对应着EP_New空间中的第i个数据,通过汇编指令calldword ptr[Ep_New+i*4]来转入到对应的新API入口地址;
步骤S71-4,获取系统当前时间作为加密密钥keyj。记录当前csj和keyj,即keyinfoj=<csj,keyj>;
步骤S71-5,用异或运算作用于寄存器EAX和keyj,得到SpringBlocki
步骤八,在返回值解密点插入异常指令,以保证保护后的PE文件在执行过程中,遇到异常指令时,程序转入预先设置的返回值解密处理函数中;
每个API函数在调用完之后需要返回到原程序调用点处以继续执行程序,那么对函数返回处进行加密后需要正确解密才能使程序正常执行。依次读取retinfoj,在retinfoj.Addr处插入异常指令trapinsj以替换原来的指令。
步骤九,构造能检测软件执行过程中所面临威胁的节点,生成节点库;
在大量攻击实验的基础上,软件在执行过程中经常面临的威胁有:虚拟执行环境威胁,调试威胁,加速威胁,注入威胁,DLL劫持威胁,Hook威胁,篡改威胁这七种。对同一种威胁目的,有多种不同的实现方式。因此本步骤按照三个步骤进行:首先,使用<威胁目的,实施方式,作用对象>的描述方式对这其中威胁进行细致划分和形式化表示;其次,提取威胁特征,考虑时可以结合三个因素:①威胁的实施方式,②威胁的作用对象,③威胁造成的影响;最后,根据特征构造检测此威胁的代码片,及检测结点。
步骤S90,以远程线程注入威胁为例,构造威胁检测节点具体步骤如下:
步骤S90-1,形式化表述为<注入,远程线程,目标进程>;
步骤S90-2,提取特征:LoadLibraryA()和已注入到内存中的可疑模块(通常装载器给目标进程所创建的远程线程函数为LoadLibraryA(),且该函数参数为待注入的第三方模块的名字,若注入成功目标进程空间会出现注入模块);
步骤S90-3,节点功能为监控LoadLibraryA()函数调用及其参数是否异常,扫描进程内是否有可疑模块;
其中,威胁检测节点会将检测情况写入节点Context的对应字段,若检测到,则该字段设为1,否则为0。
步骤S91,节点库的生成,需要针对Ring0成和Ring3层的特性进行设置。节点库的主要构成为ring3级节点,ring3级节点的设计步骤如下:
步骤S91-1,保存各寄存器当前数据;
步骤S91-2,解析节点所需符号地址;
步骤S91-3,执行核心逻辑;
步骤S91-4,恢复各寄存器内容;
步骤S92,检测结果判断节点为检测节点和响应节点间的桥梁,通过读取节点Context对应字段的值来确定是否调用响应节点。最终得到的节点库组成如图4所示。
步骤十,部署节点网,构造节点网通信的数据结构;
步骤S100,节点网的部署过程包括:
步骤S100-1,取出软件第一个代码片(基本块)block;
步骤S100-2,在block中插入该ring3节点;
步骤S100-3,取出下一个代码片block,重复S100-1和S100-2,直至遍历完所有的代码片。
针对ring0级与ring3级节点,采用不同方案,最终,节点Context是用于节点网通信的数据结构,如图7所示。
步骤S101,对于ring0层具体保护步骤为:
步骤S101-1,将不同系统下的守护模块加密存储在被保护软件预先开辟的缓冲区中;
步骤S101-2,程序加载后,守护模块选择器依次读取当前系统版本并选择对应版本的守护模块,将其解密并释放到系统驱动目录内;
步骤S101-3,程序加载安装该驱动,程序执行结束时,卸载驱动并删除本次生成的驱动文件。
步骤S102,对于ring3层节点插入步骤,其中,节点调度函数执行流程如图6所示:
步骤S102-1,在代码片中按照指令地址递增的顺序,找出首个指令长度超过5Byte的指令,作为待插入位置;
步骤S102-2,记录<节点插入地址,该地址处指令,下一条指令地址>,并将其添加到节点插入位置信息记录链表中;
步骤S102-3,替换该处的指令为“CALL节点调度函数”;
步骤S103,节点Context以4Byte为基本单位,共60Byte,如图7所示。
步骤十一,构造返回值解密处理函数
如图5所示:
步骤S110,读取retinfoi,确定当前的csi
步骤S111,根据csi确定出当前的keyinfoi,获取取密钥keyi
步骤S112,EAX与keyi作异或运算;
步骤S113,执行返回值解密点原始的指令insi
按照S110-S113,依次处理所有的retinfoi,构造对应的返回值解密处理函数。
步骤十二,PE文件重构
步骤S120,计算保护方案各个部分:节点Context、节点地址表、节点库、输入表导入信息记录数组、调用点结构体链表、传参代码块结构体链表、返回值结构体链表、返回值密钥结构体链表、NPC地址表和EPN地址表等所需的空间大小,考虑文件对齐等问题,记总大小为size;
步骤S121,申请size大小的由Pbase指向的存储空间,将上述各个部分保存到该空间内;
步骤S122,创建一个PE新节,将Pbase处的大小为size的内容复制到该新节里,并调整PE节表头里相关字段的内容;
步骤S123,保存修改后的PE文件。

Claims (6)

1.一种基于API安全属性隐藏与攻击威胁监控的软件保护方法,其特征在于,包括以下步骤:
步骤一,从待保护的PE文件的输入表中提取DLL文件信息,将DLL文件信息记录在一个输入信息记录表imp_tab中;
步骤二,提取PE文件的执行控制流图CFG;
步骤三,提取API调用点,得到调用点集合cs_set;
步骤四,提取API传参代码块;
步骤五,提取API返回值解密点;
步骤六,转储输入信息记录表imp_tab中的DLL文件信息至新的地址空间,计算转储后新的API入口地址;
步骤七,构造跳板函数块SpringBlock,以正确指导步骤六转储的API从旧地址到新地址的寻址;
步骤八,在返回值解密点插入异常指令,以保证保护后的PE文件在执行过程中,遇到异常指令时,程序转入预先设置的返回值解密处理函数中;
步骤九,构造能检测软件执行过程中所面临威胁的节点,生成节点库;首先,使用<威胁目的,实施方式,作用对象>的描述方式对这其中威胁进行细致划分和形式化表示;其次,提取威胁特征,考虑时可以结合三个因素:①威胁的实施方式,②威胁的作用对象,③威胁造成的影响;最后,根据特征构造检测此威胁的代码片,及检测结点;
步骤十,部署节点网,构造节点网通信的数据结构;
步骤十一,构造返回值解密处理函数;
步骤十二,对PE文件进行重构
计算保护方案各个部分的总大小为size,申请size大小的由Pbase指向的存储空间,将所述各个部分保存到该空间内;创建一个PE新节,将Pbase处的大小为size的内容复制到该新节里,保存修改后的PE文件。
2.如权利要求1所述的基于API安全属性隐藏与攻击威胁监控的软件保护方法,其特征在于,所述的步骤三的具体过程包括:
步骤S30,提取Intel X86指令集中调用API的指令格式模板template_call;
步骤S31,在PE文件结构中,找到代码区段的起始地址start和该区段的大小,计算代码区段的结束地址end;
步骤S32,反汇编start至end之间的二进制数据得到汇编指令,并按照汇编指令的地址顺序组成一个汇编指令序列,记为ins_list;
步骤S33,在汇编指令序列ins_list中,从start开始逐条取指令,依次判断所取指令所对应的二进制数据是否与template_call的指令格式匹配,如匹配,则将该条指令地址csi和该条指令insi存储到调用点集合cs_set中,其中i为自然数;否则,继续查看下一条指令,直至到达end处。
3.如权利要求2所述的基于API安全属性隐藏与攻击威胁监控的软件保护方法,其特征在于,所述的步骤四的具体过程包括:
步骤S40,根据步骤一得到的输入信息记录表imp_tab,逐一解析每一个API的参数个数和参数的数据类型;
步骤S41,从调用点集合cs_set中的第一条记录<cs1,ins1>开始,逐条确定每一个API调用指令insi所在的基本块bj
步骤S42,确定每一个API调用点地址csi所在基本块bj的直接前驱基本块集合presetj,j为自然数;
步骤S43,对于cs_set中的每一条API调用指令,从它的API调用点地址csi开始,按照指令地址递减的顺序,查找传参功能的代码块,直至该API的所有参数传递完毕或对应查找的代码块集合遍历结束时退出,标记所找到的传参代码块为OPCi=<headi,taili>;按照同样的方法,处理其他的API调用指令,直至遍历完整个cs_set。
4.如权利要求3所述的基于API安全属性隐藏与攻击威胁监控的软件保护方法,其特征在于,所述的步骤五的具体过程包括:
步骤S50,确定每一个API调用点csi所在基本块bj的直接后继基本块集合nextsetj
步骤S51,对于cs_set中的每一条API调用指令,从它的API调用点地址csi开始,按照指令地址递增的顺序,查找首次使用返回值的指令,直至找到该指令或遍历完所述的直接后继基本块集合nextsetj结束时退出;记录返回值指令信息retinfoi=<csi,addri,ins_reti>;其中csi为当前API调用点,addri为该条指令的地址,ins_reti为该条指令。
5.如权利要求4所述的基于API安全属性隐藏与攻击威胁监控的软件保护方法,其特征在于,所述的步骤六的具体过程包括:
步骤S60,在PE文件中定位PEB结构,在其偏移0Ch找到Ldr所指向的三个链表,确定kernel32.dll的基址;搜索kernel32.dll的导出表,在导出表中找到LoadLibraryA、FreeLibraryA和GetProcAddress的地址,并记录这三个函数的地址偏移;
步骤S61,依次利用LoadLibraryA查询加载输入信息记录表imp_tab,根据其记录的信息查询到DLL地址后加载,并记录DLL基址base和大小size;
步骤S62,从第一个DLL开始,申请size大小的空间,空间起始地址记为newbasei,从base处复制size大小的内容到newbase;
步骤S63,使用FreeLibraryA释放掉该DLL;
步骤S64,在newbase处查找导出表,定位该DLL下每个API的相对虚拟地址RVA,计算新API的虚拟地址ep_new并保存,其中ep_new=newbase+RVA;
重复步骤S61-S64的操作,直至处理完所有DLL中的API;最后,申请空间Ep_New,将输入信息记录表imp_tab中所有API的新地址ep_new保存在里面。
6.如权利要求5所述的基于API安全属性隐藏与攻击威胁监控的软件保护方法,其特征在于,所述的步骤七的具体过程包括:
步骤S70,对每一个传参代码块OPCi,申请空间NPC_Addr,并拷贝OPCi所指向的代码到NPC_Addr,在每一个NPC_Addr的末尾添加数据0xC3;
步骤S71,根据步骤一的结果,按顺序为每一个API申请空间SpringBlock。
CN201510997890.2A 2015-12-28 2015-12-28 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法 Expired - Fee Related CN105653905B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510997890.2A CN105653905B (zh) 2015-12-28 2015-12-28 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510997890.2A CN105653905B (zh) 2015-12-28 2015-12-28 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法

Publications (2)

Publication Number Publication Date
CN105653905A CN105653905A (zh) 2016-06-08
CN105653905B true CN105653905B (zh) 2018-07-24

Family

ID=56477048

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510997890.2A Expired - Fee Related CN105653905B (zh) 2015-12-28 2015-12-28 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法

Country Status (1)

Country Link
CN (1) CN105653905B (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106293088A (zh) * 2016-08-10 2017-01-04 山东建筑大学 脑机接口处理系统及其实现方法
CN106295342B (zh) * 2016-08-19 2019-02-01 北京金山安全管理系统技术有限公司 检测和清除可移植可执行文件中感染型病毒的方法及装置
CN106570399B (zh) * 2016-09-30 2019-07-12 西北大学 一种跨App组件间隐私泄露的检测方法
CN107315956B (zh) * 2017-06-12 2019-06-21 东莞理工学院 一种用于快速准确检测零日恶意软件的图论方法
CN110348205B (zh) * 2018-04-08 2022-04-22 华为技术有限公司 一种api拓扑隐藏方法、设备及系统
CN109298952A (zh) * 2018-08-27 2019-02-01 优视科技新加坡有限公司 应用程序编程接口的调用方法及其装置
CN113056737B (zh) * 2018-09-10 2024-08-16 阿韦瓦软件有限责任公司 安全调用约定系统和方法
CN111625296B (zh) * 2020-05-27 2023-03-14 重庆夏软科技有限公司 一种通过构建代码副本保护程序的方法
CN112784271B (zh) * 2021-01-21 2022-07-22 国网河南省电力公司电力科学研究院 一种电力工控系统的控制软件逆向分析方法
CN112966303A (zh) * 2021-03-10 2021-06-15 中国民航信息网络股份有限公司 数据的加解密方法及装置、电子设备、计算机存储介质
CN113672922B (zh) * 2021-08-17 2022-03-25 中国科学院软件研究所 基于risc-v与o-cfi机制的代码重用攻击防御方法及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101382984A (zh) * 2007-09-05 2009-03-11 江启煜 一种扫描检测广义未知病毒的方法
CN104462984A (zh) * 2014-11-27 2015-03-25 北京航空航天大学 基于逆向符号执行的应用权限泄漏检测方法及系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105164638B (zh) * 2013-04-23 2019-09-27 起元科技有限公司 控制由计算系统执行的任务

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101382984A (zh) * 2007-09-05 2009-03-11 江启煜 一种扫描检测广义未知病毒的方法
CN104462984A (zh) * 2014-11-27 2015-03-25 北京航空航天大学 基于逆向符号执行的应用权限泄漏检测方法及系统

Also Published As

Publication number Publication date
CN105653905A (zh) 2016-06-08

Similar Documents

Publication Publication Date Title
CN105653905B (zh) 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法
JP7053486B2 (ja) メタデータ処理のための技法
Arora et al. Hardware-assisted run-time monitoring for secure program execution on embedded processors
Banescu et al. A tutorial on software obfuscation
JP5458184B2 (ja) 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
Behera et al. Different obfuscation techniques for code protection
US8756434B2 (en) System and method for executing an encrypted binary from a memory pool
EP3746921B1 (en) Systems and methods for policy linking and/or loading for secure initialization
Tian et al. Software plagiarism detection with birthmarks based on dynamic key instruction sequences
Dalla Preda et al. Opaque predicates detection by abstract interpretation
Myles et al. Software watermarking through register allocation: Implementation, analysis, and attacks
Coppens et al. Feedback-driven binary code diversification
Yadegari et al. Bit-level taint analysis
Kim et al. Avengers, Assemble! survey of WebAssembly security solutions
Muntean et al. Analyzing control flow integrity with LLVM-CFI
Shan et al. Mobile agent protection with self-modifying code
Tsoupidi et al. Thwarting code-reuse and side-channel attacks in embedded systems
Brotzman et al. SpecSafe: detecting cache side channels in a speculative world
Li et al. Chosen-instruction attack against commercial code virtualization obfuscators
Péchoux et al. A categorical treatment of malicious behavioral obfuscation
Lanet et al. Memory forensics of a java card dump
Bruni et al. Code obfuscation against abstract model checking attacks
Hwang et al. Identifying Input-Dependent Jumps from Obfuscated Execution using Dynamic Data Flow Graphs
Lee et al. VODKA: Virtualization obfuscation using dynamic key approach
Kanzaki et al. A software protection method based on instruction camouflage

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20180724

Termination date: 20201228

CF01 Termination of patent right due to non-payment of annual fee