混淆技术的制作方法

文档序号:6600214阅读:163来源:国知局
专利名称:混淆技术的制作方法
技术领域
本发明涉及阻止、预防或检测计算机代码的反向工程或“剽窃”。
技术背景 已知一些人试图在没有计算机程序设计者或所有者的许可的情况下分析或改变计算机程序的功能。计算机程序的改变可用作分析工具,或用于使程序产生程序设计者不想要的真实世界结果的目的。
已提出多种措施包括“混淆”来阻止反向工程,其通常涉及包括无功能的、不必要的、或不合逻辑地放置的代码,该代码使分析员在不访问初始程序设计者的文献的情况下更难理解代码怎样运行。
在任何反向工程尝试中,大量计算机代码的重要部分是“条件分支”或“条件跳转”,根据一些可变因素或其它事件,在前述点代码的运行可采取不同的路线。基于条件的结果,条件分支可导致跳转到程序的不同部分。更普遍地,条件分支通过如果符合指定条件则跳转的命令形成。之后,有如果不符个条件则继续条件跳转命令后面的命令的隐含命令。 总的来说,在本说明书中,选择在一个分支上跳转还是两个分支上跳转及如果只有一个跳转而选择哪一分支跳转均无关紧要,术语“条件跳转”和“条件分支”在所有三种情况下均可无区别地使用。
反向工程师通常能容易地在编译的程序二进制代码中认出条件跳转语句。使用现在广泛可用的调试程序可容易地定位和分析条件语句。之后,反向工程师可使条件跳转无效,使得程序总是沿同一随后的路线而行,因而使其运行更容易理解。恶意的黑客可改变条件跳转,使得随后的运行路线不正确地遵照可变因素或其它事件。例如,其可能撤消安全性或完整性测试,或导致正常输入产生异常输出。传统的混淆不能防止反向工程师识别二进制代码中的条件跳转命令。

发明内容
本发明公开了在运行程序的计算机中进行条件跳转的方法及其计算机程序,包括在计算机中提供真实条件分支以其为条件的输入。在计算机中提供混淆性不可预见的数据。在计算机程序中,运行代码以产生以不可预见的数据为条件的混淆性分支。在计算机程序中由混淆性条件分支确定的点处,进行以前面提及的输入为条件的真实分支。总的来说,“真实条件分支”为与程序的真实目的有关的任何条件分支。
在实施例中,可重复混淆性条件分支,使得程序沿分支树结构工作。在计算机程序中的通过连续混淆性条件分支的累积效应从真实条件分支的几种可用情形中选择的点即树杈处进行真实条件分支。
在实施例中,不可预见的数据选择矩阵的一行,及混淆性条件分支由所选行中的项确定。
在实施例中,真实条件分支可使程序进行到程序中随进行真实条件分支的情形而定的点,之后,可选地,通过进一步混淆,程序可进行到独立于进行真实条件分支情形的点。 在一例子中,不同的真实条件分支情形可向程序发送不同的目的地序列,之后程序可通过该序列重复,在独立点结束。在另一例子中,在真实条件分支之后,可以有另外的不可预见的选择,例如,程序可将另外的混淆性代码重复不可预见的次数。
在实施例中,其它计算机程序代码可包括在混淆性条件分支和真实条件分支之间,或真实条件分支之后的混淆性代码之中。在有两个或两个以上连续混淆性条件分支时, 其它程序代码可在第一混淆性条件分支之后的任何点处。其它程序代码可以是不起作用的混淆。如果其被运行,其可以是无意义的混淆,或者其可以是来自与真实条件分支的主题不紧密相关的程序部分的不调和代码,或者其可以是在混淆性条件分支中复制的相关代码。 尤其在后者情况下,其它代码可能是黑客希望改变的代码。之后,如果黑客未完全理解混淆结构,黑客仅可改变其它代码的一份或一些副本,则其在进一步的剽窃中可被阻止,因为有时运行改变后的代码及有时运行未被改变的代码。
在实施例中,前述其它计算机程序代码的运行可在不同的混淆性条件分支选择之后试图检测其它程序代码的运行之间的差异时进行监视。例如,如果黑客试图改变其它程序代码,在没有认识到全部混淆结构的情况下,黑客可改变通过混淆树的一路径上的其它程序代码,但不能改变另一路径上的其它程序代码,使得通过树的相继重复导致明显不同的结果。
在实施例中,输入可从同一程序的另一部分提供,例如作为计算的结果。作为备选,输入可从程序外面发送或取回。
在实施例中,不可预见的数据可在程序内通过从不可预见的数据源调用而提供。 例如,该源可以是随机或伪随机数发生器。作为备选,不可预见的数据可以是来自同一或另一计算机程序的无关部分的数据或结果。由于目标是进行混淆,不调和的链路有利。


上述及其它方面、特征和优点从下面结合附图进行的详细描述将更明显看出,其中 图1为计算机网络的示意图。
图2为对条件分支进行混淆的过程的流程图。
图3A-3D为实现图2的过程的计算机源代码的例子。
具体实施例方式参考附图,及初始参考图1,总体上由附图标记10指示的计算机系统的一实施例包括处理器12,通过总线14连接到计算机可读存储介质如RAM16、R0M18、硬盘20和可移动磁盘22。总线14还连接到I/O设备如键盘24、点击设备如鼠标26、及因特网连接28。通过28的外设16仅为例子。如本领域技术人员已知的,可提供其它形式的存储和1/0,及将来可能开放另外的其它形式。处理器12运行多种形式的软件,包括存储在R0M18中或磁盘 20上的操作系统和其它安全软件30,及应用软件32,其可在可移动磁盘20或因特网28上传送及可保存在硬盘20上。RAM16通常用于使用中的程序和数据的临时存储。
还参考图2,根据本发明的计算机程序40的一实施例可连同计算机系统10—起使用。当不使用时,计算机程序40可保存在ROM18或硬盘20上,及当使用时可保存在RAM16 上。计算机程序40可以是希望进行保护以免遭剽窃或反向工程的任何计算机程序。这样的程序的无数例子为本领域技术人员众所周知,为了简明,不详细描述前述程序的与本发明无关的部分。
在图2的模块50中,加载计算机程序40并开始运行程序。在模块52中,执行多个命令,直到程序到达要进行混淆的条件分支为止。在模块53中,进行不可预见的选择,及程序进行到模块54或模块56。不可预见的选择可以随机、伪随机、或基于一些与正进行混淆的条件分支不紧密相关的数据或结果。
模块54和56为可选模块。在模块54或模块56中,如果存在,程序运行可能没有作用、用于程序40的另一部分中的目的、或用于检测模块54或模块56已运行的代码,在这种情况下两个模块的代码可以相同或不同。模块54或模块56可包括用于这些功能中的两个或两个以上功能的代码。作为备选,或另外,模块54和/或模块56可代表根本不实际运行的代码,而是仅使编译后的程序40更难阅读。模块54和56可以相同或不同。即使模块 54和56用于共同的有用目的,它们也可使用不同的代码,以使它们完全相同的事实不太明
Mo 之后,程序进行到模块58或模块60。在模块58或模块60中,进行不可预见的选择,及程序进行到可选模块62、64、66或68。在模块62、64、66或68中,如果存在,程序运行可能没有作用、用于程序40的另一部分中的目的、或用于检测所涉及模块已运行的代码, 在这种情况下四个模块的代码可以相同或不同。模块62、64、66和68可包括用于这些功能中的两个或两个以上功能的代码。作为备选,或另外,模块62、64、66和/或68可代表根本不实际运行的代码,而是仅使编译后的程序40更难阅读。为使混淆不太明显,即使模块54、 56、62、64、66和68中的两个的运行结果一样,这些模块的代码也可以不同。
之后,程序进行到模块70、72、74和76之一,在那里进行进一步的不可预见的选择,然后程序进行到可选模块78、80、82、84、86、88、90和92中的所选模块。模块54、56、62、 64,66和68的上述描述也应用于模块78、80、82、84、86、88、90和92,为了简明不再重复。
不可预见的选择的连续层级的数量可大于或小于所示的三级。不同分支中的层级数量可以不同,尽管通常相同数量可能更安全,因为非常短的路径可能向机敏或幸运的黑客呈现脆弱性。然而,导致8个杈的三级被认为对许多目的而言均很方便。
该及其它不可预见的选择的基础可取决于环境、所需要的混淆程度、可用的不可预见资源、及写程序40的各个程序员。通常优选两个结果约略相等的概率。基于伪随机数的选择通常足够安全并易于实施,但偶然使用更无规律的东西可能有利。在快速连续多次重复不可预见的选择时,单一伪随机数或其它不可预见的数据可用于选择整个路径,例如通过选择矩阵中的一行,然后使用该行中的项指定形成该路径的连续选择。在图2所示的例子中,矩阵可具有8行,每行包含三个二进制数字的不同排列。
程序40 从可选模块 78、80、82、84、86、88、90 和 92 进行到模块 94、96、98、100、102、 104、106和108,在那里获得真实输入,及根据该输入运行真实条件分支。八个真实条件分支模块94、96、98、100、102、104、106和108形式上可以不同,尽管它们实质上测试同一条件。在简单例子中,不同的模块可测试是否χ > y、是否χ-y > 0、是否x+k > y+k,依此类推。本领域技术人员将理解怎样产生所希望混淆程度的、所希望次数的测试以进行比较,或条件分支通常基于其的其它条件。
根据真实条件分支的结果,对于一真实结果,程序40进行到模块110、112、114、 116、118、120、122或124之一;或对于另一真实结果,程序40进行到模块126、128、130、 132、134、136、138 或 140 之一。如果每一结果组 110、112、114、116、118、120、122 或 124 或 126、128、130、132、134、136、138或140中的模块数量等于真实条件分支模块94、96、98、 100、102、104、106和108的数量,则每一真实条件分支模块可将控制转到每一结果组中的具体模块。作为备选,真实条件分支的结果可选择结果组,及每一结果组中的具体模块可被不可预见地选择,在这种情况下,结果组中的模块数量可不同于真实条件分支模块的数量。
自所选结果模块 110、112、114、116、118、120、122、124 或 126、128、130、132、134、 136、138、140,程序40反复地进行到相邻模块直到控制达到“真实”结果模块142或144为止。该过程可与确定模块的初始选择的数向下计数到零一样简单,或可以是更复杂的过程。 控制可沿每一结果组中的模块按一个方向传递,或按不可预见地选择的方向,模块形成逻辑环,如图所示。真实结果模块142或144可以是所选结果模块之一,或可以是独立于真实结果模块142或144的模块,程序40分别进行到模块150或152,在那里根据真实条件分支的结果运行其它代码。
在实施例中,与模块54、56等类似的另外的可选模块可包括在真实条件分支模块 94等和结果模块110等或126等之间。对于两个分支,前述另外的可选模块可以相同或不同。另外的可选模块可包括在结果组内。然而,根据程序40在哪一结果模块进入结果组, 前述可选模块将以可预测的方式运行和跳过,或前述可选模块的重复次数以可预测的方式变化,该可预测性可导致脆弱性。因此,程序员在选择用于前述可选模块的适当材料时应利用其技能和判断。
如果反向工程师试图通过图2中所示的程序模块分析路径,十五个而不是一个条件分支命令的存在及通过这些程序模块的至少十六个不同备选路径的存在可迷惑和阻止分析。例如,调试工具通常将能够定位条件分支,但调试程序将不能区分混淆性条件分支和真实条件分支,及将不能解释为什么有这样多的分支。例如,如果黑客试图改变真实条件分支命令以确保结果与真实输入无关,黑客必须找到并改变真实条件分支的所有八个情形, 或必须理解混淆性条件分支树并使其无效,以获得可靠的结果。类似地,如果任何可选代码模块用于真实功能及黑客希望改变该模块,黑客必须找到和改变该代码模块的每一情形, 或必须摧毁任何在前的混淆性条件分支,以获得一致结果。
作为另外的安全措施,可监视部分或所有可选功能模块54等的运行。例如,篡改任何混淆性条件分支可通过监视该混淆性条件分支之后其两侧的一对可选功能模块的相对运行率而进行检测。例如,篡改或绕过可选功能模块之一可通过在相继通过树时观察运行树中该层级的模块的结果及检测相继通过连续路径是否产生相同或不同结果而进行检测。
现在参考图3A、3B、3C、3D (统称为图3),示出了用于实现图2的过程的计算机程序实施例的源代码的例子。为便于引用,已对代码行进行编号。
在7-15行,定义了 8行、3列的矩阵,每一个均包含二进制数字。列数选择为等于混淆性分支的层级数,见图2中的53、58、70等在该例子中,选择行数使得每一可能的不同行出现一次,为清晰起见,行以有条理的顺序列出。其它排列也是可能的。例如,行可被混洗以使矩阵在二进制对象代码中不太容易认出。在23和24行,产生代表矩阵中的行号的伪随机数i。行i中的相继数字将用作不可预见的数据,相继的混淆性分支决定的程度将基于该数据。
在行25,读矩阵行i的第一数字,项矩阵[i] W],及在26和67行(对应于图2中的步骤53),程序根据矩阵[i]
为0还是1而转到代码的不同部分。为清晰起见,两个备选部分,即27-66行和68-107行,被示作一样,但除28和69行的识别说明“左”和“右”之夕卜。然而,即使两个部分实质上执行相同计算,它们也可写成看起来不同。这样的区别可使黑客或反向工程师更难认识到有复制的分支及识别所有分支。此外,为清晰和简明起见,图 2的可选代码如模块54、56、62等、78等不包括在图3中。
在29、30和48行,对应于图2中的第二级混淆性条件分支58,程序读项矩阵[i] [1]即矩阵行i的第二数字,并据其进行分支。行70、71和89为同样的行,其对应于图2中的另一第二级混淆性条件分支60,为简洁起见,将不单独进行描述。在32、33和40行,对应于图2中的第三级混淆性条件分支70,程序读项矩阵[i] [2]即矩阵行i的第三数字,并据其进行分支。行50、73和91对应于第三级混淆性条件分支72、74和76的行32。
最后,在行35-38、42-45、53-56、60-63、76-79、83-86、94-97 和 101-104,程序到达八个不同的点,对应于图2中的真实条件分支94、96、98、100、102、104、106和108。在该例子中,分支以其为条件的输入简单地为值a和b之间的差,a和b在行21中预定义。在实施例中,输入可随程序的另一部分中计算的值、从程序外面接收的数据或二者而定。
如果a > b,程序从选择的无论哪一真实条件分支进行到cirl (行109);如果a < b则进行到cir2 (行133)。在cirl和cir2的每一个中,具有从1到8的值的新随机值 i用作switch语句的自变量,八个值对应于图2中的模块110-124或126-140。之后,程序循环,重复递减i直到i = 0为止,对应于图2中的模块142或144,因此printf语句输出 A是否大于B,对应于图2中的模块150或152。为清晰起见,cirl和cir2被视作一样。在实施例中,它们可完全不同,即使它们具有类似的功能,它们也可不同地表示。如上所述,其它代码可在cirl和cir2之前或之内内插。
尽管已描述了具体的实施例,但在不脱离本发明范围的情况下,技术人员将理解可怎样组合和替代不同实施例的特征。
例如,图2示出了真实条件分支之前和之后的具体混淆性结构。这些混淆性结构中的任一结构均可与真实条件分支的另一侧的无混淆或不同形式的混淆一起使用。
前面关于本发明系统的目前预期最佳实施方式的描述不应视为限制,而仅用于描述本发明系统的一般运行原理的目的。本发明的保护范围由权利要求确定。
权利要求
1.在运行程序的计算机中进行条件跳转的方法,包括在计算机中提供真实条件分支以其为条件的输入;在计算机中提供混淆性不可预见的数据;在计算机程序中,运行代码以产生以不可预见的数据为条件的混淆性分支;及在计算机程序中由混淆性条件分支确定的点处,进行以所述输入为条件的真实分支。
2.根据权利要求1的方法,还包括重复混淆性条件分支,及在计算机程序中由混淆性条件分支确定的点处进行真实条件分支。
3.根据权利要求2的方法,其中所述不可预见的数据选择矩阵的一行,及混淆性条件 分支由所选行中的项确定。
4.根据权利要求1的方法,还包括从真实条件分支进行到程序中随进行真实条件分支 的点而定的点,之后,进行到与进行真实条件分支的点无关的点。
5.根据权利要求4的方法,其中从随进行真实条件分支的点而定的点进行到与进行真 实条件分支的点无关的点被使得包括反复进行,直到到达独立点为止。
6.根据权利要求1的方法,在真实条件分支之后,将另外的混淆性代码重复不可预见 的次数。
7.根据权利要求1的方法,还包括运行所述混淆性条件分支和所述真实条件分支之间 的其它计算机程序代码。
8.根据权利要求7的方法,还包括监视所述其它计算机程序代码的运行,及尝试在不 同的混淆性条件分支选择之后检测其它程序代码的运行之间的差异。
9.根据权利要求1的方法,其中提供输入包括从同一程序的另一部分提供输入。
10.根据权利要求1的方法,其中提供不可预见的数据包括在程序内从不可预见的数 据源调用。
全文摘要
本发明公开了在运行程序的计算机中进行条件跳转的方法,包括提供输入,以该输入为条件进行真实条件分支;提供混淆性不可预见的数据;运行代码以产生以不可预见的数据为条件的混淆性分支;在计算机程序中由混淆性条件分支确定的点处,进行以所述输入为条件的真实分支。本发明可很好地防止剽窃和反向工程。
文档编号G06F21/22GK101847194SQ20101014002
公开日2010年9月29日 申请日期2010年3月24日 优先权日2009年3月24日
发明者B·辛格, N·萨克塞纳, V·S·S·拉维纳德, R·S·肖汉 申请人:安全网络公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1