一种shellcode控制流扁平化混淆方法与流程

文档序号:24124026发布日期:2021-03-02 12:39阅读:335来源:国知局
一种shellcode控制流扁平化混淆方法与流程

[0001]
本发明属于计算机应用领域,具体涉及一种shellcode控制流扁平化混淆方法。


背景技术:

[0002]
计算机软件在社会生活的各行各业发挥着越来越重要的作用,然而由于软件本身无边际成本、盗版成本低收益大等特点,软件盗版现象十分猖獗。
[0003]
shellcode从广义上来讲,是一段经过编译并提取,可被cpu在某个线程上下文中直接完整执行的机器指令序列或代码片段,而不依赖于如可执行文件中的导入表来调用系统api。现代软件保护技术通常针对于可执行文件,但可执行文件加载的shellcode依旧会完整的暴露在内存中,并可能受到进一步的检测与分析。shellcode通常对于静态分析和内存检测不具有抵抗能力,在标识特征后易被检测和分析,因此对shellcode保护成为了一种应对措施。
[0004]
软件保护中常使用smc和花指令等简单的指令层面的混淆技术,但只能对分析人员造成少许干扰,效果不明显,可较为容易的被模式匹配、活跃分析等静态分析技术自动化清除。
[0005]
另一种常见混淆方案是在编译过程中,对生成的中间代码进行基本块的调整,但这种方案的局限性在于必须拥有程序源码,这对于shellcode来说不可行。
[0006]
而软件保护壳通常只针对可执行文件,它需要解析可执行文件格式,并处理可执行文件的各个section,甚至为可执行文件添加新section留下加壳特征,自然也不适用于shellcode。


技术实现要素:

[0007]
为克服上述存在的不足,本发明的发明人通过长期的探索尝试以及多次的实验和努力,不断改革与创新,提出一种shellcode控制流扁平化混淆方法,解决了shellcode保护空缺的问题,相较于简单的保护方法,混淆强度更大,方式更多样,使得分析成本大大增加。
[0008]
为实现上述目的本发明采用的技术方案是:一种shellcode控制流扁平化混淆方法,其特征在于包括以下步骤:s1.对输入的目标代码进行反汇编,构建整个指令序列;s2.将指令序列以函数为单元划分,再将每个函数以基本块为单元划分出控制流图;s3.为每个函数构建有限状态自动机,输出基本块数据,并根据算法来决定基本块的执行顺序,清洗基本块内容;s4.将基于有限状态自动机的混淆代码与执行器重新编译完成混淆过程。
[0009]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s2中划分基本块的基本规则是以跳转指令作为基本块结尾,跳转目标及其后指令作为基本块开头。
[0010]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s2
中划分基本块的调整方法是将内部调用的call指令划分为单独的基本块,对跨模块调用的call指令不做处理。
[0011]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:内部调用的call指令的上一条指令作为上一个基本块的结尾,下一条指令作为下一个基本块的开头。
[0012]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s3中算法是根据状态生成,状态生成算法是基于不透明谓词。
[0013]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s3中构建的有限状态自动机基于switch语句,将状态值作为case常量,基本块的调用作为case语句块。
[0014]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s3中清洗基本块内容的基本规则是,清除基本块末尾的跳转指令,将仅含一条call指令的基本块替换为对目标函数的直接调用。
[0015]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s4中执行器需要为混淆后代码的执行保存独立的上下文,与执行器本身的线程上下文隔开。
[0016]
本发明所述的一种shellcode控制流扁平化混淆方法,其进一步的优选方案是:s4中执行器需要在执行过程中动态解密基本块并分配可执行内存空间来调用基本块。
[0017]
本发明相比现有技术具有如下优点:1、混淆控制流本身,而非指令膨胀或运行时解密等干扰力度不强的手段,难以用简单的去混淆脚本还原,且动态调试十分困难;2、不需要在pe文件中添加新的代码段,而是生成具有运行基本块能力的自动机的源码;3、每个基本块以不同的随机密钥加密,在执行时由自动机获取密钥动态解密,保证静态文件的机密性;4、控制流图的每个基本块动态分配可执行内存区域来执行,且执行完成后都会销毁,防止多重特征码标识的内存检测;5、执行器需要切换上下文来执行经过混淆后的代码,保证cpu状态和用户栈等环境的隔离性。
附图说明
[0018]
为了更清楚地说明本发明实施方式的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
[0019]
图1是本发明操作流程原理框图。
[0020]
图2为本发明实施例中某一函数的控制流图。
[0021]
图3为本发明实施例中另一函数的控制流图。
[0022]
图4为图3中所示函数的控制流图混淆后的示意图。
具体实施方式
[0023]
为使本发明目的、技术方案和有点更加清晰,下面对本发明实施方式中的技术方案进行清楚、完整的描述。显然,所描述的实施方式是本发明的一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。因此,以下提供的本发明的实施方式的详细描述并非旨在限制要求保护的本发明范围,而是仅仅表示本发明的选定实施方式。
[0024]
实施例:如图1所示,本实施例提供了一种shellcode控制流扁平化混淆方法,其包括以下步骤:s1.对输入的目标代码shellcode进行反汇编,构建整个指令序列;具体而言,将shellcode的文件路径传入混淆器,读取文件数据后通过反汇编引擎进行反汇编操作获取指令序列,找到执行入口点。
[0025]
s2.将指令序列以函数为单元划分,再将每个函数以基本块为单元划分出控制流图; 具体而言,解析指令序列的基本指令call指令,将属于模块内部调用的指令操作数作为函数的起始地址,以此分割函数单元,例如call 401000h指令,就会将0x401000作为一个函数的起始位置;对每个函数包含的指令序列进行基本块划分,解析所有跳转指令,以其自身作为该基本块结束位置,而下一条指令或跳转目标作为新基本块起始位置。
[0026]
s3.为每个函数构建有限状态自动机,输出基本块数据,并根据状态生成算法来决定基本块的执行顺序,清洗基本块内容;具体而言,有限状态自动机的基本实现是使用永真循环的switch语句,每个基本块执行后都会计算出新的状态值作为case常量来维持基本块调用的顺序,直到一个控制流图执行完成。这意味着一个控制流图有多少基本块就有多少个case语句块来执行指令。
[0027]
s4.将基于有限状态自动机的混淆代码与执行器重新编译完成混淆过程。
[0028]
具体而言,混淆器执行完成后会生成各个函数的控制流图的自动机源码,将该源码与执行器部分共同编译就能执行被混淆控制流的shellcode。基本块的执行需要独立上下文环境,需要单独的全局位置存储cpu状态与执行栈。
[0029]
下面通过举例一个实际操作来对本发明的技术方案做进一步地说明。
[0030]
为演示使用,首先准备一小段shellcode,使用capstone引擎对其反汇编得如下指令序列,为了简化代码,将与控制流无关的指令用instructions...占位:0x1000:jmp
ꢀꢀꢀꢀꢀ
0x10350x1005: instructions...0x1016: cmp
ꢀꢀꢀ
byte ptr [ecxl, 00x1019: je
ꢀꢀꢀꢀꢀ
0x10250x101b: instructions...0x1023: jmp
ꢀꢀꢀꢀ
0x10160x1025: instructions...0xl02f: ret0x102b: instructions...
0x1035: instructions...0xl03f: je
ꢀꢀꢀꢀꢀ
0x10470x1041: instructions...0x1045: jne
ꢀꢀꢀꢀ
0x104c0x1047: instructions...0xl04a: jmp
ꢀꢀꢀꢀ
0xl0a20x104c: instructions...0x1066: call
ꢀꢀꢀ
0x10050x106b: instructions...0x1075: jmp
ꢀꢀꢀꢀ
0x10800x1077:instructions...0x1080:instructions...0x1086: jg
ꢀꢀꢀꢀꢀ
0xl09f0x1088: instructions...0xl09d: jmp
ꢀꢀꢀꢀ
0x10770xl09f: instructions...0xl0a2: instructions...0xl0a5:ret根据第一条指令jmp 0x1035可得入口点为0x1035,并作为一个函数起始位置,而0x1066处指令call 0x1005又指出0x1005处为另一函数起始位置,从函数起始位置向下可以找到最后一个ret指令作为函数结尾,因此这段指令序列被划分为了两个函数。根据基本块划分规则,可以得到两个控制流图,如图2、图3所示。
[0031]
为第二个控制流图生成自动机源码,与执行器重新编译后,控制流图会出现扁平化,如图4所示。
[0032]
由此可见根本无法从静态分析上获取任何关于基本块执行顺序的信息,有效的保护了原指令序列中的分支信息。且结合了动态解密和分配可执行空间的操作,基本块在其指令执行完毕后会释放其内存空间,使得在任何一个时刻内存中都不会存在完整的shellcode指令序列,能够抵御内存检测,并有效的防止分析人员通过转储内存来获取原始shellcode。
[0033]
本发明中所涉及的控制流图(control flow graph,cfg)是一个过程或函数的抽象表现,其中每个节点代表一个基本块。每个控制流图代表一个函数中各个基本块之间的相互关系、动态执行状态、各基本块对应的语句表等。控制流图展示了函数的内部细节,也是静态分析的基础。
[0034]
有限状态自动机(finite state machine,fsm)是一种抽象的计算模型,给定一个输入,就会从一个状态转换为另一个状态。在本发明中,自动机的输入为上一个基本块的返回结果,它会根据该结果来判断接下来的基本块调用顺序。
[0035]
自修改代码( self-modifying code, smc ):程序运行期间修改或产生代码的一种机制。自修改保护机制是有效抵御静态逆向分析的代码保护技术之一,广泛应用于软件保护和恶意代码等领域。计算机病毒等恶意代码的作者通常采用该技术动态修改内存中的
指令来达到对代码加密或变形的目的,从而躲过杀毒软件的检测与查杀,或者增加恶意代码逆向分析人员对代码进行分析的难度。
[0036]
以上仅是本发明的优选实施方式,应当指出的是,上述优选实施方式不应视为对本发明的限制,本发明的保护范围应当以权利要求所限定的范围为准。对于本技术领域的普通技术人员来说,在不脱离本发明的精神和范围内,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1