用于代码迷惑的方法及设备的制作方法

文档序号:6594502阅读:161来源:国知局

专利名称::用于代码迷惑的方法及设备的制作方法
技术领域
:本发明总地涉及软件,并且具体地涉及迷惑的(obfuscated)软件。
背景技术
:本部分旨在向读者介绍可能与在下文描述和/或请求保护的本发明的各个方面有关的技术的各个方面。相信该讨论有助于向读者提供背景信息以促进对本发明各个方面的更好的理解。相应地,应当理解的是要鉴于以上来阅读这些说明,而不是将其承认为现有技术。在“ObfuscationofExecutableCodetoImproveResistancetoStaticDisassembly,,中,第10届ACMConferenceofComputerandCommunicationsSecurity(CCS),第290-299页,2003年10月,Linn与Debray建议使用两个主要技术来扰乱(confuse)反汇编器。第一个技术是插入在正常运行时间执行期间不可抵达的地方插入的垃圾代码字节。第二种技术使用分支函数(branchfunction)以更改规则的例程调用。稍微简化一些,分支函数依赖函数的值(诸如关于调用指令的位置的散列(hash)值)来确定目标。在运行时间处,可容易地从堆栈顶部确定该位置。另外,分支函数也通过偏移量更改返回地址,这使得利用垃圾代码来填充介入空间(intervenespace)成为可能。在“Proceedingsofthe13thUSENIXSecuritySymposium”0004年8月9日-13日,美国加利福尼亚州圣地亚哥)中,Kruegel等人提出了一种解决方案以克服Lirm与Debray提出的迷惑方案。作者观察到Lirm与Debray的分支函数本质上是一种例程,其地址在作为输入参数而在堆栈顶部传递的调用指令之后。于是,分支函数不依赖于动态输入,由于其输出依赖于单一输入参数并且在二进制初始化的数据段中呈现一些静态查找表格,因此可以模拟分支函数。从而可计算偏移量,这使得反汇编器能够跳过垃圾代码并从下一有效指令继续。本领域技术人员将认识到,需要一种可对抗Kruegel等人提供的反汇编技术的迷惑方法。在US2006/0253687中,Jakubowski与Jacob提出了一种代码迷惑方法,除了别的以外,其中使用分支函数以决定跳转到什么指令。与Lirm与Debray的差别是,Jakubowski与Jacob的方法使用了采取动态输入的函数,这使得即便静态地对代码进行反汇编不是不可能的,但也是非常困难的。C.Collberg^Ai"DynamicPath-BasedSoftwareWatermarking"4(ACMSigplanNotices,ACMAssociationforComputingMachinery,美国,纽约州,纽约市,XP009084970)中提出了一种类似的解决方案。他们的解决方案采用了嵌套分支函数,其中由于“最内部的”函数使用返回地址的散列法以生成新的返回地址,所以该“最内部的”函数是动态的。作为现有技术,US2008/0148061提出了另一类似解决方案,其中,通过调用访问数据表格的入口的完整性函数(integrityfunction)代替了跳转,并且对入口的值进行散列以确定返回地址。本发明提供对于Lirm与Debray的方法的改进,该改进同时作为其它现有技术方法的替代物。如果可以使用多个方法(有利地,对其进行组合),则代码迷惑变得更加有效,本领域技术人员将认识到存在对这样一种可替换解决方案的需要。
发明内容在第一方面,本发明针对一种用于迷惑编译的计算机代码的方法,所述编译的计算机代码包括以多个基本块组织的计算机代码指令。利用具有至少一个参数的函数调用来替换第一基本块中的跳转指令,其中该函数调用在执行时依赖于该参数确定要执行的下一函数的地址。向编译的计算机代码插入向参数分配值的指令,所述参数的值使得由函数调用所确定的地址与被替换的跳转指令的目的地地址对应。将该分配指令插入至与第一基本块不同的并意图在第一基本块之前执行的第二基本块中的计算机代码中。在第一优选实施例中,跳转函数为无条件跳转函数。在第二优选实施例中,在之前的包括有条件跳转指令的第三基本块与第一基本块之间的执行路径中选择第二基本块。使用用于编译的计算机代码的控制流程图中的信息来选择第二基本块是有利的。在第二方面中,本发明针对用于迷惑编译的计算机代码的设备,所述编译的计算机代码包括以多个基本块组织的计算机代码指令。该设备包括替换单元,适配为以具有至少一个参数的函数调用来替换在第一基本块中的跳转指令,其中该执行的函数调用依赖于该参数来确定要执行的下一函数的地址;插入单元,适配为向编译的计算机代码中插入向该参数分配值的指令,该值使得由该函数调用所确定的地址与被替换的跳转指令的目的地地址对应;以及发现单元,适配为发现该插入单元向其中插入分配指令的、与第一基本块不同的并且意图在第一基本块之前执行的第二基本块。在第一优选实施例中,该替换单元被适配为替换无条件的跳转函数。在第二优选实施例中,该发现单元被适配为发现之前的包括有条件跳转指令的第三基本块与第一基本块之间的执行路径中的第二基本块。该发现单元适配为使用用于编译的计算机代码的控制流程图中的信息来发现第二基本块是有利的。在第三优选实施例中,在至少一个处理器中实施该替换单元、插入单元、以及发现单元。现在将通过非限制性示例的方式,参照附图来描述本发明的优选特征,其中,图1图示了现有技术的编译软件的处理;图2图示了根据现有技术的迷惑后的代码;图3图示了根据本发明优选实施例的迷惑后的代码;图4图示了根据本发明优选实施例的代码迷惑的方法;以及图5图示了根据本发明优选实施例的用于代码迷惑的设备。在附图中,所表示的块仅仅是功能性的实体,其不一定与物理上单独的实体对应。这些功能性的实体可实施为硬件、软件、或软件与硬件的组合;再者,可在一个或多个集成电路中实施它们。具体实施例方式图1图示了现有技术编译软件的处理。该例程的一些基本知识将有助于对下文描述的理解。编译经由大量中间步骤将源代码Iio翻译成机器代码150,在此期间生成了语法树120,控制流程图130以及汇编代码140。本发明主要构思在于,使用比Lirm与Debray所使用的那些更加安全的分支函数调用。如已经讨论的,可以相当容易地模拟他们的分支函数。尽管Jakubowski与Jacob通过使分支函数动态化而使得分支函数安全,但仍然可以计算出分支函数。本解决方案以不同的方式使得分支函数安全,如下文将要详细描述的。为了易于认识到本发明的解决方案,首先在图2中图示现有技术迷惑方案。遵循控制流程图,程序代码200被划分为大量基本块210-270。基本块可以被认为是一组要被顺序执行的指令;同样地,其利用至另一基本块的跳转函数而结束。例如,基本块210包括三条指令11,12,以及有条件跳转“Ifcondjump”。执行全部三条指令,并且依赖于该有条件跳转,然后以在基本块220中的指令14或在基本块250中的指令117而继续该执行。存在通过所图示的代码部分的三种可能的执行路径(该数字指代基本块)-A:210-220-240-260-B:210-220-230-260-C:210-250-270。基本块260与270的每一个包括跳转函数(JumpOl与Jump@2),以及部分代码指令i25与i28(由小写字母i:s指示)。尽管可以使用一个或多个完整的指令(entireinstruction)(除了部分代码指令之外或者替代部分代码指令),但有利地是使用部分指令,这是因为该部分指令将反汇编器欺骗为将至少部分之后“真正的”指令曲解为函数参数。可根据Lirm与Debray的解决方案(即,依赖于堆栈上的地址)或Jakubowski与Jacob的解决方案(即,在其值在运行时间确定并且难以进行逆向工程的复杂的函数)中的任一个来实施这两个跳转函数。图3图示根据本发明优选实施例的迷惑方案。除了将要在下文中描述的一些更改之外,程序代码300与图2中的程序代码200相同。仍然存在七个基本块310-370,并且基本块310与320分别与基本块210与220相同。然而,在基本块360与370中,已经利用对以参数a作为输入的函数进行调用来取代图2的跳转函数-Jumplgl与Jump@2。在正确的参数的情况下,该函数调用确定在程序流程中要执行的下一个指令的地址;换言之,在正确的参数值的情况下,该函数调用如同所替换的跳转函数那样工作,但是在不正确的参数值的情况下,则不能。优选地,在这一点获得正确的参数值。本发明突出之处在于使用控制流程图以使得参数a的计算安全。这是通过在与包括函数调用的基本块不同的基本块中插入向参数a分配某个值的指令来完成的。例如,执行路径A,(310-320-340-360)在基本块;340中向参数a分配值(a=y),基本块340与包括函数调用的基本块360不同。类似地,执行路径B,(310-320-330-360)在基本块330(也与基本块360不同)中分配参数值(a=y),而执行路径C’(310-350-370)在与具有函数调用的基本块370不同的基本块350中分配参数值(a=ζ)。本领域技术人员将注意到,对于位于基本块360中的跳转的执行路径(A’与B’),参数值是相同的(a=y)。这是优选的,但是所述值也可能是不同的。本领域技术人员将认识到,可能已经在对于两个执行路径是公共的但是与执行路径C’不同的基本块320中为这两个执行路径分配了参数值。本领域技术人员将认识到对于分配参数值以及对于函数调用可能有大量的变型。首先,可能具有多个不同的函数调用,其中每一个具有不同的参数。其次,也可以在对于不止一个执行路径公共的基本块中分配参数值;例如,执行路径A’与B’可在公共基本块320(其不是执行路径C’的一部分)中分配参数值。第三,在函数调用之前,可以不止一次地向参数分配值;例如,第一次分配可将第一个值给予参数,而第二次分配可修改该值,例如通过向其增加一。第四,分配可依赖于多个因素,并可包括诸如散列函数之类的函数。本领域技术人员还将意识到在没有访问控制流程图的情况下,很难对作为结果的机器代码进行逆向工程,这是因为很难发现在哪里分配参数。应该注意的是,通常不向控制流程图提供包括机器代码的二进制数。同时,也将要认识到难以从机器代码中生成控制流程图,这是因为,由于不在静态代码中出现,而是在执行期间计算出跳转的地址,所以难以获得跳转的地址。图4图示了根据本发明优选实施例的代码迷惑的方法。在步骤410中以在基本块x(例如,图3中基本块360)中的函数调用来替换跳转。在步骤420中,使用控制流程图(CFG)从块X开始回溯(backtrack)以发现至少部分通向该块的可能的执行路径。如上文描述的,在图3中存在两条从基本块310通向基本块360的执行路径执行路径A,(310-320-340-360)以及执行路径B,(310-320-330-360)。在步骤430中,在至少一条(可能为多条或全部)已发现的执行路径中选择基本块Y。基本块Y优选地对于该执行路径是唯一的,但也可能基本块Y由多条执行路径共享。在执行路径中存在多个用于基本块Y的候选项的情况下,优选地使用远离基本块χ的一个。继续该示例,用于两个执行路径的基本块Y的候选项为A,=310-320-340和B,:310-320_330。如果期望基本块Y对于执行路径是唯一的,则这仅给A’留下基本块340而给B’留下基本块330。然而,如已经提及的,可能在对两个执行路径公共的例如基本块320中分配参数,并且也可能在基本块330与340中的任一个或这两者中修改或改变参数值。在步骤440中,在基本块Y中插入参数分配。继续该示例,在两个执行路径A’和B,中分配参数,基本块340中"a=y”,以及基本块330中"a=y”。图5图示了根据本发明优选实施例用于代码迷惑的设备。设备500包括至少一个处理器(在此,“处理器”)510;存储器空间520;至少一个用于与其它设备通信的通信单元(1/0)530;以及用于用户交互的用户接口(UI)MO。优选地在处理器510中实施,设备500包括用于以函数调用替换跳转的单元550(大致与步骤410对应);用于发现执行路径的单元560(大致与步骤420对应);用于发现候选基本块的单元570(大致与步骤430对应);以及用于插入参数分配的单元(大致与步骤440对应)。设备500优选地还包括(未示出)用于取得源代码并且生成语法树120、CFG130、汇编代码140以及机器代码150的单元。图5还图示了用于存储使用根据本发明优选实施例的方法而迷惑的编译的计算机代码的计算机程序载体590,例如CD-ROM或用于存储计算机代码的任何其它合适的载体。由此将认识到本发明使得对抗至少静态的反汇编的代码迷惑成为可能。可以独立地或在任何适当组合中提供本描述中以及(在适当的情况下的)权利要求以及附图中公开的每个特征。被描述为在硬件中实施的特征也可在软件中实施,反之亦然。在可应用的情况下,可以将连接实施为无线连接或有线连接,不一定为直接或专用的连接。出现在权利要求中的参考标号仅仅是说明性的并且应该对权利要求的范围没有限制影响。权利要求1.一种用于迷惑编译的计算机代码(300)的方法,所述编译的计算机代码(300)包括以多个基本块(310-370)组织的计算机代码指令,该方法包括如下步骤-以具有至少一个参数的函数调用来替换(410)第一基本块(360;370)中的跳转指令,其中所述函数调用在执行时依赖于所述参数来确定要执行的下一函数的地址;-向所述编译的计算机代码(300)插入(440)向所述参数分配值的指令,所述值使得由所述函数调用确定的地址与被替换的跳转指令的目的地地址对应;其特征在于,将分配指令插入至与所述第一基本块(360;370)不同的并意图要在第一基本块之前执行的第二基本块(320-350)中的计算机代码。2.如权利要求1所述的方法,其中所述跳转函数为无条件跳转函数。3.如权利要求1所述的方法,进一步包括如下步骤在之前的包括有条件跳转指令的第三基本块(310-340)与所述第一基本块(360;370)之间的执行路径中选择(430)第二基本块(320-350)。4.如权利要求3所述的方法,其中,使用用于编译的计算机代码的控制流程图中的信息来选择第二基本块(320-350)。5.一种用于迷惑编译的计算机代码(300)的设备(500),所述编译的计算机代码(300)包括以多个基本块(310-370)组织的计算机代码指令,该设备(500)包括-替换单元(550),适配为以具有至少一个参数的函数调用来替换第一基本块(360;370)中的跳转指令,其中所述函数调用在执行时依赖于所述参数来确定要执行的下一函数的地址;-插入单元(580),适配为向所述编译的计算机代码(300)插入向该参数分配值的指令,所述值使得由所述函数调用确定的地址与被替换的跳转指令的目的地地址对应;所述设备特征在于,其进一步包括发现单元(570),适配为发现该插入单元(580)向其中插入分配指令的、与第一基本块(360;370)不同的并且意图要在第一基本块之前执行的第二基本块(320-350)。6.如权利要求5所述的设备,其中所述替换单元(550)适配为替换无条件跳转函数。7.如权利要求5所述的设备,其中所述发现单元(570)适配为在之前的包括有条件跳转指令的第三基本块(310-340)与所述第一基本块(360;370)之间的执行路径中发现第二基本块(320-350)。8.如权利要求7所述的设备,其中所述发现单元(570)适配为使用用于编译的计算机代码的控制流程图中的信息来发现第二基本块(320-350)9.如权利要求5所述的设备,其中,在至少一个处理器(510)中实施所述替换单元(550),所述插入单元(580),以及所述发现单元(570)。全文摘要通过利用具有至少一个参数的函数调用来替换(410)第一基本块(360;370)中的跳转指令,来迷惑包括以多个基本块(310-370)组织的计算机代码指令的编译的计算机代码(300),其中,该函数调用在执行时依赖于该参数来确定要执行的下一函数的地址;向编译的计算机代码(300)插入(440)向参数分配值的指令,所述值使得由该函数调用所确定的地址与被替换的跳转指令的地址对应。优选地使用来自控制流程图(CFG)的信息,将分配函数插入至与第一基本块(360;370)不同的第二基本块(320-350)中的计算机代码中。在不能够从迷惑的代码中生成CFG的同时,这可以确保在没有来自CFG的信息的情况下不能对迷惑后的代码进行反汇编。还提供了一种用于代码迷惑的设备。文档编号G06F21/14GK102132289SQ200980132311公开日2011年7月20日申请日期2009年8月17日优先权日2008年8月21日发明者安托万.蒙西夫罗特,费边.拉霍德雷申请人:汤姆森特许公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1