信息处理装置及其方法

文档序号:6467220阅读:93来源:国知局
专利名称:信息处理装置及其方法
技术领域
本发明涉及一种信息处理装置及其方法,并且尤其涉及一种使程 序的分析或改动困难的技术。
背景技术
为了版权保护或加密密钥的保护的目的,需要一种创建难以分析 或改动的程序的技术。因此常规上已知用于加密程序的技术和用于混淆(obfuscate )程序的技术。Yuichiro Kanzaki, Akito Monden, Masahide Nakamura, Ken誦ichi Matsumoto, "A Software Protection Method Based on Instruction Camouflage", the Journal of IEICE(Denshi Joho Tsushin Gakkaishi), Vol. J87國A, No. 6, pp. 755-767, June 2004 (下文被称为Kanzaki)描述了这些技术的特征, 并且作为一种不同于这些技术的技术,提出了一种其中创建执行自修 改进程的程序的配置。但是,尽管Kanzaki公开了一种其中使用自修改进程伪装程序的 真实命令码的配置,但是抵抗分析的保护程度并不能被认为是足够的。 换句话说,尽管与常规技术相比,Kanzaki的配置使程序更好地4氐抗 静态分析,在静态分析中执行分析而没有执行程序,但是存在当执行 足够的静态分析时该程序可被分析的问题。发明内容考虑到上迷问题构思本发明,并且本发明的一个目的是提供一种 能够使得程序的分析或改动甚至更加困难的技术。根据本发明的一个方面, 一种信息处理装置,包括确定单元,适于在处理目标程序中包含的指令之中确定要被修改为伪装指令的目标指令,伪装指令生成单元,适于生成对应于该目标指令的伪装指令, 还原命令生成单元,适于生成用于将生成的伪装指令还原成对应的目标指令的还原命令,以及适于通过生成的伪装指令修改处理目标程序中包含的目标指令, 并将还原命令添加到该程序中的单元,其中,该还原命令通过参考存储该处理目标程序中包含的处理命 令的输出值的存储器,并基于该参考值识别目标指令在程序中的位置 或该目标指令,执行还原。根据本发明的另一方面, 一种信息处理方法,包括以下步骤 在处理目标程序中包含的指令之中确定要被修改为伪装指令的 目标指令,生成对应于该目标指令的伪装指令,生成用于将生成的伪装指令还原成对应的目标指令的还原命令,以及通过生成的伪装指令修改处理目标程序中包含的目标指令,并将 还原命令添加到该程序中,其中,该还原命令通过参考存储该处理目标程序中包含的处理命 令的输出值的存储器,并基于该参考值识别目标指令在程序中的位置 或该目标指令,执行还原。本发明的其它特征在下文(参照附图)对示例性实施例的描述中 将变得清楚。


图l是示出基于自修改进程添加程序的处理的流程的流程图,图2示出C源程序的示例。图3是示出计算机装置的内部配置的框图。图4A和4B示出汇编程序的示例。图5示出作为添加自修改进程的结果的汇编程序的示例。图6示出C源程序的另一示例。图7示出执行图2中的代码的结果。图8示出执行图6中的代码的结果。图9是示出流程图示例的图。图IO是示出可能的流程图的示例的图。图ll是示出可能的流程图的另一示例的图。图12是示出可能的流程图的另一示例的图。图13A和13B示出汇编程序的示例。图14示出已添加自修改进程的汇编程序的示例。
具体实施方式
下文将参照附图详细描述本发明的实施例。但是,应理解,本实施例中提及的组成元件仅是用于说明性目的而给出的,本发明的范围不被解释为被这些组成元件限制。此外,本实施例中所述的特征的组 合并非全部都是解决本发明的问题的手段所必需的。第一实施例 计算机装置的配置将参照图3描述此实施例的计算机装置(图像处理装置)的内部 配置。图3是示出计算机装置的内部配置的框图。此内部配置是本说 明书中的所有实施例共有的。如图3所示,计算机装置300包括网络接口 301、外部介质读/ 写设备302、 CPU 303、 ROM 304、 RAM 305和硬盘306。此外,计 算机装置300包括电源307、指示输入设备接口 308、监视器接口 309、 总线310等。网络接口 301是用于与外部设备通信的通信接口,并且由例如 LAN接口或无线LAN接口等实现。外部介质读/写设备302是用于从 外部介质读数据/向外部介质写数据的设备。外部介质读/写设备302 从其读数据/向其写数据的外部介质的示例包括软盘、CD-R、 DVD、 USB等。CPU 303是控制计算机装置300的总体操作的中央处理单元。 ROM304是只读存储器,并且存储基本程序、基本数据等。RAM 305 是可写存储器,并且用作用于被CPU303执行的操作的工作区。硬盘(下文被称为HD) 306是大容量外部存储装置,并且存储 例如在操作之前和之后的数据。电源307向计算机装置300供电。指 示输入设备接口 308是与指示输入设备的接口,并且用户经由指示输 入设备输入指示和命令。连接到指示输入设备接口 308的指示输入设 备的示例包括键盘/点击设备等。监视器接口 309是与监视器的接口,并且将用于显示操作结果等 的屏幕输出给连接到该接口的监视器。总线310在计算机装置300的 组件之间提供连接,并传输信号。应指出,计算机装置300由个人计算机(PC )、工作站(WS )、 或个人数字助理(PDA)等实现。下文将描述的处理内容(过程)被实现为程序(软件)或模块(硬 件)。例如,当处理内容被实现为程序时,该程序被存储在ROM 304 或HD 306中,并且被存储的程序被读入CPU 303。然后,CPU 303 通过经由总线310读取HD 306上记录的数据并且向HD 306写数据, 同时必要时使用RAM 305作为用于计算的空间(工作区),执行处 理。当处理内容被实现为模块时,执行与程序的操作等同的操作的实 体被实现为例如LSI,并且被并入计算机装置300。在此情况下,从 装置的CPU 303向模块(LSI)发出指示,这使得每个模块开始操作 并执行处理。下文,用于使计算机装置300伪装处理目标程序的指令以便使程 序的分析或改动困难的程序被称为自修改进程添加程序。自修改进程 添加程序纟皮从外部介质例如软盘、CD-ROM或DVD经由外部介质读/ 写设备302安装在计算机装置300上,从而被存储在HD 306中。作 为替换方案,自修改进程添加程序也可经由网络接口 301被存储在HD 306中。自修改进程在此实施例中,通过编译源程序以生成汇编程序,并对包含与条 件跳转相关联的命令码的汇编程序的指令执行自修改,使程序的分析 或改动困难。这里,条件跳转是指根据是否满足某一条件而分支处理 的命令。此外,自修改是指修改一指令以使其被另一指令重写。原本 应执行的指令到另一指令的初步改变被称为伪装。图1是示出由CPU 303基于根据此实施例的自修改进程添加程 序执行的处理的流程的流程图。假设要被保护的程序被作为例如用C 语言写成的源程序记录在RAM 305中,该程序是自修改进程添加程 序的处理目标。图2示出C源程序的示例。在图2的示例中,变量i的值基于j 的值和函数func(,)的内容被确定,并且根据变量i是否为3以及变量 j是否为l执行四个进程之一。具体地说,这四个进程如下 如果变量i为3且变量j不为1,则变量j增加10 (201)。
如果变量i为3且变量j为1,则变量j增加20 (202 )。
如果变量i不为3且变量j为1,则变量j增加30 (203 )。
如果变量i不为3且变量j不为1,则变量j增加40 (204)。 在步骤S101中,CPU 303编译RAM 305中存储的源程序以生成 汇编程序。图4A和4B示出通过编译图2中所示的源程序生成的汇编 程序的一部分。在步骤S102中,CPU 303确定生成的汇编程序中是否存在可作 为自修改的目标的指令。也就是说,CPU 303确定汇编程序中是否存 在这样的指令,该指令包含与条件跳转相关联的命令码并且还未经受 步骤S103至S109的处理。与条件跳转相关联的命令码的示例包括je、 jz、 jnz、 jne、 jb、 jc、 jnae、 jl、 jnge、 ja、 jnbe、 jg、 jnle、 jbe、 jiia、 jle、 jng、 jnb、 jae、 jnc、 jge和jnl。应指出,条件跳转在处理器之间 在指令和命令码方面是不同的,因而并不局限于这些示例。由于如稍后将描述的,CPU 303将被确定为自修改的目标的指令 记录在RAM 305中,所以在步骤S102中,CPU 303通过参考RAM 305中的记录执行确定。在步骤S102中,如果存在还未被处理的分支命令 (与条件跳转相关联的命令码),则处理前进到步骤S103。如果不存 在,则处理前进到步骤SllO。在此实施例中,对汇编程序中的每条包含与条件跳转相关联的命 令码且还未被处理的指令执行步骤S103及其后的处理。在步骤S103中,CPU 303随机地确定处理目标指令是否成为自 修改的目标。应指出,在此实施例中,汇编程序的单行对应于单条指 令。因此,在步骤S103中,将还未被处理的汇编程序的行中的一行选 作处理目标,并且随机地确定所选中的行上的指令是否要被伪装。这 里,执行通过不同指令Y伪装的位置(例如,地址或行号)被定义为 P (Y)。执行伪装的位置P (Y)还可在通过汇编该汇编程序生成的机器 语言程序中被确定。具体地说,位置P (Y)还可被按以下方式确定。 汇编程序被汇编以获得机器语言程序。机器语言程序是指令序列,CPU 303可读取该机器语言程序,并识别各条指令和指令之间的断点。作 为此识别的结果,从机器语言程序确定一条指令,汇编程序中的对应 指令的位置可被用作自修改的目标位置P ( Y )。这里,假设在图4A中,"je L5,,被确定为目标指令y,并且确定"je L5,,要被伪装。CPU 303将已确定哪条指令作为自修改的目标存储在 RAM 305中。这样,在步骤S102和S103中,在处理目标程序包含的指令之中, 确定要被修改为伪装指令的目标指令。具体地,在此实施例中,目标 指令被从处理目标程序中包含的与条件跳转相关联的指令中随机确 定。接下来,在步骤S104中,CPU 303确定伪装指令Y。在此实施 例中,包含将分支到与原始指令y的条件相反的条件的条件跳转的指 令被确定为伪装指令Y。换句话说,执行与目标指令y不同的条件分 支的指令被生成作为伪装指令Y。在图4A和4B的示例中,目标指令 是"je L5"。因此,"jne L5,,被确定为伪装指令Y,其是"je"的相反控制流。这些进程由在计算机装置300上实现的用作伪装指令生成单元 的功能元件执行。在下文所述的步骤S105至S108中,生成用于通过真实指令y修 改(还原)伪装指令Y的例程X (还原命令)。步骤S105至S108的 进程由在计算机装置300上实现的用作还原命令生成单元的功能元件 执行。然后,在步骤S109中,将例程X插入处理目标汇编程序,并 且通过伪装指令Y修改真实指令y。在此实施例中,例程X被构造成使得例程X基于下列三个值计 算执行通过伪装指令Y的伪装的位置P ( Y),并且通过伪装指令Y 修改在该位置P (Y)的指令。.汇编程序中的预定位置(下文被称为BASE位置)。.汇编程序中的用于计算固定值的预定进程(下文被称为基准值 计算进程)的计算值(下文被称为基准值)。
P ( Y ) - BASE位置-基准值(下文被称为掩蔽值)。例程X通过计算基准值+ BASE位置+掩蔽值,计算伪装位置P (Y)。这里,在例程X中,基准值是通过参考存储汇编程序中的基 准值计算进程的处理结果的存储器获取的。换句话说,例程X参考存 储处理目标程序中包含的处理命令(基准值计算进程)的输出值的存 储器,基于该被参考的值识别程序中的指令Y的位置,并还原真实指 令y。因此,即使当攻击者检查与例程X对应的汇编程序的一部分时, 攻击者仍难以知晓基准值。因而,难以确定汇编程序的哪一部分被伪 装或未被伪装,从而攻击者难以分析汇编程序的操作或改动汇编程序 以便程序执行希望的操作。应指出,在此实施例中,基准值计算进程的输出值(基准值)是 固定值,从而掩蔽值可被容易地确定。下文将描述每个步骤的细节。在步骤S105中,CPU 303确定汇 编程序中的基准值计算进程及其位置和P (X)。例程X执行如上所 述的将真实指令y写入P (Y)的进程,而P (X)指示例程X插入其 中的位置。P (X)在从基准值计算进程的位置到P (Y)的控制流中的任意点处被确定。图4A示出这样的示例,其中"call —cont""movl 。/。eax,-12(y。ebp)"被确定为基准值计算进程,"je L5"被确定为自修改 的目标指令,而基准值计算进程的下一行被确定为P (X)。应指出,程序中执行的各种进程可被用作基准值计算进程。例如, 背景技术中所述的方法中的计算观测值的进程可被使用,在该方法中 程序在执行期间验证该程序未被改动。在此实施例的描述中,图2中 的函数cont(,)被用作基准值计算进程以便有助于理解。但是,基准值 计算进程还可以是C源程序中不存在的而仅存在于汇编程序中的进 程。应指出,如上所述,基准值是基准值计算进程的处理结果。此夕卜, 基准值计算进程是计算确定值的进程。也就是说,固定值作为执行此 进程的结果被输出。接下来,CPU 303在步骤S106中确定基准值,在步骤S107中确 定掩蔽值,并在步骤S108中生成例程X。下文将描述执行这些步骤的 方式。例程X需要作为自修改的目标的伪装指令Y的位置P ( Y )。为 此,CPU 303从P (Y)、程序上的某一位置和基准值计算并确定掩 蔽值,从而满足关系"P(Y)=程序上的所述某一位置+基准值+掩 蔽值"。在图4A的示例中,在步骤S103中伪装指令Y的位置P (Y)已 被确定为"jeL5,,的位置。基准值计算进程是图4A中的"call—cont", "call —cont,,计算的输出被下一条指令"movl %eax, -12(%6& )"存储在 "-12(。/。ebp),,中。如上所述,基准值计算进程"call jont"对应于图2 中的cont(,),函数main(,)中的cont(,)的计算值是cont(1,45)= cont(50,45) = 50-45 = 5。从而,CPU 303可预先计算出计算结果"5"。 下文,将描述用于从图4A和4B中示出的汇编程序创建图5中示出的 汇编程序的过程,图5中示出的汇编程序是添加自修改进程的结果。首先,CPU 303确定程序中的任意位置(BASE位置)。这里, 假设图4B中的"jne L8,,被选中。此指令的地址被称为"BASE的地址"。 在汇编程序中,"BASE:,,被插在"jne L8,,之前。这里,伪装指令Y是"jneL5",其是自修改的目标。下文,P(Y) 被称为"TARGET的地址"。如上所述,保持关系"P(Y) -BASE位置(地址)+基准值+ 掩蔽值"。因此,"掩蔽值-P(Y) -BASE的地址-基准值"。当如 上述示例,基准值- 5时,"掩蔽值=TARGET的地址-BASE的地址 -5"。在此示例中,P (Y)的地址小于BASE,从而可从BASE获得 并减去掩蔽值的绝对值。因此,最终掩蔽值(的绝对值)是"BASE的 地址-TARGET的地址+ 5"。此计算可从图4A和4B中所示的汇编 程序(必要时,通过一旦获得其机器语言程序并使用机器语言程序的 指令序列)执行。接下来,将参照图5中的自修改例程X描述生成例程X的处理 内容的方法。由于例程X的用途是将真实指令写入P (Y),所以首 先获得P(Y)。寄存器edx用于P (Y)的计算,以便其它进程将不 受影响。首先,CPU 303生成"movl $BASE, %edx,,。这是将BASE的地 址SBASE分配给寄存器edx的指令。接下来,CPU 303生成"addl -12(%ebp), %edx"。这是将-12(。/。ebp) 添加到寄存器edx中的指令。这里,-12(%6& )存储基准值计算进程的 结果,并且其值为5。因而,通过将BASE的地址加5获得的值被存 储在寄存器edx中。在图5中,此值指示在BASE之下5个字节处的然后,CPU 303生成"subl $0x21, %edx"。这是减去上述掩蔽值 (的绝对值)以便在寄存器edx中存储P (Y)的指令。由于掩蔽值 是S0x21,所以从寄存器edx减去十六进制中的21 (十进制中的33 )。 得到的值指示在该在BASE之下5个字节处的位置之上33个字节处 的位置P (Y)。最后,CPU 303生成"movb $0x74, (%edx),,。这里,寄存器edx 中存储的地址(。/oedx)是P( Y )。因此,"movb $0x74, (。/oedx)"是将S0x74 分配给(V。edx)以便将伪装指令"jne L5,,修改成真实指令"je L5"的指令。但是,由于在机器语言中jne是0x75,所以被写入P(Y)的一 个字节的0x75被修改为0x74。这样,生成在图5的上部用矩形圏起的例程X。这种例程X是一 个示例。例如,另一个位置也可被用作BASE,并且在该情况下,掩 蔽值变为不同的值。应指出,执行程序的地址计算以便计算图5中的 P (Y)。接下来,在步骤S109中,将上述例程X插入P (X)。这里, 上述例程X被插入图4A和4B中的基准值计算进程的下一行的位置。 此外,假指令"jneL5,,被写入P(Y)作为指令Y,其是自修改的目标。 结果,图4A和4B中所示的汇编程序被修改为图5中所示的汇编程序。接下来,处理返回步骤S102,并且CPU 303确定是否存在可以 作为自修改的目标的指令,然后在步骤S103, CPU303随机确定该指 令是否要被伪装。如果该指令要被伪装,则重复步骤S104至S109的 进程,而如果指令将不被伪装,则处理返回步骤S102。如果不存在将 被修改的指令,则处理前进到步骤SllO。在步骤SllO, CPU 303通过汇编自修改程序生成机器语言程序。 必要时,CPU 303通过链接机器语言程序生成可执行程序。此外,对 于该可执行程序,CPU 303执行进程,例如设置允许对程序的代码区 进行写操作的标记,从而使得在执行期间程序能够对其自身的代码区 进行写操作的进程。自修改程序的操作接下来,将描述CPU 303执行自修改程序的机器语言程序的方 式。由于机器语言程序大致对应于汇编程序,并且可认为在控制流方 面它们之间没有区别,所以下文将参照图5进行描述。首先,程序中的指令被CPU 303按从机器语言程序的顶部开始 的顺序解释,并且存储器和寄存器被读和写。当执行点到达P (X) 时,例程X被执行。作为此处理的结果,位于P(Y)的伪装指令Y ("jne L5")被修改为真实指令y ( "je L5")。在机器语言程序中, 0x75被修改为0x74。然后,例程X完成,并且随后的指令在到达P(Y)之前被解释和执行。P (Y)处的指令已被修改为真实指令y, 从而y被解释和执行。自修改程序的安全性接下来,将描述通过根据此实施例的自修改进程添加程序生成的 程序的安全性。考虑分析图5中所示的程序的情况。如上所迷,机器 语言程序大致对应于汇编程序,并且可认为在控制流方面它们之间没 有区别,所以假设对应于图5中所示的程序的汇编程序是通过反汇编 机器语言获得的。在图5中,例程X的位置P (X)和伪装指令Y的位置P (Y) 设置成相互接近。但是,在实际程序中,这些位置并不一定设置成相 距较短距离。因此,难以仅通过查看汇编程序就查明伪装例程X和自 修改的目标Y之间的关系。接下来,考虑在阅读和理解汇编程序的同时分析该汇编程序的操 作的情况。例程X的处理内容由程序上的某一位置(BASE位置)、 基准值计算进程的输出值(基准值)和掩蔽值确定,并且难以仅通过 阅读程序而不执行程序就获得基准值。在程序在执行期间验证程序未被改动的配置中,获得在程序的执 行期间被计算的观测值的进程被以这样的方式实现,即执行观测的进 程本身不大可能被容易地查明。还在此实施例中,通过将上述实现方 式用于基准值计算进程,可防止基准值计算进程被容易地查明。此外, 由于例程X的进程由多条指令构成,所以通过将那些指令设置在分离 的位置而不是将它们集中在一个区域,也可防止例程X被容易地查明。 因此,难以确定P (Y)的值。另一方面,知晓此实施例的方法的分析员将知晓程序中的条件跳 转可能已被修改。在图5的情况下,仅仅通过查看程序,就清楚在用 从中部延伸到底部的矩形圏起的部分中存在条件分支,从而存在分析 员可反编译此部分,并将程序解释为如图6所示的用C语言写成的源 程序的可能性。但是,除非分析员可识别P(Y),否则分析员不能 查明哪个条件跳转已被修改,从而分析员不能唯一地确定真实程序是什么,并且不得不列举并检查可想到的可能性。图2和图6之间的比 较指示图2中所示的代码的执行得到图7中所示的输出,而图6中所 示的代码的执行得到图8中所示的输出。因此,当分析员确定图6中 所示的程序是真实程序时,这意味着分析员不正确地分析该程序。因 此,攻击者也不能改动程序以便程序执行希望的操作。基于前述考虑,将参照图9中的流程图进一步描述根据此实施例 的配置的效果。图9中的流程图也对应于图2中所示的程序。图9中 的分支C对应于图2中的if(i==3),图9中的分支E对应于图2中的 if(j!-l),并且图9中的分支I对应于图2中的if(j=-l)。在图9的流程图表示的程序的情况下,存在设置成两级的总共三 个比较分支。因此,在汇编程序中存在三个条件跳转。由于在图4A 和4B中存在"jneL4"、 "je L5"和"jne L8",所以这是可以确认的。当 此实施例应用于此程序时,这三个条件跳转被随机伪装。查明哪个条 件跳转被伪装的困难使得必须列举和分析可想到的可能性。当假设图 9中的流程图的分支E被伪装时,图IO中的流程图可能是真实流程图。 类似的,当假设图9中的分支I被伪装时,图ll中的流程图可能是真 实流程图。同样,当假设图9中的分支C被伪装时,图12中的流程 图可能是真实流程图。从前文可见,当存在一个要被伪装的条件跳转时,可能的流程图 的数量增加到2。相应地,当存在n个条件跳转时,可能的流程图的 数量增加到2的n次幂。因此,分析对象的数量被设定为程序中的条 件跳转的数量的指数函数的量级,从而可认为,此实施例的配置在计 算复杂度方面提供分析的难度。在其中使用自修改进程伪装程序的真实命令码的常规配置中,存 在分析的难度不能被定量地估计的问题。相反,在此实施例的配置中,在阅读和理解程序的同时分析程序的攻击者需要分析数量与程序内的 条件跳转的数量的指数函数的量级相同的控制流。因此,根据此实施 例的配置,可从条件跳转的数量定量地估计分析的难度。此外,在其中程序在执行期间验证该程序未被改动的配置中,存在这样的风险,即使观测进程本身不大可能被容易地查明,观测值比 较进程也将被发现,并且比较进程将被无效。另外,在提供多个改动 检测例程的配置的情况下存在这样的问题,配置的效果,即当构造改度,'不能用数值表示P。、 、 ' ' 、"相反,在此实施例中,程序使用基准值计算进程的结果(基准值) 在执行期间验证程序未被改动。换句话说,参考存储处理目标程序中 包含的处理命令的输出值的存储器,并且基于参考值识别程序中的目 标指令的位置。因此,比较进程被实现为地址计算进程,并且程序按以下方式操作当地址计算进程的处理结果正确时,自修改进程是成功的。由于 与比较进程相比地址计算进程由多条指令构成,所以通过分布这些指 令可使得攻击者发现该进程的可能性降低,并且可增加对抗无效的安 全性。此外,常规改动自检测进程中的一个比较进程对应于此实施例的 一个自修改进程。当常规改动自检测进程中存在k个比较进程时,根 据此实施例生成的程序的应被分析的控制流的数量是2的k次幂。因 此,在阅读和理解程序的同时分析程序的攻击者需要分析数量与改动 自检测进程中的比较进程的数量的指数函数的量级相同的控制流。因 而,根据此实施例的配置,可从比较进程的数量定量地估计分析的难 度。此外,可独立于改动自检测进程的改动检测例程之间的依赖关系 定量地估计分析的难度。第二实施例在第一实施例中,例程X被构造成使得例程X基于BASE位置、 基准值和掩蔽值这三个值计算执行通过伪装指令Y的伪装的位置P (Y ),并通过伪装指令Y修改位置P ( Y )中的指令。在此实施例中, 将描述如下形式的自修改进程添加程序,其中例程X基于基准值和掩 蔽值这两个值计算伪装指令Y的操作码或操作数,并通过伪装指令Y 修改指令y。指令由命令(操作码)和操作数构成,操作数是命令的对象,并且操作数可以是例如寄存器或存储器的内容或数值本身。图13A和13B示出通过编译图2中所示的源程序生成的汇编程 序的一部分。接近图13A的底部发现用矩形團起的指令"addl $0x4, (%eax),,。此指令由命令(操作码)"addl,,以及操作数"S0x4,,和 "(。/。eax)"构成,并且表示将数值"4"(十六进制)作为32位的数据添 加到寄存器"eax,,中的进程。这里,"addl,,的"l,,指示"长,,即32位。此 指令的机器语言程序是"83 00 04"(十六进制),"addl"和"(o/oeax)" 对应于"83 00",而"S0x4,,对应于"04"。在Intel x86 CPU中,保持下列对应关系。汇编语言中的"addl $0x4, (。/。eax)"在机器语言中是"83 00 十 六进制)。汇编语言中的"addl $0x4, (。/。edx)"在机器语言中是"83 02 04" (十六进制)。汇编语言中的"sublS0x4, (。Aeax)"在机器语言中是"83 28 十 六进制)。汇编语言中的"sub $0x4, (Q/。edx)"在机器语言中是"83 EA 十 六进制)。汇编语言中的"movb $0x4, (Q/oeax),,在机器语言中是"C0 00 04,, (十六进制)。汇编语言中的"rolb $0x4, (。/oeax),,在机器语言中是"C6 00 0 4" (十六进制)。因此,当对应于上述指令"addl $0x4, (。/。eax)"的机器语言程序"83 00 04"(十六进制)的第一字节被修改为"C0"时,修改后的机器语言 程序"C0 00 04,,对应于指令"movb $0x4, (%eax),,。类似地,当第一字 节被修改为"C6"时,修改后的机器语言程序"C6 00 04"对应于指令 "rolb $0x4, (%eax),,。当第二字节"00,,被修改为"28,,时,修改后的机 器语言程序"83 28 04,,对应于指令"sublS0x4,(。/。eax)"。也就是i兌,通 过修改机器语言程序的一个字节,可将命令(操作码)改变为不同的 命令(操作码)。此外,当对应于上述指令"addl $0x4, (。/。eax),,的机器语言程序"83 00 (M,,的第二字节"00"被修改为"02"时,修改后的机器语言程序"83 02 04"对应于指令"addlS0x4, (%edx)"。也就是说,通过修改机器语言程 序的一个字节,还可将操作数的寄存器改变为不同的寄存器。最后,当对应于上述指令"addl $0x4, (。/。eax)"的机器语言"83 00 04,,的第三字节"04,,被修改为"03,,时,修改后的机器语言程序"83 00 03"对应于指令"addlS0x3,(。/neax)"。也就是说,通过修改机器语言程 序的一个字节,还可将操作数的数值改变为不同的数值。从前文可见,例程X可被构造成使得要被伪装的目标是操作码或 操作数,并且例程X基于基准值和掩蔽值这两个值计算原始操作码或 操作数,并通过伪装指令Y修改指令。将如同第一实施例一样,参照图1和2描迷由CPU 303基于根 据此实施例的自修改进程添加程序执行的处理的流程。假设要被保护 的程序作为例如用C语言写成的源程序被记录在RAM 305中,该程 序是自修改进程添加程序的处理目标。在步骤SIOI中,CPU 303编译RAM 305中存储的源程序以生成 汇编程序。图13A和13B示出通过编译图2中所示的源程序生成的汇 编程序的一部分。在步骤S102中,CPU 303利用确定算法确定生成的汇编程序中 是否存在可作为自修改的目标的指令。尽管从筒单算法到复杂算法的 各种类型的算法可被用作该确定算法,但是这里所述的确定算法是从 生成的汇编程序中随机选择单行的算法。由于如下文将说明的,CPU 303将被确定为自修改的目标的指令 记录在RAM 305中,所以在步骤S102中,CPU 303通过参考RAM 305 中的记录执行该确定。在步骤S102中,如果确定算法确定存在目标, 则处理前进到步骤S103。如果确定算法确定不存在目标,则处理前进 到步骤SllO。假设接近图13A的底部的用矩形圏住的"addl $4, (0/。eax),,被选作目标指令y,并且确定存在目标。在步骤S103中,CPU 303随机确定处理目标指令是否成为自修改的目标。应指出,在此实施例中,汇编程序的单行对应于单条指令。因此,在步骤S103中,将还未被处理的汇编程序的行中的一行选作处 理目标,并且随机地确定所选中的行上的指令是否要被伪装。假设确 定目标指令<formula>formula see original document page 19</formula>要被伪装。CPU 303将哪条指令已被 确定为自修改的目标存储在RAM 305中。执行通过不同指令Y的伪 装的位置(例如,地址或行号)被定义为P ( Y )。以这种方式,在步骤S102和S103中,在处理目标程序包含的指 令之中,确定要被修改为伪装指令的目标指令。接下来,在步骤S104中,CPU 303确定伪装指令Y。在此实施 例中,这样的指令被确定为伪装指令Y:该指令具有与原始指令y "addl $4, (。/。eax),,的操作数的数值S4不同的数值$3作为操作数。这些 进程由在计算机装置300上实现的用作伪装指令生成单元的功能元件 执行。在下文所述的步骤S105至S108中,生成用于通过真实指令y修 改(还原)伪装指令Y的例程X (还原命令)。步骤S105至S108的 进程由在计算机装置300上实现的用作还原命令生成单元的功能元件 执行。然后,在步骤S109中,例程X被插入处理目标汇编程序,并 且真实指令y通过伪装指令Y被修改。在此实施例中,例程X被构造成使得例程X基于下列两个值计 算原始操作数,并通过伪装指令Y修改在位置P (Y)的指令,以便 将伪装指令Y的伪装操作数修改回原始操作数。.汇编程序中的用于计算固定值的预定进程(下文被称为基准值 计算进程)的计算值(下文被称为基准值)。.原始操作数的机器语言XOR基准值(下文被称为掩蔽值)。例程X通过计算"基准值XOR掩蔽值,,计算原始操作数。这里, 在例程X中,通过参考存储汇编程序中的基准值计算进程的处理结果 的存储器获取基准值。换句话说,例程X参考存储处理目标程序中包 含的处理命令(基准值计算进程)的输出值的存储器,基于该参考值 识别指令y的操作数,并且还原真实指令y。因此,即使当攻击者检查对应于例程X的汇编程序的一部分时,攻击者也难以知晓基准值。因而,难以确定汇编程序的原始操作数,从而攻击者难以分析汇编程 序的操作或者改动汇编程序以便程序执行希望的操作。应指出,在此实施例中,基准值计算进程的输出值(基准值)是 固定值,从而掩蔽值可被容易地确定。下文将描述每个步骤的细节。在步骤S105中,CPU 303确定汇 编程序中的基准值计算进程及其位置和P (X)。例程X执行如上所 述的将真实指令y写入P ( Y)的进程,而P (X)指示例程X所被插 入的位置。P (X)在从基准值计算进程的位置到P (Y)的控制流中 的任意位置处被确定。图13A示出这样的示例,其中"ca11—cont""movl %eax, -12(%6&口)"被确定为基准值计算进程,"addl $4, (。/。eax)"被确 定为自修改的目标指令,"$4"被确定为目标操作数,而基准值计算进 程的下一行被确定为P (X)。应指出,程序中执行的各种进程可被用作基准值计算进程。例如, 背景技术中所述的方法中的计算观测值的进程可被使用,在该方法中 程序在执行期间验证该程序未被改动。在此实施例的描述中,图2中 的函数cont(,)被用作基准值计算进程以便有助于理解。但是,基准值 计算进程还可以是C源程序中不存在的而仅存在于汇编程序中的进 程。应指出,如上所述,基准值是基准值计算进程的处理结果。此外, 基准值计算进程是计算确定值的进程。也就是说,固定值作为执行该 进程的结果被输出。接下来,CPU 303在步骤S106中确定基准值,在步骤S107中确 定掩蔽值,并在步骤S108中生成例程X。下文将描述执行这些步骤的 方式。例程X需要作为自修改的目标的伪装指令Y的原始操作数。为 此,CPU 303从原始操作数的机器语言和基准值计算并确定掩蔽值, 从而满足关系"掩蔽值=原始操作数的机器语言XOR基准值"。在图4A和4B的示例中,在步骤S103中,伪装指令Y的位置P (Y)已被确定为"addlS4,(。/。eax)"的位置。基准值计算进程是图4A中的"call _cont", "call —cont,,计算的输出被下一条指令"movl %eax, -12(%ebp)"存储在"-12(%ebp)"中。如上所述,基准值计算进程"call jont"对应于图2中的cont(,),函数main(,)中的cont(,)的计算值是 cont(1,45) - cont(50,45) = 50 - 45 = 5。从而,CPU 303可预先计算出计 算结果"5"。下文,将描述从图13A和13B中示出的汇编程序创建图 14中示出的汇编程序的过程,图14中示出的汇编程序是添加自修改 进程的结果。首先,CPU 303确定程序中的自修改的目标的位置(LABEL位 置)。这里,假设图13A中的"addl $4, (。/。eax)"的位置被选中。此指 令的地址被称为"LABEL的地址"。在汇编程序中,"LABEL:,,被插在 "addl $4, (。/。eax),,之前。应指出,如同第一实施例,自修改的目标的 位置也可通过选择另一位置而不是直接选择自修改的目标的位置,并 基于这样选中的位置执行计算被间接获得。这里,伪装指令Y是"addlS4,(。/。eax)",其是自修改的目标。下 文,P (Y)被称为"TARGET的地址"。如上所述,保持关系"原始操作数的机器语言=基准值XOR掩蔽 值"。因此,"掩蔽值-原始操作数的机器语言XOR基准值"。当如上 述示例,基准值-5时,"掩蔽值-原始操作数的机器语言XOR 5"。 因此,掩蔽值是"4 XOR 5" = "100 XOR 101" ( 二进制)=1 ( 二进制)。接下来,将参照图14中的自修改例程X,描述生成例程X的处 理内容的方法。由于例程X的用途是将原始操作数写入P (Y)中的 指令的操作数,所以首先获得原始操作数。寄存器edx用于其计算, 从而其它进程将不受影响。首先,CPU 303生成"movl-12(。/。ebp), %edx,,。这是将-12(。/oebp) 存储在寄存器edx中的指令。这里,-12(°/"& )存储基准值计算进程的 结果,并且其值为5。从而,值5被存储在寄存器edx中。然后,CPU 303生成"movl $1, %ecx"。这是将值1存储在寄存 器ecx中的指令。然后,CPU 303生成"xorl %ecx, %edx,,。这是计算寄存器edx的值与寄存器ecx的值之间的XOR,并将结果存储在edx中的指令。 寄存器ecx和edx都是32位,并且值4被存储在寄存器edx中,值4 是XOR值5和值1的结果。在Intel x86 CPU的情况下,十六进制下 的"04 00 00 00 00 00 00 OO,,被存储在edx中。
接下来,CPU 303生成"movl $LABEL+2, %ebx"。这是将在从 LABEL的地址SLABEL起两个字节处的地址SLABEL+2分配给寄存 器ebx的指令。原始指令y "addl $4, (。/。eax),,在机器语言中是"83 00 04"。因此,$LABEL+2代表机器语言"04,,所位于的地址,并且寄存 器ebx存储该地址。
最后,CPU 303生成"movb $dl, (%ebx),,。这里,寄存器ebx中 存储的地址(。/。ebx)是SLABEL+2。因此,"movb $dl, (。/oebx),,是将4 写入(。/。ebx)以便将伪装指令Y修改为真实指令"addl $4, (。/。eax),,的指 令。但是,%dl是。/。edx的高阶字节,因而是十六进制的"04 00 00 00 00 00 00 00"中的高阶字节"04"。从而,机器语言"04"被写入SLABEL+2。
这样,生成在图5的上部用实线矩形圏起的例程X。这种例程X 仅是一个示例。例如,另一个位置也可被用作如上所述的LABEL, 并且加法、减法、移位运算和逻辑运算也可代替XOR被用作用于确
定掩蔽值的运算。
接下来,在步骤S109中,上述例程X被插入P (X)。这里, 上述例程X被插入图13A和13B中的基准值计算进程的下一行的位 置。此外,假指令被生成作为指令Y,其是自修改的目标。在此实施 例中,假设"addl $4, (y。eax),,的操作数S4被伪装为$3,并且"addl $3, (。/。eax),,被写入P (Y)。结果,图UA和1SB中所示的汇编程序被修 改为图14中所示的汇编程序。
接下来,处理返回步骤S102,并且CPU 303确定是否存在可作 为自修改的目标的指令,然后在步骤S103, CPU303随机确定指令是 否要被伪装。如果该指令要被伪装,则重复步骤S104至S109的进程, 而如果该指令将不被伪装,则处理返回步骤S102。如果不存在要被修 改的指令,则处理前进到步骤SllO。在步骤SllO, CPU 303通过汇编自修改程序生成机器语言程序。 必要时,CPU303通过链接机器语言程序生成可执行程序。此外,对 于可执行程序,CPU303执行进程,例如设置允许对该程序的代码区 进行写操作的标记,从而使程序可在执行期间对其自己的代码区进行 写操作的进程。
伪装指令Y应该是通过其的自修改而恢复回原始指令y的指令。 因此,当对于一个字节执行自修改时,原始指令与伪装指令之间的差 异必须在一个字节内。在Intel x86 CPU的情况下,可以一个字节、两 个字节或四个字节为单位执行修改。因此,只要原始指令与伪装指令 之间的最大差异在四个字节内,伪装指令就可在单个自修改操作中恢 复回原始指令。
第三实施例
第一实施例和第二实施例可组合。在第一实施例中,生成图5中 所示的汇编程序。第二实施例中所述的自修改进程添加程序应用于此 汇编程序。此时,假设例如图5中的X的第三行上的"subl $0x21, 。/。edx"或第四行上的"movb $0x74, (。/oedx)"被选作自修改的目标指 令,并且确定此指令要被伪装。显然,这样生成的自修改程序更加难 以分析或改动。
此外,还可能存在这样的配置,其中相同指令被进行一次以上的 自修改。在此配置的示例中,命令(操作码)的自修改在第一轮自修 改中执行,操作数之一的自修改在第二轮自修改中执行,而另一操作 数的自修改在第三轮自修改中执行。
其它实施例
当然,本发明的目的还可通过在系统或装置上执行实现上述实施 例的功能的软件的程序代码实现。在此情况下,程序代码本身实现上 述实施例的功能,并且该程序代码被包含在本发明的技术范围中。
程序代码可以例如被记录在计算机可读存储介质上,并且被提供 给系统或装置。本发明的目标还可由系统或装置的计算机(或CPU或 MPU)通过读取并执行存储介质中存储的程序代码实现。因此,存储该程序代码的存储介质也被包含在本发明的技术范围中。
可用于提供程序代码的存储介质的示例包括软盘、硬盘、光盘、
磁光盘、CD-ROM、 CD-R、磁带、非易失性存储卡、ROM、 DVD等。 应指出,程序代码并不局限于那些这样的代码,该代码具有被计 算机通过读取和执行程序代码实现上迷实施例的功能所需要的所有元 素。也就是说,程序代码还包括通过与计算机中合并的软件和硬件中 的至少任何一个配合以实现目的的程序代码。
例如,即使在计算机上运行的os等基于来自程序代码的指示执 行实际处理的一部分或全部,并且上述实施例的功能通过此处理实现
的情况下,该程序代码也被包含在本发明的技术范围中。应指出,OS
是操作系统的简称。
作为替换方案,例如,存在这样的情况,其中插入或连接到计算
机的功能扩展板或功能扩展单元中包括的CPU等基于来自程序代码
的指示执行实际处理的一部分或全部,并且上述实施例的功能通过此 处理实现。即使在此情况下,该程序代码也被包含在本发明的技术范 围内。应指出,功能扩展板或功能扩展单元可通过将该程序代码读入 其存储器,并执行该程序代码,执行这种处理。
如上所述,根据本实施例的配置,生成这样的例程,该例程基于 在要被保护的程序的执行期间获得的值确定自修改的目标指令的地 址。然后,目标指令被修改为伪装指令,并且此例程被插入这样的位 置,在该位置该例程在目标指令的执行之前被执行,从而自修改进程 被添加到要被保护的程序中。当执行已经添加了自修改进程的要被保 护的程序时,获得目标指令的地址,并作为上述例程的执行的结果执 行自修改。因而,伪装指令被恢复回真实指令,并且进程如预期地被 执行。
为了分析程序,必须知晓哪一指令通过自修改被伪装并且被修 改。但是,在要被保护的程序的执行期间获得的值对于试图阅读和理 解程序的攻击者是不明确的,因此攻击者不能确定伪装指令。因而, 要被保护的程序的分析和改动变得困难。此外,包含条件跳转的指令被伪装成执行与原始指令的进程相反 的进程的指令,并且在执行期间伪装指令被恢复回原始指令。因此, 攻击者应该分析的控制流的数量是条件跳转的数量的指数函数。因而, 要被保护的程序的分析的难度可被用数值表示。
根据本发明,可提供一种能够使程序的分析或改动变得甚至更加 困难的技术。
尽管已经参照示例性实施例描迷了本发明,但是应理解,本发明 并不局限于公开的示例性实施例。下文权利要求的范围应被给予最宽 的理解,以便包含所有这样的修改和等同结构及功能。
权利要求
1.一种信息处理装置,包括确定单元,适于在处理目标程序包含的指令之中确定要被修改为伪装指令的目标指令,伪装指令生成单元,适于生成对应于所述目标指令的伪装指令,还原命令生成单元,适于生成用于将所生成的伪装指令还原成所对应的目标指令的还原命令,以及适于通过所生成的伪装指令修改所述处理目标程序中包含的所述目标指令,并将所述还原命令添加到所述程序中的单元,其中,所述还原命令通过参考存储所述处理目标程序中包含的处理命令的输出值的存储器,并基于参考值识别所述程序中的所述目标指令的位置或所述目标指令,执行还原。
2. 根据权利要求1的信息处理装置,其中,所述还原命令参考 存储所述处理目标程序中的计算固定值的处理命令的计算值的存棍' 器,并基于所述参考值识别所述目标指令的位置或所述目标指令。
3. 根据权利要求2的信息处理装置,其中,所述确定单元从所 述处理目标程序中包含的与条件跳转相关联的指令随机确定所述目标 指令。
4. 根据权利要求3的信息处理装置,其中,所述伪装指令生成 单元生成执行与所述目标指令的条件分支不同的条件分支的指令作为 所述伪装指令。
5. —种信息处理方法,包括以下步骤在处理目标程序中包含的指令之中确定要被修改为伪装指令的目标指令,生成对应于所述目标指令的伪装指令,生成用于将所生成的伪装指令还原成所对应的目标指令的还原 命令,以及通过所生成的伪装指令修改所述处理目标程序中包含的所述目标指令,并将所述还原命令添加到所述程序中,其中,所述还原命令通过参考存储所述处理目标程序中包含的处 理命令的输出值的存储器,并基于参考值识别所述程序中的所述目标 指令的位置或所述目标指令,执行还原。
全文摘要
本发明涉及一种信息处理装置及其方法,所述信息处理装置包括适于在处理目标程序中包含的指令之中确定要被修改为伪装指令的目标指令的确定单元,适于生成对应于所述目标指令的伪装指令的伪装指令生成单元,适于生成用于将所生成的伪装指令还原成所对应的目标指令的还原命令的还原命令生成单元,以及适于通过所生成的伪装指令修改所述处理目标程序中包含的所述目标指令,并将所述还原命令添加到所述程序中的单元,其中,所述还原命令通过参考存储所述处理目标程序中包含的处理命令的输出值的存储器,并基于参考值识别所述程序中的所述目标指令的位置或所述目标指令,执行还原。
文档编号G06F9/45GK101403977SQ20081016808
公开日2009年4月8日 申请日期2008年9月27日 优先权日2007年10月5日
发明者大石和臣 申请人:佳能株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1