CN101416197A - 程序混淆装置 - Google Patents

程序混淆装置 Download PDF

Info

Publication number
CN101416197A
CN101416197A CNA200780011709XA CN200780011709A CN101416197A CN 101416197 A CN101416197 A CN 101416197A CN A200780011709X A CNA200780011709X A CN A200780011709XA CN 200780011709 A CN200780011709 A CN 200780011709A CN 101416197 A CN101416197 A CN 101416197A
Authority
CN
China
Prior art keywords
piece
program
attribute
value
mentioned
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.)
Pending
Application number
CNA200780011709XA
Other languages
English (en)
Inventor
佐藤太一
浅井理惠子
K·A·尼克尔森
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.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co Ltd
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 Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Publication of CN101416197A publication Critical patent/CN101416197A/zh
Pending legal-status Critical Current

Links

Images

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/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)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及的程序混淆装置能够将对象程序分割成多个块,确定与块间的输入输出关系相对应地配置的程序命令,从而将计算秘密信息的值的程序命令扩散到各种位置进行配置。具体地说,对于在块间交接的秘密信息计算用的变量,使从块出来时的值和进入下一块时的值一致,在从各块输出的时刻的值成为被期待作为下一块的输入的值的范围内,对各块追加随机的变量转换命令。

Description

程序混淆装置
技术领域
本发明涉及软件保护,尤其涉及程序的混淆。
背景技术
软件保护是指防止软件被篡改、解析、复制等,即,保持软件的机密性。
例如,为了防止复制,有对影像内容等进行加密的技术。但是,加密的程序被使用作为秘密信息的密钥进行了处理,当处理被解析而密钥被非法解析者窃取时,将导致加密后的内容被解密,内容能够自由利用。
此外,还有在图像中嵌入水印来控制复制的技术。但是,当被非法解析者解析了进行这种水印检测的程序的处理/算法时,有可能根据该解析结果制作除去被嵌入到图像中的水印的工具。即,导致对图像数据的复制控制失效,从而能够自由地复制原数据。
由于这样的无法保持软件的机密性的情况会导致对权利者的保护缺失、商业方面损失较大等很多缺陷,因此,期望有使程序的解析变得困难的技术。
应对这种期望,例如在非专利文献1中记述有如下方法:转换程序中包含的秘密信息,使得可通过执行多个程序命令来进行计算,进而将该程序命令扩散到程序中的各种位置,从而使得解析变得困难。
这样的使程序中包含的处理变得复杂、即程序的混淆将会延长程序的解析所需要的时间,结果,具有能够防止程序中包含的秘密信息被解析这样的效果。
非专利文献1:鴨志田、松本、井上、「耐タンパ—ソフトウェアの構成手法に関する考察」、ISEC97—59
但是,这种程序混淆方法有时由于该程序的控制构造而难以变得复杂。
也就说,这是因为,在包括众多分支、循环的控制构造复杂的程序中,到达使用秘密信息的部位的路线(root)将有多个,但是,存在执行时不管通过哪个路线而秘密信息的计算结果都必须相同的限制。
换言之,用于计算秘密信息的处理只能配置在执行时必定通过的路线上。
在该情况下,非法解析者通过重点解析这样的部位例如无分支的程序的入口等,能够比较容易地得到秘密信息。
发明内容
本发明的目的在于,提供一种程序混淆装置,用于生成虽然控制构造复杂但用于使处理变得复杂的程序命令被扩散到较宽范围配置的程序。
为了解决上述课题,本发明的程序混淆装置,根据由多个块构成的对象程序生成混淆程序,其特征在于,上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;上述程序混淆装置具有:属性确定单元,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及生成单元,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
另外,执行控制是指执行程序时可执行的多个路线的选择控制。
发明效果:
本发明涉及的程序混淆装置具有上述结构,由此,块的出口属性和执行控制从该块转移的转移目的地块的入口属性被设定成相同的属性,能保障在这些块之间交接的处理的内容是转移目的地块的预定处理的内容。
因此,在转移目的地块中,能够根据预定处理的内容进行本块的处理。
此外,也可以是,上述对象程序包括秘密信息,上述程序混淆装置还具有块确定单元,该块确定单元确定包含从上述对象程序根据特定变量的值求出上述秘密信息的命令的块,作为秘密块;1个或多个特定变量和1个或多个其值分别与上述属性相对应,上述生成单元对执行控制转移到上述秘密块的块,附加使特定变量成为与该块的出口属性对应的值的1个或多个命令,生成混淆程序。
由此,块的出口属性和执行控制从该块转移的转移目的地块的入口属性被设定成相同的属性,能保障在这些块之间传送的特定变量的值是转移目的地块的预定值。这是因为特定变量根据属性确定。
因此,即便在执行控制转移到秘密块之前的块内追加了想要使用特定变量的程序命令,只要在相关块的出口中特定变量成为与出口属性对应的值,在秘密块中就能够使用特定变量求出秘密信息。
换言之,由于需要根据特定变量求出秘密信息,因此,只要秘密信息不直接出现在程序中,求出秘密信息的式等就会远离秘密信息的位置,因此难以发现秘密信息的位置,结果,可避免秘密信息被窃取的可能性提高。
此外,也可以是,在执行控制转移到上述秘密块的块存在多个的情况下,上述生成单元对全部该块附加使特定变量成为与该块的出口属性对应的值的1个或多个命令,生成混淆程序。
由此,不管执行时通过哪个路线,在秘密块的入口中特定变量都是预定值,因此,在秘密块中能够使用特定变量求出秘密信息。
此外,也可以是,上述生成单元还对可在上述秘密块之前执行的块附加1个或多个命令,生成混淆程序,所述1个或多个命令使特定变量从与该块的入口属性相对应的特定变量的值成为与该块的出口属性相对应的值。
由此,可连续执行的块之间彼此共享属性,进行与属性对应的转换,因此,能够对全部块附加用于混淆的程序命令。
换言之,即便在全部块内追加了使用特定变量的各种程序命令,只要在块的出口中特定变量成为与出口属性对应的值,在各块中就能够增加按照入口属性抵消转换的处理,能够保证混淆前的处理结果。
即,即使是控制构造复杂的程序,也能够在全部块内追加程序命令,能够使得程序的解析变得困难。
就是说,能够混淆在现有技术中困难的针对复杂控制构造的处理。
在本发明中,至少在不进行利用调试器等强制改变程序执行顺序等的执行时(以下称作“在正常系统中执行时”),能够在该块内追加抵消在转移到块之前增加的转换的功能。这是因为在执行控制转移的块间共享属性,因而增加与入口属性相对应的转换是可靠的。
因此,至少在正常系统中执行时,能保证块内的程序的执行结果不变化,因此,基于附加的程序命令进行的混淆能够与程序的控制构造无关地对程序中的多种部位实施。
将循环作为例子提出时,不管循环几次,通过混淆附加的处理的影响都会在循环内部抵消,因而从循环部位输出的结果与混淆前相同。即,程序的输出结果在混淆前后不变化。
因此,在现有技术中为了使程序的输出结果在混淆前后相同,限制了进行处理复杂化的部位,与此相对,在本发明中,能够进行没有这种限制的处理的复杂化。
此外,也可以是,上述程序混淆装置还具有变量追加单元,该变量追加单元追加上述对象程序中不包含的变量,上述特定变量是由上述变量追加单元追加的变量。
由此,能够使用在混淆前的程序中没有执行使用的变量,生成混淆后程序,因此,能够不对执行原来的程序带来影响地进行混淆,能够保护秘密信息。
此外,也可以是,存在多个与块的入口或出口的属性相对应的特定变量的值,上述生成单元附加使特定变量从与块的入口属性相对应的特定变量的某个值成为与该块的出口属性对应的某个值的1个或多个命令。
由此,块的入口中的特定变量的值不是1个,因此,能够使得使用调试器等的程序执行中的解析变得更加困难。
此外,也可以是,存在多个上述特定变量,上述生成单元对一个块按照该块的出口属性附加替换特定变量中的1个特定变量的值和其它特定变量的值的命令,对执行控制从上述一个块的出口转移的其他块,按照该块的入口属性,附加替换上述特定变量的值和上述其它特定变量的值的命令,生成混淆程序。
由此,能够使特定变量的作用按照每个块而不同,因此,能够使得程序的解析变得更加困难。
此外,也可以是,预定运算分别与上述属性相对应,上述生成单元对一个块附加如下命令,该命令使得对特定变量的值实施了与该块的出口属性相对应的预定运算后的结果值成为该特定变量的值,上述生成单元对执行控制从上述一个块的出口转移的其他块附加如下命令,该命令使得对该特定变量的值实施了与该块的入口属性相对应的预定运算的逆运算后的结果值成为该特定变量的值,从而从而生成混淆程序。
由此,能够使特定变量的值按照每个块而不同,因此,能够使得程序的解析变得更加困难。
此外,也可以是,上述程序混淆装置还具有对块进行加密的加密单元,加密密钥分别与上述属性相对应,上述生成单元利用与块的出口属性相对应的加密密钥,附加进行如下处理的1个或多个命令,该处理是对执行控制从该块的出口转移的其他块进行解密的处理,由上述加密单元利用与该块的入口属性相对应的加密密钥对附加有上述1个或多个命令的块进行加密,生成混淆程序。
由此,能够利用按照每个块而不同的密钥进行加密,因此,能够使得程序的解析变得更加困难。
此外,也可以是,本发明的程序混淆装置根据由多个块构成的对象程序生成混淆程序,其特征在于,上述块是由具有顺序的多个命令构成的命令组,上述程序混淆装置具有:属性确定单元,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及生成单元,对1个或多个块,在来自入口的全部执行控制通过的部分附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
由此,即使块是更大的块也能够进行混淆,因此,能够缩短混淆涉及的处理速度。
此外,也可以是,本发明的程序混淆装置根据由多个块构成的对象程序生成混淆程序,其特征在于,上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;上述程序混淆装置具有:属性确定单元,对块中的执行控制的入口和出口分别确定属性;以及生成单元,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序,1个或多个特定变量和1个或多个其值分别与上述属性相对应,对应于转移源的全部块的出口属性的值,与执行控制从多个块转移来的块的入口属性相对应,上述生成单元对1个或多个块,附加进行如下处理的1个或多个命令,生成混淆程序,该处理是使特定变量从与块的入口属性相对应的特定变量的值中的任意值都成为与该块的出口属性相对应的值的处理。
由此,在执行控制从多个块转移到1个块的情况下,也可以使执行控制转移源的块的出口属性在全部块中不同,因此,这些块的出口中的特定变量的值不同,能够使得程序的解析变得更加困难。
附图说明
图1是本发明涉及的程序混淆装置的计算系统的例子。
图2是表示程序混淆装置1000的结构例的框图。
图3是表示混淆的对象程序2000的例子的图。
图4是表示将对象程序混淆后的混淆程序3000的例子的图。
图5是表示程序混淆装置1000的混淆处理的流程图。
图6是表示追加了追加变量的对象程序2100的图。
图7是表示块分割部1200根据对象程序2100生成的基本块即块B1~块B5的图。
图8是表示对象程序2100的控制流的图。
图9是表示属性信息分配表生成部1320生成的属性信息分配表1800的生成过程、结构以及内容的例子的图。
图10是表示属性信息分配表生成处理的流程图。
图11是表示对各块的入口和出口设定的属性的控制流。
图12是表示映像对应表1900的结构和内容的例子的图。
图13是表示块转换部1400转换块B1~块B5而生成的转换后块的图。
图14是表示包括转换后的秘密块在内的混淆后程序3000的图。
图15是表示实施方式2的映像对应表4900的结构和内容的例子的图。
图16是表示实施方式2涉及的程序混淆装置4000的结构例的框图。
图17是表示由块转换部4400转换而生成的转换后块B2的图。
图18是表示块B2的入口和出口的转换的图。
图19是表示基于程序命令组G_2_4的置换的图。
图20是表示实施方式3的映像对应表5900的结构和内容的例子的图。
图21是表示实施方式3涉及的程序混淆装置5000的结构例的框图。
图22是表示由块转换单元5400转换而生成的转换后块B2的图。
图23是表示实施方式4的映像对应表6900的结构和内容的例子的图。
图24是表示实施方式4涉及的程序混淆装置6000的结构例的框图。
图25是表示实施方式4的转换后块的图。
图26是表示块转换部的处理的流程图。
图27是表示以往的混淆方法的一例的示意图。
图28是表示混淆前的原始程序9100的图。
图29是表示原始程序9100的的控制流的图。
图30是表示配置有计算秘密信息的程序命令的混淆后程序的控制流的图。
图31是表示扩散了计算秘密信息的程序命令的混淆后程序的控制流的图。
符号说明
10 计算系统
1000、4000、5000 程序混淆装置
1100 变量追加部
1200 程序分割部
1300 映像信息生成部
1310 控制流生成部
1320 属性信息分配表生成部
1330 映像对应表生成部
1400 块转换部
1500 秘密块转换部
1800 属性信息分配表
1900、4900、5900、6900 映像对应表
2000、2100 对象程序
3000 混淆程序
9100 原始程序
具体实施方式
<实施方式1>
<概要>
本发明涉及的程序混淆装置能够生成虽然包括众多分支和循环在内的控制构造复杂但在到达使用秘密信息的部位的全部路线上配置了用于使处理变得复杂的程序命令而成的程序。
在说明本发明之前,使用图28~图31简单说明以往的程序混淆。以往的程序混淆的方法及其课题的详细情况将在后面说明。
<以往的程序混淆>
图28是表示混淆前的原始程序9100的图,由程序命令组9110构成。设定秘密信息是程序命令9101的“123”。
图29是表示由块9111~块9115构成的原始程序9100的的控制流的图。此外,图30和图31是表示配置有计算秘密信息的程序命令的混淆后程序的控制流的图,分别由块9211~块9215、块9311~块9315构成。
在图30中,对原始程序9100追加新的变量“c”(参照块9211下划线部分),追加使用追加的变量“c”计算秘密信息“123”的处理,通过将秘密信息“123”置换成“c”(参照块9215下划线部分)来生成混淆程序。
在图31中示出了将在图30中追加的程序命令扩散到程序中的各种位置的程序。
在此,该程序命令无法移动到条件分支的单侧,此外,也无法进入循环的内容。这是因为将秘密信息“123”置换而成的“c”的值成为不同于“123”的值。
由此,在本程序例中,为了保证“c”的值最终成为“123”,程序命令将移动到块9311。
这样,在现有方法中,在包括分支和循环在内的程序中,可移动程序命令的位置较少,结果,程序命令没有充分扩散而集中到特定的部位、即除了难以扩散程序命令的部位以外的部位(不受分支和循环等影响的部位)。因此,通过重点解析这样的特定的部位,能够比较容易地找到计算秘密信息的程序命令组。
本发明涉及的程序混淆装置即使在以往难以扩散程序命令的部位也能够配置程序命令。
以下,说明本发明的实施方式的程序混淆装置。
本实施方式是按照通过执行多个程序命令来进行计算的方式转换秘密信息的混淆的一例,对混淆前的程序(以下称作“对象程序”)追加新的变量,将秘密信息置换成根据该变量计算出的式,将至此的式配置于较宽范围来生成混淆后的程序(以下称作“混淆程序”)。
<结构>
图1是本发明涉及的程序混淆装置的计算系统的例子。
计算系统10包括通用计算机20、用于显示程序等的显示器11、从键盘等接受用户的指示来进行处理的输入装置12、以及存储程序等的外部存储器13。计算机20包括管理输入输出的I/O部21、进行运算的CPU(CentralProcessing Unit:中央处理单元)22以及存储器23,具有通常的计算机的功能。
本发明涉及的用于执行程序混淆的混淆程序存储在存储器23或外部存储器13中,通过被CPU22执行,实现混淆处理。从外部存储器13经由I/O部21适时读入对象程序,进行混淆,并经由I/O部21将混淆程序写入外部存储器13。
以下,使用图2说明本发明涉及的程序混淆装置1000的结构。
图2是表示程序混淆装置1000的结构例的框图,程序混淆装置1000包括变量追加部1100、程序分割部1200、映像信息生成部1300、块转换部1400以及秘密块转换部1500。此外,还具有从装置外部读入对象程序2000的输入部(未图示)、输出混淆程序3000的输出部(未图示)。
对象程序2000被输入部读入,由变量追加部1100、程序分割部1200、映像信息生成部1300、块转换部1400以及秘密块转换部1500依次处理,混淆程序3000被输出部输出。
图3是表示混淆的对象程序2000的例子的图,图4是表示将对象程序混淆后的混淆程序3000的例子的图。
以下,简单说明各功能部,使用图3~图13交替详细说明具体例子。
首先,变量追加部1100具有如下功能:对对象程序2000追加在对象程序2000中没有使用的新的变量(以下称作“追加变量”)。
接着,程序分割部1200具有如下功能:将对象程序分割成由1个以上的程序命令构成的多个块。
映像信息生成部1300具有生成使追加变量与某值对应的映像的功能,包括控制流生成部1310、属性信息分配表生成部1320以及映像对应表生成部1330。
控制流生成部1310具有生成对象程序的控制流的功能,属性信息分配表生成部1320具有如下功能:参照控制流对块的入口和出口分配属性,生成属性信息分配表。
此外,映像对应表生成部1330具有如下功能:按照属性信息分配表的每个属性确定映像,生成映像对应表。
另外,使用图9、图12在后面说明属性信息分配表和映像对应表。
块转换部1400具有如下功能:根据由映像信息生成部1300生成的映像,对各块追加用于转换追加变量的值的程序命令。
秘密块转换部1500具有如下功能:使用追加变量,对包括秘密信息的块(以下称作“秘密块”)追加用于计算秘密信息的程序命令。
<动作>
图5是表示程序混淆装置1000的混淆处理的流程图。使用该图说明由对象程序2000生成混淆程序3000的处理。此时,一并说明各功能部的详细功能。另外,虚线的矩形表示进行虚线矩形内的处理的各功能部。
对象程序2000包括函数func,函数func将变量pm_a、pm_b、pm_c作为输入,进行程序命令组2010的处理,输出变量pm_b。此外,设定程序命令2001的“123”是秘密信息(参照图3)。
混淆程序3000对对象程序2000追加多个程序命令,在程序命令3001中,秘密信息“123”被转换成式“3*pm_0+4*pm_1—40”(参照图4)。
以下,沿着图5的流程图说明混淆处理。
首先,输入部将对象程序2000读入内部的作业存储器(步骤S110)。
<变量追加部1100的处理>
接着,变量追加部1100对读入的对象程序2000追加变量(步骤S120)。
图6表示追加了追加变量的对象程序2100。
在本实施方式中,设定追加“pm_0”和“pm_1”这2个变量。
变量追加部1100随机确定追加变量“pm_0”和“pm_1”的初始值,在此,分别确定为“0”、“1”,对对象程序2000追加追加变量“pm_0”、“pm_1”的变量说明。
变量说明部2110是对该程序追加的追加变量“pm_0”、“pm_1”的变量说明。
另外,要追加的变量的数量、要追加的变量的名称、变量的类型可以是固定的,也可以是由用户从输入装置12输入,还可以是随机确定的。此外,追加变量也可以是数组的结构。
此外,在本实施方式中,说明作为需要变量说明的编程语言即C语言的情况,但追加变量的定义方法等与程序语言对应(以下相同)。例如,在不需要变量说明的BASIC这样的语言中,由于不需要变量说明,因此仅记述初始值的设定即可。
<程序分割部1200的处理>
变量追加部1100将追加了追加变量的对象程序2100转发到程序分割部1200,程序分割部1200分割对象程序2100中的程序命令组2010,生成多个基本块(步骤S130)。
图7表示块分割部1200根据对象程序2100生成的基本块即块B1~块B5。
在此,基本块是指由1个以上的程序命令构成的程序命令组,是指在程序命令组的起始以外不合流、在程序命令组的最后以外不分支的程序命令组。
更详细地说,在生成基本块的情况下,首先,将下面三个程序命令的某个设为块的开始程序命令。第1个是程序入口的程序命令(程序的最开始执行的程序命令),第2个是处理合流的程序命令、例如Label语句。第3个是分支的程序命令、例如goto语句的下一个程序命令。
接着,将下面三个程序命令的某个确定为结束程序命令。第1个是处理在开始命令程序之后合流的程序命令的前一个程序命令,第2个是程序出口的命令(程序的最后执行的命令),第3个是作为分支的程序命令。
将由从开始程序命令到结束程序命令的程序命令构成的程序命令组设为基本块。
构成对象程序2100的全部程序命令通过基本块生成步骤被分割成包含于某个基本块中(参照图7)。另外,设这些对象程序或块能够根据需要由其他功能部进行参照等。
<映像信息生成部1300的处理>
程序分割部1200将生成的块转发到映像信息生成部1300,映像信息生成部1300生成对各块的入口和出口设定的映像信息。这些处理由构成映像信息生成部1300的控制流生成部1310、属性信息分配表生成部1320以及映像对应表生成部1330进行。
在此,说明对各块的入口和出口设定的映像信息。
这些入口的映像信息(以下称作“入口映像信息”)和出口的映像信息(以下称作“出口映像信息”)是块转换部1400或秘密块转换部1500转换块时使用的信息。
映像信息表示如下映像:将以pm_X(X=0、1)可取的值为元素的集合设为集合PM_X,并使满足pm_0_before∈PM_0、pm_1_before∈PM_1的(pm_0_before、pm_1_before)与满足pm_0_after∈PM_0、pm_1_after∈PM_1的(pm_0_after、pm_1_after)相对应,映像的像(pm_0_after、pm_1_after)成为1点(例如(0、1))。
例如,映像信息“pm_0_after=0;pm_1_after=1;”表示使满足pm_0_before∈PM_0、pm_1_before∈PM_1的全部(pm_0_before、pm_1_before)与(0、1)对应的映像。更具体地说,其是表示将追加变量pm_0、pm_1的值设为(pm_0_after、pm_1_after)的值的(0、1)的转换的映像。
<控制流生成部1310的处理>
块分割部1200经由映像信息生成部1300将分割对象程序2100而生成的基本块转发到控制流生成部1310,控制流生成部1310生成控制流(步骤S140)。
图8是表示对象程序2100的控制流的图。
控制流是由节点和边(edge)构成的曲线图,在该图中,节点1~节点5表示构成控制流的节点,边1~边6表示构成控制流的边。
控制流生成部1310采用以下方法根据对象程序2100的基本块(参照图7)生成图8所示的控制流。
首先,控制流生成部1310生成与对象程序2100中包含的块B1~块B5对应的节点1~节点5。
接着,在从第一块到第二块存在分支的情况下,从第一块对应的节点到第二块对应的节点设置边。
例如,在块B1中,在程序命令“if(pm_a>pm_b)goto label C;”中的条件式“pm_a>pm_b”为伪的情况下,分支到块B2,在真的情况下,分支到与“label C:”对应的块B3。
由此,设置从与块B1对应的节点1到与块B2对应的节点2的边1以及从与块B1对应的节点1到与块B3对应的节点3的边2。
以下同样地设置边3~边6。
另外,在本说明书中,不限于存在多个分支目的地的分支,而将引起块间移动的情况全部称作“分支”。
对于控制流的生成,在“コンパイラの構成と最適化”(中田育夫、朝書店(1999年))的P268~270中有详细记载。
<属性信息分配表生成部1320的处理>
生成控制流的控制流生成部1310将生成的控制流转发到属性信息分配表生成部1320,属性信息分配表生成部1320根据转发来的控制流生成属性信息分配表1800(步骤S150)。
属性信息分配表生成部1320对控制流生成部1310生成的块的入口和出口设定属性。后面说明的映像对应表生成部1330对该属性确定映像信息,对各块的入口和出口设定映像信息。设定将对入口设定的属性称作入口属性,将对出口设定的属性称作出口属性。
在对该块的入口和出口设定属性时,在从第一块到第二块存在分支的情况下,第一块的出口属性和第二块的入口属性是相同的映像信息。
例如,在图8所示的控制流中,从与块B1对应的节点1到与块B2对应的节点2存在边1所示的分支,因此,对块B1的出口属性和块B2的入口属性设定相同的属性。
即,对边分配属性,使得对边两端的入口和出口分配相同的属性。
此外,按照每个相连接的边的整体分配1个属性。
例如,在节点3的出口相连接的边4和边5、以及在节点3的入口与边4连接的边2、在节点1的出口与边2连接的边1分配相同的属性。
通过对这些边分配相同的属性,边1、边2、边4和边5两端的入口和出口成为相同的属性。具体地说,节点1的出口、节点2的入口、节点3的入口和出口以及节点4的入口成为相同的属性。
图9是表示属性信息分配表生成部1320生成的属性信息分配表1800的生成过程、结构以及内容的例子的图。
属性信息分配表1800由块1810、边1820以及属性1830构成。
块1810表示块B1~块B5各自的入口和出口,边1820表示分别连接块的入口和出口的边的序号。例如,“1”表示边1。此外,属性1830表示对块的入口和出口分别设定的属性。
使用图10说明该属性的确定方法。
图10是表示属性信息分配表生成处理的流程图。
首先,属性信息分配表生成部1320生成具有控制流生成部1310生成的块数的2倍的栏的表(步骤S310)。
在此,由于控制流生成部1310生成的块数是5,因此,生成由10个栏构成的表(参照图9)。
接着,属性信息分配表生成部1320对属性1830按照升序设定不同的数值作为初始值。具体地说,对属性1830的块1810“块B1入口”的栏至“块B5出口”的栏设定初始值“1”、“2”、…“10”(步骤S320:参照图9的属性1830)。
设定了初始值的属性信息分配表生成部1320对计数器n设定1,上述计数器n用于对重复执行S340至S360的次数进行计数(步骤S330)。
接着,对出口的边1820为“n”的块即成为边起点的块的出口的属性1830的值A、入口的边1820为“n”的块即成为边终点的块的入口的属性1830的值B进行比较,将较大一方的值设为X,将较小一方的值设为Y,在映像信息分配表中将值为X的栏的值置换成Y(步骤S340)。
例如,在“n==1”的情况下,即出口的边1820为“1”的块是块B1,入口的边1820为“1”的块是块B2。这些“块1出口”和“块2入口”的属性1830分别是“2”和“3”,用较小的值“2”置换“3”。即,将块B2入口的属性1830从“3”设为“2”(参照属性1801)。
接着,增加n的值(步骤S350)。
判定n的值是否大于边的总数、在本例子中为“6”,在大于的情况下(步骤S360:是),由于针对全部边的处理已结束,因此结束处理,在小于的情况下(步骤S360:否),对接下来的边持续处理(步骤S340)。
接着,在“n==2”的情况下,比较成为边2始点的块B1的出口属性的值“2”、和成为终点的块B3的入口属性的值“5”,将较大一方的值X设为“5”,将较小一方的值Y设为“2”。将存在值“5”的栏的值置换成“2”(参照属性1802),将10个栏的值更新成“1、2、2、4、2、6、7、8、9、10”。
同样,在“n==3”的情况下,由于成为边3始点的块B2的出口属性的值是“4”、和成为终点的块B5的入口属性的值是“9”,因此,将存在值“9”的栏的值置换成“4”(参照属性1803),将10个栏的值更新成“1、2、2、4、2、6、7、8、4、10”。
同样地进行到“n==6”,用块B5的入口属性的值“4”置换块B4的出口属性的值“8”(参照属性1804),将10个栏的值更新成“1、2、2、4、2、2、2、4、4、10”(参照属性1831)。
图11是表示对各块的入口和出口设定的属性的控制流。
<映像对应表生成部1330的处理>
生成了属性信息分配表1800的属性信息分配表生成部1320将生成的属性信息分配表转发到映像对应表生成部1330,映像对应表生成部1330生成使映像信息与转发来的属性信息分配表的各属性对应的映像对应表1900(步骤S160)。
映像对应表1900表示属性信息分配表1800中与属性对应的映像信息。因此,通过参照该映像对应表1900,可得到分配给各块的映像信息。
此外,设定属性信息分配表1800和映像对应表1900在未图示的存储器上生成。
映像对应表生成部1330生成构成映像信息分配表1800的属性1831的属性数的映像信息。
图12是表示映像对应表1900的结构和内容的例子的图。
属性1950是映像信息分配表1800的最终属性1831的属性一览。此外,映像对应表1900由ID1910和映像信息1920构成。ID1910是映像信息1920的识别符,设定与属性1950对应(参照图12:虚线箭头)。
在本实施例中,映像信息分配表1800的最终属性1831中属性有4种、即“1”、“2”、“4”、“10”(参照图9),因此,生成4种映像信息。
以下,参照具体例子说明映像对应表生成部1330生成映像信息1920的顺序。
首先,根据变量追加部1100追加的追加变量的初始值,设定成为控制流始点的与块的入口属性对应的映像信息1920。
在本实施例中,成为始点的块B1的输入属性是“1”(参照图11),追加变量“pm_0”、“pm_1”的初始值分别是“0”、“1”。
因此,生成将“pm_0”、“pm_1”的初始值作为“pm_0_after”、“pm_1_after”的映像信息,作为与属性1950“1”对应的ID1910“F1”的映像信息1920(以下称作“映像信息F1”等)。
即,将“pm_0_after=0;pm_1_after=1;”设为映像信息F1(参照图12:ID1910“F1”)。
接着,随机生成针对始点的输入属性以外的属性“2”、“4”、“10”的映像。
在本实施方式中,生成将满足pm_X∈PM_X(X=0、1)的随机值pm_X作为pm_X_after的值的映像信息,作为对应于属性“2”“4”“10”的映像信息。
在本实施方式中,将属性“2”的映像信息F2设为“pm_0_after=30;pm_1_after=6;”,将属性“4”的映像信息F4设为“pm_0_after=12;pm_1_after=7;”,将属性“10”的映像信息F10设为“pm_0_after=13;pm_1_after=31;”(参照图12:映像对应表1900)。
<块转换部1400的处理>
生成了映像对应表1900的映像对应表生成部1330将生成的映像对应表转发到块转换部1400,块转换部1400根据转发来的映像对应表对各块追加程序命令,生成转换后块(步骤S170)。
进行步骤S170的处理,直到对全部块、在本实施方式中块B1~块B5分别追加程序命令为止(步骤S180)。
图13是表示块转换部1400转换块B1~块B5而生成的转换后块的图。程序命令组1401~程序命令组1405表示对各个块追加的程序命令。
块转换部1400生成对原来的块保持的功能进行功能追加而成的块,作为转换后块。
在此,在追加变量的值是入口映像信息所示的值的情况下,追加的功能是将追加变量的值转换成出口映像信息所示的值的功能。具体地说,追加执行这种功能的程序命令。
以下,在说明追加的功能的具体例子后,说明用于实现追加的功能的程序命令的生成。
<追加的功能>
首先,说明对块B1追加的功能。
对块B1追加的功能是将映像信息F1转换成映像信息F2这样的功能(参照图11),将实现该功能的程序命令组称作“G_1_2”。
块B1的入口映像信息F1是“pm_0_after=0;pm_1_after=1;”,出口映像信息F2是“pm_0_after=30;pm_1_after=6;”(参照图12:映像对应表1900)。
因此,对块B1追加的功能是如下功能:在(pm_0、pm_1)的值是入口映像信息F1中的(pm_0_after、pm_1_after)的值(0、1)的情况下转换(pm_0、pm_1)的值,使得(pm_0、pm_1)的值与出口映像信息F2的(pm_0_after、pm_1_after)表示的(pm_0、pm_1)的值(30、6)相等。
具体地说,在“pm_0=0”、“pm_1=1”的情况下,是成为“pm_0=30”、“pm_1=6”这样的命令组,程序命令组G_1_2成为“pm_0=pm_0*5+pm_1*20+10;pm_1=pm_1*13—7;”(参照图13:程序命令组1401)。
另外,如何生成这种命令将在后面说明。
通过追加程序命令组G_1_2、即程序命令组1401,在(pm_0、pm_1)的值是入口映像信息F1中的(pm_0_after、pm_1_after)的值(0、1)的情况下,执行程序命令组1401“pm_0=0*5+1*20+10;pm_1=1*13—7;”,从而成为(pm_0、pm_1)=(30、6)。这是与出口映像信息F2的(pm_0_after、pm_1_after)表示的(pm_0、pm_1)的值相等的值。
并且,对其它块、块B2~块B5也追加具有相同功能的程序命令组。
即,程序命令组1402~程序命令组1405也同样是由于进行如下处理的程序命令组:若代入各块的入口映像信息中的(pm_0_after、pm_1_after)的值时,则成为各块的出口映像信息中的(pm_0_after、pm_1_after)(参照图13)。
<追加的处理的生成>
以下,详细说明怎样生成上述的程序命令组G_1_2。
说明生成针对作为入口映像信息具有F_IN、作为出口映像信息具有F_OUT的块的命令组G_IN_OUT的情况。
例如,在生成对块B1追加的命令组的情况下,F_IN和F_OUT是F1和F2,在生成对块B2追加的命令组的情况下,F_IN和F_OUT是F_2和F_4。
首先,将随机生成的常量设为R1、R2、R3,将式1、式2设为式1“pm_0_after—pm_0_before*R1—pm_1_before*R2”、式2“pm_1_after—pm_1_before*R3”。
接着,将出口映像信息F_OUT的(pm_0_after、pm_1_after)的值代入(pm_0_after、pm_1_after),将入口映像信息F_IN的(pm_0_after、pm_1_after)的值代入(pm_0_before、pm_1_before),计算式1、式2的值,将各自的值设为V1、V2。
使用计算出的V1、V2,将追加程序命令组G_IN_OUT设为“pm_0=pm_0*R1+pm_1*R2+V1;pm_1=pm_1*R3+V2”。
以下,作为具体的一例,说明将R1、R2、R3分别设为“5”“20”“13”而生成对块B1追加的追加程序命令组G_1_2的处理。
若代入上述的R1、R2、R3的值,则式1、式2成为“pm_0_after—pm_0_before*5—pm_1_before*20”、“pm_1_after—pm_1_before*13”。
将出口映像信息F2的值(30、6)代入上式(pm_0_after、pm_1_after)、将入口映像信息F1的值(0、1)代入上式(pm_0_before、pm_1_before)时,分别成为“30—0*5—1*20”、“6—1*13”。即,V1、V2分别成为“10”、“—7”。
由此,程序命令组G_1_2成为“pm_0=pm_0*5+pm_1*20+10;pm_1=pm_1*13—7;”。将这样生成的追加程序命令组G_1_2追加到块B1的起始,成为转换后块(参照图13:程序命令组1401)。
<秘密块转换部1500的处理>
生成了转换后块的块转换部1400将生成的转换后块转发到秘密块转换部1500,秘密块转换部1500根据转发来的转换后块确定包括秘密信息的秘密块(步骤S190),置换成使用追加变量计算秘密信息的式,生成混淆程序(步骤S200)。
在此,秘密块的确定方法中,从对象程序2000检测秘密信息,将包含该秘密信息的块确定成秘密块。
作为检测秘密信息的方法,预先用特定的代码包围秘密信息、或者在混淆开始前由用户指定等,从而可由秘密块转换部1500识别。此外,秘密块中可以有多个秘密信息,此外,对象程序中可以有多个秘密块。
接着,秘密块转换部1500变更成使用由变量追加部1100追加的追加变量来计算程序中包含的秘密信息的处理。
图14表示包含这样生成的转换后的秘密块在内的混淆后程序3000。
以下,说明使用追加变量计算秘密信息的程序命令的求出方法。
首先,将随机生成的常量设为R4、R5,生成以下的式3。
式3“pm_0_after—pm_0_before*R4—pm_1_before*R5”。
接着,将秘密信息的值代入“pm_0_after”、将秘密块的出口映像信息F_OUT的(pm_0_after、pm_1_after)的值代入(pm_0_before、pm_1_before),计算式3的值,将计算出的值设为V3。
在此,以作为秘密块的块B5(参照图13)中包含的秘密信息的值“123”的转换为例进行说明。
包含秘密信息“123”的块是块B5,块B5的出口映像信息F10的(pm_0_after、pm_1_after)是(13、31)。
将R4、R5分别设为“3”、“4”,将它们代入式3,由“123—13*3—31*4”求出V3的值“—40”。
接着,将秘密信息的值置换成“(pm_0*R3+pm_1*R4+V3)”。即,将程序命令“b=b*123;”置换成“b=b*(3*pm_0+4*pm_1—40);”(参照图14:程序命令1501)。
在此,最终得到的上式成为如下式:计算将随机数R3、R4乘以块B5中的输入映像信息(pm_0_before、pm_1_before)的值后相加的运算结果和与秘密信息“123”之间的差分V3并相加。
由此,在入口属性是属性信息分配表1800的属性1831所示的值“4”(参照图9)的情况下,上式的计算结果总是可得到秘密信息“123”。
混淆后程序3000是具有由秘密块转换部1500生成的秘密信息转换后的块B5、和由块转换部1400生成的转换后的块B1~块B4的程序。
混淆后程序3000由输出部输出到外部存储器13(步骤S210)。
(实施方式1的效果)
在实施方式1中,示出将秘密信息转换成可通过执行多个程序命令来计算出的混淆的一例。该混淆方法具有以下3点特征。
(1)将成为控制流始点的块、例如块B1的输入属性F_IN设为追加变量的初始值(参照映像对应表生成部1330的处理)。
(2)在追加变量是该块的入口映像信息F_IN所示的值的情况下,对各块追加转换成该块的出口映像信息F_OUT所示的值的功能(参照块转换部1400的处理)。
(3)与具有多个分支源的节点的全部分支源的节点相对应的块的出口映像信息等于与分支目的地的节点相对应的块的入口映像信息(参照属性信息分配表1800)。例如,如块B5那样具有2个分支源块B2和块B4的情况下,块B2和块B4相对于块B5的出口映像信息等于块B5的入口映像信息(参照图11)。
根据以上3点特征,在正常系统的执行时,不管以怎样的执行路线执行混淆后程序,追加变量的值都是在(2)中对其秘密块设定的入口映像信息所示的值。
由此,在正常系统的执行时,不管以怎样的执行路线执行混淆后程序,根据包含秘密信息的块B5的入口映像信息计算出的秘密信息的值都是正确的值“123”。
在本实施方式的混淆程序中,计算追加变量的值的程序命令被追加到全部块中。此外,秘密信息使用追加变量进行计算。由此,在非法解析者想要找到追加的程序命令来解析秘密信息的值的情况下,由于追加的程序命令位于程序的各种位置,因此难以找到追加的全部程序命令。因此,在到达秘密信息之前需要较长时间,结果可保护秘密信息。
<实施方式2>
<概要>
在实施方式1中,追加新的变量,将计算该追加变量的值的程序命令追加到全部块中,并且,将秘密信息置换成由该追加变量算出的式而生成混淆程序,相对于此,在本实施方式中,利用对象程序中已经存在的变量,在程序中途置换该变量的作用而生成混淆程序。
在此,说明与实施方式1之间的差异。
差异在于映像信息不同。图15表示本实施方式的映像对应表4900。
映像对应表4900由ID1910和映像信息4920构成,ID1910与实施方式1相同,是映像信息4920的识别符。此外,变量的置换关系4930不构成映像对应表4900,为了便于说明,使用箭头表示变量的置换关系。
即,在实施方式1的映像对应表1900(参照图12)中,根据属性确定存在变量值的值,在本实施方式中,根据属性确定变量值是哪个变量的值。
<结构>
图16是表示实施方式2涉及的程序混淆装置4000的结构例的框图。
与实施方式1的程序混淆装置1000的结构(参照图2)的不同点有4点。
第1点是没有变量追加部1100;第2点是映像信息生成部4400的映像对应表生成部4330生成的映像内容不同。第3点是映像内容不同引起的块转换部4400追加的程序命令组的生成方法不同。此外,第4点是由于没有追加追加变量而秘密块转换部4500的秘密信息的计算方法不同。
<动作>
以下,说明映像信息生成部4400的映像对应表生成部4330、块转换部4400、秘密块转换部4500的处理。其它动作与实施方式1相同(参照图5等)。
<映像信息生成部4400的映像对应表生成部4330的处理>
映像信息生成部4400生成对由程序分割部1200生成的各块的入口和出口设定的映像信息。
简单说明在本实施方式中设定的映像信息。
映像信息表示置换变量作用的映像,即,该映像将以pm_X(X=a、b、c)可取的值为元素的集合设为集合PM_X(X=a、b、c),使满足pm_a_before∈PM_A、pm_b_before∈PM_B、pm_c_before∈PM_C的(pm_a_before、pm_b_before、pm_c_before)对应于满足pm_a_after∈PM_A、pm_b_after∈PM_B、pm_c_after∈PM_C的(pm_a_after、pm_b_after、pm_c_after)。
具体地说,例如映像信息“pm_a_after=pm_a_before;pm_b_after=pm_c_before;pm_c_after=pm_b_before;”表示如下映像:在变量(pm_a、pm_b、pm_c)的值分别是(pm_a_before、pm_b_before、pm_c_before)的情况下,将各个值代入变量(pm_a_after、pm_c_after、pm_b_after)。即,上述映像信息表示如下映像:该映像表示出将变量(pm_a、pm_b、pm_c)的作用分别置换成变量(pm_a、pm_c、pm_b)的置换。
<映像对应表生成部4330的处理>
映像对应表生成部4330与实施方式1相同,生成与属性信息分配表1800的属性对应的表示映像信息的映像对应表4900。
另外,在本实施方式中,属性信息分配表与实施方式1的属性信息分配表1800相同(参照图9)。
映像对应表生成部4330生成构成属性信息分配表1800的属性的种类数、即4种的映像信息。
各映像信息的生成例如如下进行。
使从pm_a_before、pm_b_before、pm_c_before中随机选择出的1个与pm_a_after对应,使从剩余2个中随机选择出的1个与pm_b_after对应,使剩余的1个与pm_c_after对应。
例如,在依次选择出“pm_a_before、pm_c_before”的情况下,映像信息成为“pm_a_after=pm_a_before;pm_b_after=pm_c_before;pm_c_after=pm_b_before;”。
在本实施方式中,将与成为图11的控制流始点的块B1的入口映像信息的属性“1”相对应的映像信息F1设为“pm_a_after=pm_a_before;pm_b_after=pm_b_before;pm_c_after=pm_c_before;”。
此外,依次确定与其它属性“2”“4”“10”对应的映像信息,完成映像对应表4900。
<块转换部4400的处理>
块转换部4400生成对原来的块保持的功能进行功能追加而成的块,作为转换后块。追加的功能是在进行了入口映像信息所示的变量的置换的情况下进行表示出口映像信息的变量的置换的功能。此外,该置换是采用在原本存在程序命令中使用的变量来进行的。
以下,在说明追加的功能和变量的置换后,说明用于实现追加的功能的处理的生成。
<追加的功能>
使用具体例子说明对块追加的功能。
图17是表示由块转换部4400转换图7的块B2而生成的转换后块B2的图。
在空白箭头的左侧示出转换前的块B2(以下称作“转换前块B2”),右侧示出转换后的块B2(以下称作“转换后块B2”)。
转换后块B2是如下生成的块,即,对转换前块B2追加置换变量作用的程序命令组G_2_4“tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=tmp;”(参照图17:程序命令组4401),并且,根据出口映像信息F4置换转换前块B2中包含的变量(参照程序命令组4402)。
程序命令组G_2_4是用于置换变量作用的程序命令组,当块B2在正常系统中被执行时,在执行该块B2之前根据入口映像信息置换了变量作用的情况下,该程序命令组进行基于出口映像信息的变量置换。
以下,说明程序命令组4402所示的程序命令组G_2_4是具有上述特征的程序命令组的情况。
首先,如图11所示,块B2的入口映像信息是F2,出口映像信息是F4。
图18是表示块B2的入口和出口中的转换的图。另外,设定F2_INV表示F2的逆映像(转换4420)。
入口映像信息F2是将变量(pm_a、pm_b、pm_c)的作用置换成(pm_a、pm_c、pm_b)的置换(转换4410),出口映像信息F4是将变量(pm_a、pm_b、pm_c)的作用置换成(pm_b、pm_a、pm_c)的置换(转换4430)(参照图15:映像对应表4900)。
此外,程序命令组G_2_4“tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=pm_a;”是将变量(pm_a、pm_b、pm_c)的作用置换成(pm_b、pm_c、pm_a)的处理。
此时,图19的下段表示进行入口映像信息F2的置换和程序命令组G_2_4的置换这两者时的置换。
如图19所示,在进行入口映像信息F2的置换(转换4410)后还进行程序命令组G_2_4的置换(转换4490)的情况下,与将原来的(pm_a、pm_b、pm_c)置换成(pm_b、pm_a、pm_c)的置换相等。其与出口映像信息F4所示的置换相等。
另外,后面说明程序命令组G_2_4的生成方法。
<变量的置换>
并且,在块B2中,需要根据出口映像信息F4改写块中包含的变量。
具体地说,根据出口映像信息F_4将块B2的“pm_b=pm_b*8;”中的pm_b置换成pm_a,成为“pm_a=pm_a*8;”(图17:程序命令4402)。
<追加的处理的生成>
以下,详细叙述如何生成上述程序命令组G_2_4等。
将进行转换的块的输入映像信息设为F_IN,将出口映像信息设为F_OUT,将基于输入映像信息F_IN的置换的逆转换设为F_IN_INV。
例如,在进行转换的块是块B2时,F_IN是F2,是使(pm_a_before、pm_b_before、pm_c_before)对应于(pm_a_after、pm_c_after、pm_b_after)的映像(参照图18:转换4410)。
此时,F2_INV是置换F_2的pm_X_after和pm_X_before而成的映像,成为使(pm_a_before、pm_b_before、pm_c_before)对应于(pm_a_after、pm_c_after、pm_b_after)的映像(参照图18:转换4420)。
接着,求出基于F_IN_INV和F_OUT的合成的置换。
例如,在对象块是块B2的情况下,F_OUT是F4,成为使(pm_a_before、pm_b_before、pm_c_before)对应于(pm_b_after、pm_a_after、pm_c_after)的映像(参照图18:转换4430)。
此时,基于F_IN_INV和F_OUT的合成的置换成为使(pm_a_before、pm_b_before、pm_c_before)对应于(pm_b_after、pm_c_after、pm_a_after)的映像(图19:转换4490)。
接着,生成进行上述置换的追加程序命令组G_2_4“tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=tmp;”追加到块B2。
然后,根据出口映像信息F_OUT所示的置换,置换块B2中包含的变量。
具体地说,对应于块B2的出口映像信息F4包含“pm_a_after=pm_b_before;”,因而可知变量pm_b已被置换成pm_a,因此,将块B2的pm_b置换成pm_a。即,将式“pm_b=pm_b*8;”置换成“pm_a=pm_a*8;”。
这样生成的块成为转换后块B2。对于其它的块B1、块B3~块B5也同样进行转换。
通过进行这样的转换,各块总是在取消与前一个块的出口映像信息对应的转换后,进行与自身的出口映像信息对应的转换。
由此,在正常系统的执行时,不管在各块中如何产生分支或循环,各块中的变量转换的状态都与图15所示的映像信息4920表示的相等。
此外,根据出口映像信息置换转换前的块中包含的变量,因此,可确保各块的运算结果与转换前的块相等。
<秘密块转换部4500的处理>
在实施方式1中,秘密信息是利用使用追加变量的式求出的,但在本实施方式中,追加变量未被追加。因此,在本实施方式中,设定秘密信息不变更。当然也可以使用变更后的变量,或者使用其它变量进行混淆。
<实施方式2的效果>
在实施方式2中,示出了在程序的中途置换变量的作用的混淆的一例。该混淆方法的特征在于以下4点。
(1)对与成为控制流始点的节点2相对应的块B2的入口映像信息F_IN分配与原来的程序相同的变量(参照映像对应表生成部4330的处理)。
(2)在变量的置换是入口映像信息F_IN所示的置换的情况下,对各块追加进行出口映像信息F_OUT所示的变量的置换的功能(参照块转换部4400的处理)。
(3)与节点5这样的具有多个分支源(节点2、节点4)的节点相对应的全部分支源的块的出口映像信息,与对应于分支源的节点(节点5)的块的入口映像信息相等(参照属性信息分配表1800)。
(4)根据出口映像信息置换各块的变量。
以上,根据4点特征,在正常系统的执行时不管以怎样的执行路线执行混淆后程序,在执行控制转移到各块时,变量都成为形成该块的入口映像信息所示的置换的变量。
通过这样的混淆,变量的作用在程序的各种位置得到置换,能够使程序的解析变得困难。此外,通过按照每个块替换变量的作用,难以解出某个块中的变量在其它块中成为哪个变量,因此能够使解析变得困难。
<实施方式3>
<概要>
实施方式2是利用对象程序中已经存在的变量,在程序中途置换该变量的作用而生成混淆程序,与此相对,在本实施方式中,是使该变量保持对变量值实施预定运算后的值来生成混淆程序。例如,使变量pm_a保持将变量pm_a加上14而得到的值等。
在此,说明与实施方式2之间的差异。
差异在于映像信息不同。图20表示本实施方式的映像对应表5900。
映像对应表5900由ID1910和映像信息5920构成,ID1910与实施方式2相同,是映像信息5920的识别符。
即,在实施方式2的映像对应表4900(参照图15)中,按照属性确定变量值是哪个变量值,但在本实施方式中,是按照属性确定变量值是实施怎样的运算而得到的值。
<结构>
图21是表示实施方式3涉及的程序混淆装置5000的结构例的框图。
与实施方式2的程序混淆装置4000的结构(参照图16)的不同点在于以下2点。
第1点在于,映像信息生成部5400的映像对应表生成部5330生成的映像的内容不同。第2点在于,映像的内容不同造成的、由块转换部5400追加的程序命令组的生成方法不同。
<动作>
以下,说明映像信息生成部5400的映像对应表生成部5330、块转换部5400的各处理。其它动作与实施方式1和实施方式2相同(参照图5、图16等)。
<映像信息生成部5400的映像对应表生成部5330的处理>
首先,说明在本实施方式中设定的映像信息。
实施方式3的映像信息表示如下映像,该映像以pm_X(X=a、b、c)可取的值为元素的集合设为集合PM_X(X=a、b、c),使满足pm_a_before∈PM_A、pm_b_before∈PM_B、pm_c_before∈PM_B的(pm_a_before、pm_a_before、pm_c_before)与满足pm_a_after∈PM_A、pm_b_after∈PM_B、pm_c_after∈PM_C的(pm_a_after、pm_b_after、pm_c_after)对应,使对变量pm_X_before中的数进行加减运算而得到的值与pm_X_after对应。
例如,映像信息“pm_a_after=pm_a_before+14;pm_b_after=pm_c_before+12;pm_c_after=pm_b_before—6;”表示在变量(pm_a、pm_b、pm_c)的值分别是(pm_a_before、pm_b_before、pm_c_before)的情况下,将(pm_a_before+14、pm_c_before+12、pm_b_before—6)的值分别代入变量(pm_a、pm_c、pm_b)的映像。
即,表示将变量(pm_a、pm_b、pm_c)的作用分别置换成(pm_a+14、pm_c+12、pm_b—6)的置换。
<映像信息生成部5300的映像对应表生成部5330的处理>
映像对应表生成部5330与实施方式2相同,生成表示与属性信息分配表1800的属性对应的映像信息的映像对应表5900。
另外,在本实施方式中,属性信息分配表与实施方式1的属性信息分配表1800相同(参照图9)。
映像对应表生成部5330生成构成属性信息分配表1800的属性的种类数即4种映像信息。
例如如下进行各映像信息的生成。
随机生成满足R1∈PM_A、R2∈PM_B、R3∈PM_C的R1、R2、R3,将“pm_a_after=pm_a_before+R1;pm_b_after=pm_b_before+R2;pm_c_after=pm_c_before+R3;”设为映像信息。
具体地说,将与成为图11的控制流始点的块的入口映像信息的属性“1”相对应的映像信息F1设为“pm_a_after=pm_a_before;pm_b_after=pm_b_before;pm_c_after=pm_c_before;”。
接着,确定与其它识别符“2”“4”“10”对应的映像信息。
<块转换部5400的处理>
块转换部5400生成对转换前块保持的功能进行功能追加而成的块,作为转换后块。在此,追加的功能是如下功能:在置换了入口映像信息所示的变量的情况下,置换表示出口映像信息的变量。
以下,说明追加的功能、用于实现追加的功能的处理的生成、以及变量的置换。
<追加的功能>
以下,使用具体例子说明对块追加的功能。
图22是表示由块转换单元5400转换块B2而生成的转换后块B2的图。
空白箭头的左侧表示转换前块B2,右侧表示转换后块B2。
具体地说,在转换前块B2的开头追加程序命令组G_2_INV(参照图22:程序命令组5401),在其后追加程序命令组G_4(参照图22:程序命令组5402)。
并且,根据块的出口映像信息转换块中包含的变量(参照图22:程序命令组5403)。
程序命令组G_2_INV是“pm_a=pm_a—14;pm_b=pm_b—12;pm_c=pm_c+6;”,程序命令组G_4是“pm_a=pm_a+7;pm_b=pm_b+5;pm_c=pm_c+21;”。
以下,详细说明程序命令组G_2_INV、程序命令组G_4的生成以及块中包含的变量的置换。
<程序命令组G_2_INV的生成>
程序命令组G_2_INV是进行块B2的入口映像信息F2的逆映像的追加程序命令组。
说明程序命令组G_2_INV的生成方法。
首先,根据映像信息F2,生成使用(pm_a_after、pm_b_after、pm_c_after)求出(pm_a_before、pm_b_before、pm_c_before)的式。
其成为“pm_a_before=pm_a_after—14;pm_b_before=pm_b_after—12;pm_c_before=pm_c_after+6;”。
将把该式的pm_X_after置换成pm_X、把pm_X_before置换成pm_X后得到的“pm_a=pm_a—14;pm_b=pm_b—12;pm_c=pm_c+6;”设为程序命令组G_2_INV。
<程序命令组G_4的生成>
程序命令组G_4是进行块B2的出口映像信息F4的映像的追加程序命令组。
说明程序命令组G_4的生成。
将映像信息F4“pm_a_after=pm_a_before+7;pm_b_after=pm_b_before+5;pm_c_after=pm_c_before+21;”的pm_X_after置换成pm_X,将pm_X_before置换成pm_X。
将置换而得到的“pm_a=pm_a+7;pm_b=pm_b+5;pm_c=pm_c+21;”设为程序命令组G_4。
<变量的置换>
说明块B2中包含的变量的置换。
采用在代入式的左边具有变量(通过代入确定值的变量)的情况和右边具有变量(确定代入的值)的情况下不同的转换方法,进行变量的置换。
另外,在右边和左边的双方具有变量的情况下,实施右边具有变量时的转换和左边具有变量时的转换双方。
在此,在示出左边和右边的具体例子时,在块B2的“pm_b=pm_b*8;”中,左边为“pm_b”,右边为“pm_b*8;”。
以下,将“pm_b=pm_b*8;”设为置换对象程序命令,说明左边的变量的置换和右边的变量的置换。
<左边存在变量时的置换>
在程序命令的左边包含有变量的情况下,进行针对该变量的置换。进行这样的转换是因为需要使出口映像信息反映各程序命令的运算结果。
在置换左边的变量pm_X的情况下,在该块的出口映像信息F_OUT中,找到所有包括pm_X_before的式。
在此,在找不到包括pm_X_before的式的情况下,无需对该程序命令进行转换,因而不进行任何转换。
在本具体例子中,式“pm_b=pm_b*8;”左边的变量是“pm_b”,块B2的出口映像信息是F4,因此,将找到包括pm_b_before的式“pm_b_after=pm_b_before+5;”。
接着,将找到的式的pm_X_before置换成置换对象程序命令的右边的内容。在此,将pm_b_before置换成“(pm_b*8)”,成为“pm_b_after=(pm_b*8)+5;”。
然后,将“pm_b_after”转换成变量“pm_b”,由此得到“pm_b=(pm_b*8)+5;”这样的式。
该式是使原来的式的运算结果反映出口映像“pm_b_after=pm_b_before+5;”的式。即,是对原来的式“pm_b*8”加上出口映像信息的影响即“+5”而得到的式。
另外,在上述例子中,左边的变量是pm_X(X=a、b、c),在映像信息具有多个包括pm_X_before的式的情况下,将对象程序命令置换成由这些多个式构成的程序命令,接着,将各个式的pm_X_before置换成置换对象程序命令的右边的内容。
以上是左边存在变量时的置换。
<右边存在变量时的置换>
在程序命令的右边包含有变量的情况下,进行针对该变量的置换。
进行这样的转换是因为,程序命令的右边包含的变量是基于入口映像进行了转换的状态下的变量,因此即使利用原来的式进行计算也无法得到适当的计算结果。即,通过根据程序命令的右边包含的变量消除输入映像的影响,从而修正成能得到适当结果的式。
在以下例子的说明中,示出如下例子:置换在上述左边存在变量时的置换中生成的“pm_b=(pm_b*8)+5;”右边的变量。
首先,采用上述方法生成块B2的出口映像信息F4的逆映像F4_INV。
在此,F4_INV成为“pm_a_before=pm_a_after—7;pm_b_before=pm_b_after—5;pm_c_before=pm_c_after—21;”。
接着,将程序命令中的右边的变量pm_X置换成pm_X_before。即,将“pm_b=(pm_b*8)+5;”置换成“pm_b=(pm_b_before*8)+5;”。
接着,从F4_INV中找到包括pm_X_before的式。在此,在从F4_INV中找不到包括pm_X_before的式的情况下,因为是没有对应于变量pm_X的入口映像信息、即变量pm_X是没有被特别转换的状态,因此将置换式中的pm_X_before返回变量pm_X,并结束处理。
在此,由于“pm_b=(pm_b_before*8)+5;”的右边包含有“pm_b_before”,因此,找到与之对应的“pm_b_before=pm_b_after—5;”。
接着,根据找到的式,将pm_X_before置换成使用pm_X_after的式。即,将“pm_b=(pm_b_before*8)+5;”置换成“pm_b=((pm_b_after—5)*8)+5;”。
最后,将pm_X_after置换成pm_X。即,将“pm_b=((pm_b_after—5)*8)+5;”置换成“pm_b=((pm_b—5)*8)+5;”。
另外,在右边存在多个包含pm_b_before的程序命令的情况下,将各个pm_b_before置换成(pm_b_after—5)。
此外,在1个程序命令中包含pm_a_before和pm_b_before的情况下,将pm_a_before置换成(pm_b_after—7),将pm_b_before置换成(pm_b_after—5)。例如,将pm_b=pm_a_before*pm_b_before置换成pm_b=(pm_a_after—7)*(pm_b_after—5)。
如上所述生成的“pm_b=((pm_b—5)*8)+5;”成为置换右边的变量而得到的结果。通过这样的转换,输入映像信息表示的“pm_b_after=pm_b_before+5”这样的转换通过“pm_b—5”消除。
另外,因为能够预先进行常量彼此的运算,因此最终能够成为求出常量的式“pm_b=pm_b*8—35;”。
以上是块中包含的变量的置换。
<实施方式3的效果>
在实施方式3中,示出了在程序的中途置换变量的作用的混淆的一例。该混淆方法的特征在于以下3点。
(1)对成为控制流始点的块B2的入口映像信息F_IN分配与原来的程序相同的变量(参照映像对应表生成部5330的处理)。
(2)在变量的置换是入口映像信息F_IN所示的置换的情况下,对各块追加进行出口映像信息F_OUT所示的变量的置换的功能(参照块转换部5400的处理)。
(3)块B5这样的具有多个分支源(块B2、块B4)的块的全部分支源的出口映像信息,与分支目的地的块(块B5)的入口映像信息相等(参照属性信息分配表1800)。
以上,根据3点特征,在正常系统的执行时不管以怎样的执行路线执行混淆后程序,在各块产生分支时,变量的置换成为该块的入口映像信息所示的变量的转换。
通过这样的混淆,变量的作用在程序的各种位置得到置换,能够使程序的解析变得困难。此外,通过按照每个块替换变量的作用,难以解析某个块中的变量在其它块中是怎样的作用的变量。
<实施方式4>
<概要>
实施方式1~3是对对象程序追加程序命令,或者切换变量的作用、即改变变量的值,从而生成混淆程序,确保软件的机密性,而在本实施方式中,通过对块进行加密来确保机密性。
即,在本实施方式中,1个特征在于,按照每个块对程序进行加密,存储到外部存储器中,而全部块并非用同一加密密钥进行加密。即,为了解析1个块,需要求出该块的加密密钥,解析将会需要时间。
并且,执行时对接下来要执行的块进行加密,因此,明文仅以块为单位在内部存储器中展开。即,存储器上的明文较少,因而能够使解析程序整体变得更加困难。
在此,说明与实施方式3之间的差异。
差异在于映像信息不同。图23表示本实施方式的映像对应表6900。
映像对应表6900由ID1910和映像信息6920构成,ID1910与实施方式3相同,是映像信息6920的识别符。
即,在实施方式3的映像对应表5900(参照图20)中,按照属性确定变量值是实施怎样的运算而得到的值,但在本实施方式中,是按照属性确定对块进行加密的加密密钥。
<结构>
图24是表示实施方式4涉及的程序混淆装置6000的结构例的框图。
与实施方式3的程序混淆装置5000的结构(参照图21)的不同点在于以下2点。
第1点在于,映像信息生成部6400的映像对应表生成部6330生成的映像的内容不同。第2点在于,映像的内容不同造成的、由块转换部6400追加的程序命令组的生成方法不同。除此之外,在块转换部6400中还进行加密,生成混淆程序3200。
<动作>
以下,说明映像信息生成部6400的映像对应表生成部6330、块转换部6400的各处理。对于其它动作,将对象程序分割成块,对各块设定入口属性和出口属性的动作与实施方式3相同(参照图16等)。
<映像信息生成部6400的映像对应表生成部6330的处理>
图23表示本实施方式的映像对应表6900。
映像对应表6900由ID1910和映像信息6920构成,ID1910与实施方式1相同,是映像信息6920的识别符。
映像信息6920表示加密密钥的值。例如属性信息F1是“Key=3”。
在本实施方式中,对应于各属性的加密密钥的值是预先确定的。另外,也可以在生成映像对应表时随机生成。
<块转换部的处理>
以下,使用图25和图26说明本实施方式的块转换部的处理。
图25是表示转换后块的图,图26是表示块转换部的处理的流程图。在本实施方式中,对该转换后块进行加密,生成混淆程序。
参照图24的块,根据图25的流程图说明块转换部的处理。
首先,对对象程序追加解密函数“decrypt”的程序(参照步骤S610、图25:加密程序6409)。
该加密函数具有如下功能:将加密的块的识别符即“块ID”和加密密钥“Key”作为自变量,用“Key”对由“块ID”确定的块进行加密。另外,在此指定块的识别符,但也可以指定块的开始地址和结束地址,只要块可确定即可。
接着,对各块追加用于对各块的接下来要执行的块(以下称作“下一块”)进行解密的程序命令。是图25中的程序命令组6401~6404。在本实施方式中,最后的块B5中(步骤S615:是)不存在接下来要执行的块,因此,设定不追加程序命令。在不是最后的块的情况下(步骤S615:否),追加对以下的下一块进行解密这样的程序命令组。
在追加的程序命令组中,使用解码函数对下一块进行解码,但对该解码函数指定的“Key”即解码密钥设定出口映像信息的key。
在最初的块中,将出口映像信息的的值设定成“key”(参照块B1:程序命令组6401的第1行)。例如,最初的块即块B1的出口映像信息是“2”,因此,设定映像信息F4“key=4;”(参照图23)的“4”。
此外,在其它块中,追加根据入口映像信息求出出口映像信息的程序命令(步骤S620)。
例如,在块2中,入口映像信息是“2”,出口映像信息是“4”,key分别是“4”、“5”(参照图23)。因此,追加根据“4”求出“5”的式“key=key+1;”(参照块B2:程序命令组6402的第1行)。
然后,对原本就有的分支命令追加如下程序命令组,该程序命令组是追加对解密函数的自变量设定接下来要执行的块的“块ID”和“key”后的程序命令而成的(步骤S630)。
例如,对块B2追加“decrypt(B5、key);go to labelE;”(参照块B2:程序命令组6402的第2行)。在此,“B5”成为块B5的块ID。
然后,利用入口映像信息所示的加密密钥对块进行加密(步骤S640)。
例如,在追加了程序命令组6402后,块B2利用入口映像信息“2”即“Key=4”进行加密。
对全部块进行步骤S620~步骤S640的处理(步骤S650)。
在本实施方式的混淆程序中,在上述执行时,仅在存储器上执行的块作为明文存在,把握对象程序整体变得困难,从而使程序的解析变得困难。
<补充>
以上,根据实施方式说明了本发明涉及的程序混淆装置,但也能够对该程序混淆装置进行局部变形,本发明当然不限于上述实施方式。即,
(1)在实施方式中,在从第一块和第二块到第三块具有分支的情况下,第一块的出口映像信息、第二块的出口映像信息、第三块的入口映像信息设为相同的映像信息,但第一块的出口映像信息和第二块的出口映像信息也可以是不同的映像。
例如,在实施方式1中,也可以设块B2的出口映像信息为“pm_0=12;pm_1=7;”,设块B4的出口映像信息为“pm_0=4;pm_1=13;”,设块B5的入口映像信息为“pm_0=12;pm_1=7;”和“pm_0=4;pm_1=13;”这两个。
此时的块B5的入口映像信息表示使满足pm_0_before∈PM_0、pm_1_before∈PM_1的(pm_0_before、pm_1_before)与(12、7)或(4、13)中的某个对应的映像。
此时,对块B5追加的处理是使“(pm_0_before、pm_1_before)=(12、7)、(4、13)”与“(pm_0_after、pm_1_after)=(13、21)”对应的映像,例如,追加追加程序命令组“pm_0=(pm_0—12)*(pm_0—4)+13;pm_1=(pm_1—7)*(pm_0—13)+21;”、或“pm_0=3*(pm_0—12)*(pm_1—13)+13;pm_1=4*(pm_1—4)*(pm_0—7)+21;”。
通过这样的结构,不管非法解析者通过什么解析知道了第一块的出口映像,都无法知道第二块的出口信息,能够使得解析变得困难。
(2)实施方式1中的追加变量可以是程序的自变量。
在是自变量的情况下,函数func的调用源也需要变更。
例如,在调用源是“func(a、b);”、追加变量的初始值是“0”“1”的情况下,将调用源变更成“func(a、b、0、1);”。
另外,为了混淆包括调用源在内的程序中的追加变量的初始值,也可以使用本混淆方法对调用源进一步混淆。
通过这样的结构,即使非法解析者局部地解析了函数func,也难以知道追加变量的初始值。
(3)在实施方式2和实施方式3中,对成为控制流始点的块的入口映像信息F_IN分配有与原来的程序相同的变量,但也可以是不同的变量。
例如,实施方式2的块2的入口映像信息F1是“pm_a_after=pm_a_before;pm_b_after=pm_b_before;pm_c_after=pm_c_before;”,但也可以是“pm_b_after=pm_a_before;pm_a_after=pm_b_before;pm_c_after=pm_c_before;”。
这样在是其它映像的情况下,函数func的调用源也需要变更。
例如,在调用源是“func(a、b、c);”的情况下,根据映像信息F1,将调用源变更成“func(b、a、c);”。
另外,为了混淆包括调用源在内的程序,也可以使用本混淆方法对调用源的程序进一步混淆。
通过这样的结构,即使非法解析者局部地解析了函数func,也难以知道变量置换的初始值。
(4)在实施方式中,映像信息表示使pm_X(X=a、b、c)对应于pm_X(X=a、b、c)的映像,但也可以是对应于尺寸不同的其它变量pm_Y(Y=d、e、f)的映像。
通过这样的结构,即使追加的程序命令组具有例如乘法运算,也能够避免溢出的产生。
由此,能够增加构成追加程序命令组的程序命令的变化,能够使得判断块中包含的程序命令组中的哪个程序命令是追加程序命令、哪个程序命令是块中原来包含的程序命令变得困难。
例如,在实施方式3中,设pm_X(X=a、b、c)为16比特的int型变量,设pm_Y(Y=d、e、f)为32比特的long型变量,对程序追加变量pm_Y(Y=d、e、f)。
该情况下,例如也可以设映像信息F2为“pm_d_after=(long)pm_a_before*3—4;”,设追加程序命令组G_2_INV为“pm_a=(pm_d+4)/3;”。
此外,也可以改变存储pm_X(X=a、b、c)的型本身。
例如,在实施方式3中,也可以设变量说明“f(int pm_a、int pm_b、int pm_c)”为“f(long pm_a、long pm_b、long pm_c)”,设映像信息F2为“pm_a_after=pm_a_before*3—4;”,设追加程序命令组G_2_INV为“pm_a=(pm_a+4)/3;”。
(5)在实施方式中,映像信息表示使pm_X(X=a、b、c)对应于pm_X(X=a、b、c)的映像,但也可以是对应于其它变量pm_Y(Y=d、e、f)的映像,还可以是对应于包含其它变量在内的pm_X(X=a、b、c、d、e、f)的映像。
例如,在实施方式3中,也可以对程序追加变量“pm_d、pm_e、pm_f),设映像信息F2为“pm_a_after=pm_a_before/3;pm_d_after=pm_a_before%3;”,设追加程序命令组G_2_INV为“pm_a=pm_a*3+pm_d;”。
通过这样的结构,能够增加构成追加程序命令组的程序命令的变化,能够使得判断块中包含的程序命令组中的哪个程序命令是追加程序命令、哪个程序命令是块中原来包含的程序命令变得困难。
(6)在实施方式3中,映像信息如“pm_a_after=pm_a_before+14;pm_b_after=pm_b_before+12;pm_c_after=pm_c_before—6;”所示,表示使用1个变量(例如pm_a_before)的值计算1个变量(例如pm_a_after)的映像,但也可以是使用多个变量计算多个变量的映像。
例如,也可以设映像信息F2为“pm_a_after=pm_a_before+pm_b_before;pm_b_after=pm_a_before—pm_b_before;”,设追加程序命令组G_2_INV为“tmp=pm_a;pm_a=(pm_a+pm_b)/2;pm_b=(tmp—pm_b)/2;”。
通过这样的结构,能够增加变量的作用置换的变化,能够使得解析变得困难。
(7)在实施方式中示出了随机生成映像信息的情况,但也可以是根据块中包含的程序命令生成映像信息的结构。
例如在实施方式1中,块B2包含秘密信息“123”。
此时,也可以设块B5的出口映像信息中的“pm_0_after”的值为秘密信息的值,设出口映像信息为“pm_0_after=123;pm_1_after=31;”。
此时,如果设“pm_b=pm_b*123+pm_c;”为“pm_b=pm_b*pm_0+pm_c;”,则块转换部1400能够混淆成能够得到适当处理结果的程序。
由此,根据随机生成的映像信息计算在程序内使用的值的处理得到省略,因此,能够减少转换计算秘密信息的处理造成的混淆后的程序尺寸的增加和执行时间的增加。
(8)在实施方式1中示出了追加变量有2个的情况,但追加变量是多少个都可以。
如果减少追加变量的数量,则能够减小混淆后的程序尺寸,加快执行速度,如果增多追加变量的数量,则能够增大混淆的效果。
(9)在实施方式2和实施方式3中示出了进行变量置换等的变量有3个的情况,但进行置换的变量是多少个都可以。
此外,也可以是用户或外部的装置、调用源程序等指定置换哪个变量等的结构。
(10)在实施方式3中示出了映像的一例,但也可以是具有逆映像的其它映像。
此外,示出了在需要时根据映像生成逆映像的情况,但也可以是在由映像对应表生成部5330生成的映像对应表5900中设置记载逆映像的栏的结构。
由此,只要生成一次逆映像,即无需生成此后相同的逆映像,因此,能够使混淆处理高速化。
此外,也可以是将与映像信息F_X对应追加的程序命令组F_X、与作为映像信息F_X的逆映像的映像信息F_X_INV对应追加的程序命令组F_X_INV记载到映像对应表的结构。
由此,对于相同的映像信息或逆映像信息,多次生成同样的程序命令组的过程得到省略,因此,能够使混淆处理高速化。
此外,也可以是用户指定在此所说的映像、逆映像、追加程序命令组F_X、追加程序命令组F_X_INV的结构。
(11)在实施方式中,示出了对象程序是用C语言制作的程序的情况,但也可以用Java(注册商标)语言、Java(注册商标)字节代码、C++语言、机械语言、汇编语言、编译程序等中间语言、UML(Unified ModelingLanguage)等建模语言等其它程序语言制作。
此外,对象程序也可以是用逻辑电路记述语言等记述的逻辑电路的设计数据。
并且,在实施方式中,混淆C语言的混淆对象程序而生成C语言的混淆后程序,但也可以是将混淆后程序作为机械语言输出的结构。
此外,混淆对象程序也可以不是C语言的程序而是用UML记载的构造,混淆后程序也可以是Java(注册商标)等语言。
(12)在实施方式中,以变量“pm_X”可取的值为元素的集合PM_X可以由变量的型确定,也可以预先由用户指定。
(13)在实施方式中,示出了在块的起始追加程序命令组的情况,但也可以是在除此以外的位置追加的结构。
例如,在实施方式2中的程序转换部5400的处理中,也可以在块B2中包含的程序命令“pm_b=pm_b*8;”之后追加追加程序命令组G_2_4“tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=tmp;”。
在该情况下,追加程序命令组之前的程序命令根据块B2的入口映像信息进行变量的置换,追加程序命令组之后的程序命令根据块B2的出口映像信息进行变量的置换。
在此,根据“pm_b=pm_b*8;”对块B2的入口映像信息F2进行变量的置换,成为“pm_c=pm_c*8;”。
通过采用这样的结构,包含追加程序命令组的位置由于块的不同而不同,看到转换后块,能够难以解析哪个程序命令是追加程序命令、哪个程序命令是原来块中存在的程序命令。
此外同样地,也可以是在追加程序命令组的中途夹有原来块中存在的程序命令的结构。由此,能够更加难以解析哪个程序命令组是原来块中存在的程序命令组。
(14)在实施方式1的秘密块转换部1500中,对于进行置换的秘密信息,可以是置换用户等指定的秘密信息的结构,也可以是置换程序中包含的全部常量值的结构。
此外,也可以是按照一定概率置换程序中包含的常量值的结构,或者也可以是置换随机选择出的常量值的结构。
由此,与置换全部秘密信息的情况相比,能够更高速地进行混淆。此外,能够抑制通过混淆增加的处理的数量,因而能够使混淆后的程序的动作也高速化。
(15)在实施方式1中示出了追加程序命令组G_1_2的一例,只要是实现使(0、1)与(30、6)对应的影像的程序命令组即可,对于实现其它映像的程序命令组也同样。
此外,追加程序命令组的生成方法不限于实施方式所示的方法,也可以是其它方法。
即,只要能够生成在给出了输入映像信息时按照输出映像信息进行转换的程序命令组即可。
(16)在实施方式1中,映像信息示出了使满足pm_0_before∈PM_0、pm_1_before∈PM_1的全部(pm_0_before、pm_1_before)对应于1点(例如(0、1))的映像,但也可以是对应于多个点的映像。
例如,设映像信息F2为使(pm_0_before、pm_1_before)对应于(1、2)或(4、5)的某个的映像,设映像信息F4为使(pm_0_before、pm_1_before)对应于(5、6)或(8、9)的某个的映像,设追加程序命令组G_2_4为实现例如使(1、2)对应于(5、6)、(4、5)对应于(8、9)的映像的程序命令组。
在该情况下,追加程序命令组G_2_4例如成为“pm_0=pm_0+4;pm_1=pm_1+4;”。
此外,也可以是追加程序命令组包含追加变量以外的变量的结构。
例如,也可以设映像信息F2为使(pm_0_before、pm_1_before)对应于(0、1)或(3、4)的某个的映像,设映像信息F4为使(pm_0_before、pm_1_before)对应于(0、1)或(1、2)的某个的映像,设追加程序命令组G_2_4为例如“pm_0=pm_0%3+pm_a%2;pm_1=pm_1%3+pm_a%2;”。
也可以使用集合来代替这样地使用映像信息使特定变量的值对应于多个点。
例如,设映像信息F2为使(pm_0_before、pm_1_before)对应于(6的倍数、用3除而余1的数)的集合,设映像信息F4为使(pm_0_before、pm_1_before)对应于(用6除而余1的数、用3出而余2的数)的集合,设追加程序命令组G_2_4例如为“pm_0=pm_0+1;pm_1=(pm_1—1)*2+2;”。
使用这样的结构,利用追加变量以外的变量的值,替换执行追加程序命令组后的追加变量的值。由此,使得非法解析者解析哪个变量是追加变量、哪个变量是原来程序中包含的变量变得困难。
更具体地说明该效果。在不使用追加变量以外的变量的情况下,非法解析者为了解析块的出口映像信息、入口映像信息,改变函数的自变量的值,多次执行函数func,收集执行时存储器中出现的值(运行期数据),取其差分,通过提取不变的数据即可确定映像信息的追加变量的值。
对此,使用上述结构,执行追加程序命令组后的pm_0、pm_1不是固定值,因而使得映像信息的解析变得困难。此外,使得存储映像信息的变量是哪个变量的解析也变得困难。
另外,对于收集运行期数据的非法解析,记载在“署名生成ソフトウェアのランタイムデ—タ探索による耐タンパ—性評価SCI2005”中。
另外,追加变量以外的变量也可以不是混淆对象程序中包含的变量。例如,也可以是ROM、RAM、寄存器、缓冲存储器等中保持的值。
(17)在实施方式1的秘密块转换部1500的处理中,进行置换的秘密信息例如也可以是程序的分支目的地的地址那样的表示程序的分支目的地的数值。
例如,在实施方式1的秘密块转换部1500的处理中,将块B2的无条件分支命令“goto labelE:”置换成条件分支命令“switch(2){case 1:gotolabelC;case 2:goto labelE;}”。
该条件分支命令中,混淆对象程序中包含的标记“labelE:”、“labelC:”是条件分支目的地,条件式是与原来的无条件分支目的地“labelE;”对应的case语句的值“2”。
接着,使用在秘密块转换部1500的处理中说明的方法,将条件式“2”置换成根据块B2的出口映像信息使用追加变量的程序命令。
并且,在实施方式1中,将秘密信息置换成式,但也可以仅追加程序命令。
例如,在实施方式1中,将“pm_b=pm_b*123+pm_c;”置换成“pm_b=pm_b*(3*pm_0+4*pm_1—40)+pm_c;”(参照图13、图14),但也可以追加1个程序命令。
具体而言,“pm_0”是块B5的出口属性“10”,是“pm_0=13”,因此,也可以追加“pm_b=pm_b*pm_0/13;”,成为“pm_b=pm_b*pm_0/13;pm_b=pm_b*123+pm_c;”。
采用这样的结构,能够使得程序的执行顺序的解析变得困难。
(18)各部不必是独立的部,也可以是采用组合多个部提供的功能而成的部的结构。
(19)在实施方式1中,示出了具有对混淆对象程序追加变量的变量追加单元的结构,但也可以是使用在混淆对象程序中没有使用的变量来代替追加变量的结构。
(20)在实施方式的块转换部的处理中,也可以是不对作为入口映像信息和出口映像信息相同的映像信息的块追加追加程序命令的结构。
通过这样的结构,能够削减混淆后程序的尺寸,缩短执行时间。
此外,在属性信息分配表1800中,也可以将不同的属性置换成相同的属性。例如,也可以使在实施方式中使用的属性信息分配表1800的属性1831“4”为“2”(参照图9)。是块B2出口属性、块B4出口属性和块B5入口属性这三个。
使用这样的结构,能够增加入口映像信息和出口映像信息成为相同的块,并且,能够削减混淆后程序的尺寸,缩短执行时间。
(21)本发明也可以是组合实施方式1和实施方式3而成的结构。
使用这样的结构,使得解析哪个变量是追加变量、哪个变量是原来程序中包含的变量变得困难。
此外,也可以是实施方式1与实施方式2、实施方式4、变形例(补充(1)等)的组合。
(22)在实施方式中,示出了将混淆对象程序分割成基本块的结构,但也可以是其它分割方式。
例如,也可以将基本块进一步分割成多个块。例如,在基本块是“a=1;a=a*2;a—3;”的情况下,设各个程序命令为块,将“a=1;”“a=a*2;”“a—3;”分别成块。在该情况下,视为从“a=1;”的块到“a=2;”的块具有分支,生成控制流。由此,能够以比基本块更细的单位加入追加程序命令组,因而能够使得解析更加困难。
此外,例如也可以与基本块无关系地生成块。
在该情况下,追加程序命令在该块的最后的合流点之后、最初的分支点之前追加。如果在该块的最后的合流点之后、最初的分支点之前的程序命令组1个都没有,则该块的入口映像信息和出口映像信息成为相同的映像信息。
另外,分支点是具有分支命令(条件分支命令和无条件分支命令)的位置,合流点是由分支命令分支的分支目的地的位置。
(23)在实施方式的块转换部1400的处理中,示出了通过追加程序命令来对块追加功能的结构,但不必是这样的结构。
例如,也可以是去除作为构成块的程序命令中的几个命令的程序命令组1,并追加进行该程序命令组1和追加功能这两者的处理的程序命令组的结构。
例如,在实施方式2中,也可以是从块B2中去除程序命令“pm_b=pm_b*8;”,追加程序命令组D“tmp=pm_a;pm_a=pm_c*8;pm_c=pm_b;pm_b=tmp;”的结构。
在此,程序命令组D是置换成如下处理的程序命令组:该处理为,集中进行转换后块B2的程序命令组“tmp=pm_a;pm_a=pm_c;pm_c=pm_b;pm_b=tmp;pm_a=pm_a*8;”(参照图17)的第2个程序命令“pm_a=pm_c;”和第5个程序命令“pm_a=pm_a*8;”。
(24)在上述实施方式中,列举了根据映像信息置换变量等,但不限于此。
在上述实施方式中,相当于:对于在块之间交接的秘密信息计算用的变量等,使从块出来时的值和进入下一块时的值一致,在从各块输出的时刻的值成为期待作为下一块的输入的值那样的范围内对各块进行混淆,但具有同样性质的混淆转换也包含在本发明中。
例如,如实施方式4所示,也可以对分支目的地的块进行加密,向分支源的块追加对该块进行解密的处理等。
此外,也可以对分支目的地的块实施进行块中命令的伪装的转换,向分支源追加进行该伪装的解除的处理。
即,本发明通过实施具有分支源的块和分支目的地的块相抵消这样的性质的混淆,能够进行与程序的控制构造无关的混淆。
(25)具体而言,上述各装置是由微处理器、ROM、RAM、硬盘单元、显示器单元、键盘、鼠标等构成的计算机系统。在上述RAM或硬盘单元中存储有计算机程序。上述微处理器按照上述计算机程序动作,由此各装置达到其功能。在此,计算机程序是为了达到预定的功能而组合多个表示针对计算机的指令的命令码而构成的。
(26)构成上述各装置的构成要素的部分或全部也可以由1个系统LSI(Large Scale Integration:大规模集成电路)构成。系统LSI是在1个芯片上集成多个结构部而制造成的超多功能LSI,具体而言,是包含微处理器、ROM、RAM等而构成的计算机系统。在上述RAM中存储有计算机程序。上述微处理器按照上述计算机程序动作,由此系统LSI达到其功能。
(27)构成上述各装置的构成要素的部分或全部也可以由可相对于各装置拆装的IC卡或单体的模块构成。上述IC卡或上述模块是由微处理器、ROM、RAM等构成的计算机系统。上述IC卡或上述模块也可以包含上述超多功能LSI。微处理器按照计算机程序动作,由此上述IC卡或上述模块达到其功能。该IC卡或该模块具有防篡改性。
(28)本发明也可以是上述所示的方法。此外,也可以是通过计算机实现这些方法的计算机程序,还可以是由上述计算机程序构成的数字信号。
(29)此外,本发明也可以是将上述计算机程序或上述数字信号记录到计算机可读取的记录介质,例如软盘、硬盘、CD-ROM、MO、DVD、DVD-ROM、DVD-RAM、BD(Blu-ray Disc)、半导体存储器等而成的。此外,也可以是记录于这些记录介质的上述数字信号。
(30)此外,本发明也可以是经由电通信线路、无线或有线通信线路、以互联网为代表的网络、数据广播等传送上述计算机程序或上述数字信号而成的。
(31)此外,本发明也可以是具有微处理器和存储器的计算机系统,上述存储器存储有上述计算机程序,上述微处理器按照上述计算机程序动作。
(32)此外,通过将上述程序或上述数字信号记录到上述记录介质进行移送,或者通过经由上述网络等移送上述程序或上述数字信号,也可以由独立的其它计算机系统来实施。
<现有技术的详细情况和课题>
图27是表示以往的混淆方法的例子的程序例。
<原始程序>
图27(a)表示混淆前的原始程序。在该程序中,“1234”是不想被非法解析者知道的秘密信息9001。另外,除非以下特别指出,否则都以C语言记述的程序为例进行说明。
图27(a)所示的混淆前的原始程序中,能够通过收集该程序中包含的所有常量来缩小秘密信息9001的值的范围。即,当收集图27(a)中包含的常量时,可收集到“1”、“2”、“7”、“5”“1234”,其中之一是秘密信息的值。由此,非法解析者仅收集程序中包含的常量即可将秘密信息的值的范围缩小到5个。
<秘密信息置换后程序>
图27(b)表示将程序中包含的秘密信息转换成可通过执行多个程序命令进行计算的程序。
该程序是通过如下方式生成的程序:对原始程序(a)追加新的变量“c”,追加使用追加的变量“c”计算秘密信息“1234”的处理,将秘密信息“1234”置换成“c(9002)”。
在该图中,“c=1;c=c*10+2;c=c*10+3;c=c*10+4;”是计算秘密信息“1234”的程序命令组。
在图27(b)的程序中,即使收集到程序中包含的所有常量也不会直接得到秘密信息“1234”。
由此,安全性比图27(a)的程序高。
但是,在非法解析者相当于解析程序的处理本身而判断出“a=a+b+c;”的“c”是秘密信息9001的情况下,通过依次执行计算秘密信息的处理“c=1;”“c=c*10+2;”“c=c*10+3;”“c=c*10+4;”,解析出c9002的值依次是“1”、“12”、“123”、“1234”,从而能够解析秘密信息的值“1234”。
<秘密信息扩散后程序>
接着,图27(c)表示将计算秘密信息的处理扩散到程序中的各种位置后的程序。该程序是将图27(b)所示的秘密信息置换后程序中包含的计算秘密信息的程序命令“c=1;”“c=c*10+2;”“c=c*10+3;”“c=c*10+4;”扩散到程序中的各种位置的程序。
对于秘密信息置换后程序,相对于在图27(b)中将用于计算秘密信息的处理集中到一个部位,而在图27(c)中通过扩散到各种位置,使得发现计算秘密信息的处理变得困难。
此外,除了上述说明的混淆方法之外,在非专利文献1中记载有如下内容:通过在程序执行中几次改变存储计算中途的值的变量的存储器使得程序的解析变得困难。作为这样的混淆的一例,图27(d)表示在程序的中途改变变量的作用的程序。
<在程序的中途改变变量的作用的程序>
图27(d)表示在程序的中途改变变量的作用的程序。该程序是对原始程序图27(a)追加变量d、e,在程序的中途追加“d=a;b=e;”,从而将追加的位置以后的变量“a”、“b”分别置换成“d”、“e”的程序。
即,是在原始程序的中途追加“d=a;b=e;”(程序命令9003),在追加的位置以后的程序命令组中将变量“a”、“b”分别置换成“d”、“e”,设“a=a<<5;a=a*b;a=a+b+1234;use(a)”为“d=d<<5;d=d*e;d=d+e+1234;use(d)”的程序。
在该程序中,从程序的中途起,“d”、“e”发挥变量“a”、“b”的作用。由此,难以跟踪用于计算秘密信息的变量是哪个。
<课题>
具有如下方法:将程序中包含的秘密信息转换成可通过执行多个程序命令进行计算,并且,将该程序命令扩散到程序中的各个部位,从而使得解析变得困难。但是,由于难以对控制构造复杂的程序进行扩散,因而具有非法解析者通过重点解析特定部位能够较容易地得到秘密信息这样的课题。以下具体说明该课题。
(a)原始程序
图28表示混淆前的原始程序。原始程序包含函数func,函数是由程序命令组9110构成的函数。此外,“123”是秘密信息(参照程序命令9101)。
图29表示该程序的控制流。
控制流是用图形表达程序中的分支和合流这样的控制流,一般被称作控制流图形。控制流的生成例如由下面的基本块生成步骤和图形生成步骤构成。
基本块生成步骤是从混淆对象程序生成基本块的步骤。基本块是指由1个以上的程序命令构成的程序命令组,是在程序命令组的起始以外不从其它块合流且在程序命令组的最后以外不向其它块分支的程序命令组。
更详细地说,设程序入口的程序命令(程序的最初执行的程序命令)、或者处理合流的程序命令、或者成为分支的程序命令的下一个程序命令作为开始程序命令,接着,设处理合流的程序命令的前一个程序命令、或者程序出口的命令(程序的最后执行的命令)、或者成为分支的程序命令作为结束程序命令,则基本块是由从开始程序命令到结束程序命令之间所存在的程序命令构成的程序命令组。
在基本块生成步骤中,分割混淆对象程序而生成多个基本块,构成混淆对象程序的全部程序命令通过基本块生成步骤被分割成包含在某个基本块中。
在图形生成步骤中进行以下处理。
将基本块分别视为节点,在第一节点上具有向第二节点的分支命令(由goto语句、break语句、continue语句、return语句构成的无条件分支命令、或者由for语句、while语句、do-white语句、if语句、switch语句构成的条件分支命令)的情况下,或者在第一节点最后的程序命令是无条件分支命令以外的程序命令并且与上述最后的程序命令相对应的程序上的程序命令的后一个程序命令所对应的程序命令是第二节点的情况下,视为在第一节点和第二节点之间存在边,生成由节点和边构成的图形。
在图29中,块9111~9115表示将程序分割成多个程序命令组而成的块。各块是由1个以上的程序命令构成的程序命令组。此外,箭头表示控制流和边。
从块9111出来2个箭头表示:在不利用调试器强制改变程序的执行顺序等执行时,即在正常系统中执行时执行了块9111之后,执行块9112和块9113的哪一个。块9115包括作为秘密信息的值“123”。
(b)秘密信息置换后程序的控制流
图30与图27(b)相同,是对原始程序图27(a)追加新的变量“c”,追加使用追加的变量“c”计算秘密信息“123”的处理,将秘密信息“123”置换成“c”而生成的程序的控制流图。
即,在块9211中对“c=1;”和变量c进行初始化,在块9215中进行“c=c*10+2;c=c*10+3;”这样的计算,从而对变量c计算“123”这样的值。
(c)秘密信息扩散后程序的控制流
图31表示将计算图30所示的秘密信息的程序命令扩散到程序中的各种位置而得到的程序。
以下,说明生成图30的程序到图31的程序的控制流的顺序。
首先,确定移动块9215中包含的程序命令“c=c*10+2;”的部位(参照图30)。
在此,该程序命令无法移动到条件分支的单侧。设置这样的限制的理由是,例如在将该程序命令移动到块9114时,产生不执行块9114而执行块9112的分支的情况下,不执行该程序命令“c=c*10+2;”。在该情况下,块9215中的c的值不是“123”,因而不能进行适当的运算。
同样,该程序命令无法进入到循环的内容中。这是因为,例如在将该程序命令移动到块9113时,执行该程序命令“c=c*10+2;”的次数随着执行块9113的次数而改变。在该情况下,在执行2次以上的“c=c*10+2;”时,块9215中的c的值成为不同于“123”的值,不能进行适当的运算。
由此,在本程序例中,为了保证c的值最终成为“123”,将该程序命令“c=c*10+2;”移动到块9311(参照图31)。同样,“c=c*10+3;”也移动到块9311,生成图31所示的控制流的程序。
这样,在现有方法中,在包含分支和循环的程序中,可移动程序命令的位置较少,结果,程序命令没有充分扩散而集中到特定的部位。由此,在现有方法中存在如下课题:通过重点解析难以扩散程序命令的部位(分支和循环等)以外的部位,能够较容易地找出计算秘密信息的程序命令组。
并且,在非专利文献1中记载有以下内容:通过在程序的中途改变存储计算中途的值的变量的存储器,使得程序的解析变得困难。
但是,在对控制构造复杂的程序实施该方法时,仍然存在与上述相同的课题。以下具体说明该课题。
设定混淆前的原始程序是与上述相同的图28的程序。此外,程序的控制流是图29的控制流。在该程序的中途置换变量的作用。
无法在分支的单侧进行变量的替换。
例如在块9114的最后追加用于替换变量的作用的命令“d=a;e=b;”的情况下,在块9115中包含的程序命令组“labelE:b*=a*123;returnb;”中,必须将“a”、“b”置换成“d”、“e”而成为“labelE:e*=d*123;returne;”。
但是,在这样置换时,在不执行块9114而执行块9115的情况下,即,在进行块9111之后执行块9112的分支的情况下,在不执行“d=a;e=b;”的状态下而执行块9115。
在该情况下,d和e的值不同于a和b的值,因此无法得到正确的运算结果。由此,与使程序命令扩散时相同,能避免在分支的单侧进行替换,对块9111追加替换变量作用的处理。因此,即使想要追加多个替换变量作用的处理,这样的处理也会集中到块9111,因而具有容易找到处理这样的课题。
由以上的例子可知,在现有的混淆方法中即使进行使程序中包含的处理变得复杂的转换,作为使程序的解析变得困难的混淆方法,存在难以通过其控制构造使其变得复杂这样的课题。
产业上的可利用性
本发明能够将程序混淆成比现有技术更加难以解析,因此,在处理加密密钥等秘密信息的程序的混淆装置等领域是有用的。

Claims (16)

1.一种程序混淆装置,根据由多个块构成的对象程序生成混淆程序,其特征在于,
上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;
上述程序混淆装置具有:
属性确定单元,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及
生成单元,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
2.根据权利要求1所述的程序混淆装置,其特征在于,
上述对象程序包括秘密信息,
上述程序混淆装置还具有块确定单元,该块确定单元确定包含从上述对象程序根据特定变量的值求出上述秘密信息的命令在内的块,作为秘密块;
1个或多个特定变量和1个或多个其值分别与上述属性相对应,
上述生成单元对执行控制转移到上述秘密块的块,附加使特定变量成为与该块的出口属性相对应的值的1个或多个命令,生成混淆程序。
3.根据权利要求2所述的程序混淆装置,其特征在于,
在执行控制转移到上述秘密块的块存在多个的情况下,上述生成单元对全部该块附加使特定变量成为与该块的出口属性相对应的值的1个或多个命令,生成混淆程序。
4.根据权利要求2所述的程序混淆装置,其特征在于,
上述生成单元还对可在上述秘密块之前执行的块附加1个或多个命令,生成混淆程序,该1个或多个命令使特定变量从与该块的入口属性相对应的特定变量的值成为与该块的出口属性相对应的值。
5.根据权利要求2所述的程序混淆装置,其特征在于,
上述程序混淆装置还具有变量追加单元,该变量追加单元追加上述对象程序中不包含的变量,
上述特定变量是由上述变量追加单元追加的变量。
6.根据权利要求2所述的程序混淆装置,其特征在于,
存在多个与块的入口或出口的属性相对应的特定变量的值,
上述生成单元附加使特定变量从与块的入口属性相对应的特定变量的某个值成为与该块的出口属性相对应的某个值的1个或多个命令。
7.根据权利要求2所述的程序混淆装置,其特征在于,
存在多个上述特定变量,
上述生成单元对一个块附加按照该块的出口属性替换特定变量中的1个特定变量的值和其它特定变量的值的命令,
对执行控制从上述一个块的出口转移的其他块,按照该块的入口属性,附加替换上述特定变量的值和上述其它特定变量的值的命令,生成混淆程序。
8.根据权利要求2所述的程序混淆装置,其特征在于,
预定运算分别与上述属性相对应,
上述生成单元对一个块附加如下命令,该命令使得对特定变量的值实施了与该块的出口属性相对应的预定运算后的结果值成为该特定变量的值,
上述生成单元对执行控制从上述一个块的出口转移的其他块附加如下命令,生成混淆程序,该命令使得对该特定变量的值实施了与该块的入口属性相对应的预定运算的逆运算后的结果值成为该特定变量的值。
9.根据权利要求1所述的程序混淆装置,其特征在于,
多个特定变量的值的替换分别与上述属性相对应,
上述生成单元对一个块附加进行如下处理的命令,该处理是按照该块的出口属性替换特定变量中的1个特定变量的值和其它特定变量的值的处理,
上述生成单元对执行控制从上述一个块的出口转移的其他块附加进行如下处理的命令,生成混淆程序,该处理是按照该块的入口属性替换上述特定变量的值和上述其它特定变量的值的处理。
10.根据权利要求1所述的程序混淆装置,其特征在于,
特定变量和预定运算分别与上述属性相对应,
上述生成单元对一个块附加进行如下处理的命令,该处理是对特定变量的值实施与该块的出口属性相对应的预定运算后的结果值成为该特定变量的值的处理,
上述生成单元对执行控制从上述一个块的出口转移的其他块附加进行如下处理的命令,生成混淆程序,该处理是对该特定变量的值实施与该块的入口属性相对应的预定运算的逆运算后的结果值成为该特定变量的值的处理。
11.根据权利要求1所述的程序混淆装置,其特征在于,
上述程序混淆装置还具有对块进行加密的加密单元,
加密密钥分别与上述属性相对应,
上述生成单元利用与块的出口属性对应起来的加密密钥,附加进行如下解密处理的1个或多个命令,上述解密处理是对执行控制从该块的出口转移的其他块进行解密,由上述加密单元利用与该块的入口属性对应起来的加密密钥对附加有上述1个或多个命令的块进行加密,生成混淆程序。
12.一种程序混淆装置,根据由多个块构成的对象程序生成混淆程序,其特征在于,
上述块是由具有顺序的多个命令构成的命令组,
上述程序混淆装置具有:
属性确定单元,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及
生成单元,对1个或多个块,在来自入口的全部执行控制通过的部分附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
13.一种程序混淆装置,根据由多个块构成的对象程序生成混淆程序,其特征在于,
上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;
上述程序混淆装置具有:
属性确定单元,对块中的执行控制的入口和出口分别确定属性;以及
生成单元,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序,
1个或多个特定变量和1个或多个其值分别与上述属性相对应,对应于转移源的全部块的出口属性的值,与执行控制从多个块转移来的块的入口属性相对应,
上述生成单元对1个或多个块,附加进行如下处理的1个或多个命令,生成混淆程序,该处理是使特定变量从与块的入口属性相对应的特定变量的值中的任意值都成为与该块的出口属性相对应的值的处理。
14.一种程序混淆方法,在程序混淆装置中使用,根据由多个块构成的对象程序生成混淆程序,其特征在于,
上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;
上述混淆方法包括:
属性确定步骤,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及
生成步骤,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
15.一种计算机程序,使程序混淆装置进行混淆处理,根据由多个块构成的对象程序生成混淆程序,其特征在于,
上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;
上述计算机程序具有:
属性确定步骤,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及
生成步骤,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
16.一种集成电路,在程序混淆装置中使用,根据由多个块构成的对象程序生成混淆程序,其特征在于,
上述块是如下命令组,该命令组由具有顺序的多个命令构成,除最初的命令以外执行控制不从其它块转移,除最后的命令以外执行控制不转移到其它块;
上述集成电路具有:
属性确定单元,对块中的执行控制的入口和出口分别确定属性,进行该确定,使得处于执行控制从一个块的出口转移到其他块的入口的关系中的该出口和该入口成为相同的属性;以及
生成单元,对1个或多个块附加进行与该块的入口或出口的属性相对应的处理的1个或多个命令,生成混淆程序。
CNA200780011709XA 2006-02-06 2007-02-06 程序混淆装置 Pending CN101416197A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2006028579 2006-02-06
JP028579/2006 2006-02-06

Publications (1)

Publication Number Publication Date
CN101416197A true CN101416197A (zh) 2009-04-22

Family

ID=38345154

Family Applications (1)

Application Number Title Priority Date Filing Date
CNA200780011709XA Pending CN101416197A (zh) 2006-02-06 2007-02-06 程序混淆装置

Country Status (4)

Country Link
US (1) US20090307500A1 (zh)
JP (1) JP4971200B2 (zh)
CN (1) CN101416197A (zh)
WO (1) WO2007091558A1 (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102582268A (zh) * 2012-01-10 2012-07-18 珠海天威技术开发有限公司 微控制器及其算法保护方法、存储芯片、耗材容器、成像设备
CN102713839A (zh) * 2009-10-08 2012-10-03 埃德图加拿大公司 用于动态函数调用系统中的积极自我修改的系统和方法
CN104798075A (zh) * 2012-09-28 2015-07-22 惠普发展公司,有限责任合伙企业 应用随机化
CN107077562A (zh) * 2014-06-20 2017-08-18 智能Ic卡公司 用于动态控制代码执行的计算机实现的方法和系统

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101416197A (zh) * 2006-02-06 2009-04-22 松下电器产业株式会社 程序混淆装置
US8112636B1 (en) * 2007-11-06 2012-02-07 Lockheed Martin Corporation Protection of code or data from exposure by use of code injection service
US8856500B2 (en) 2008-02-06 2014-10-07 Nxp B.V. Obfuscating program by scattering sequential instructions into memory regions such that jumps occur with steps of both signs in equal frequency
EP2243098A2 (en) * 2008-02-11 2010-10-27 Nxp B.V. Method of program obfuscation and processing device for executing obfuscated programs
JP5300294B2 (ja) * 2008-03-25 2013-09-25 パナソニック株式会社 処理装置、難読化装置、プログラムおよび集積回路
FR2942558B1 (fr) * 2009-02-24 2014-05-30 Eads Europ Aeronautic Defence Procede d'obscurcissement d'un programme d'ordinateur.
JP6203028B2 (ja) * 2013-12-13 2017-09-27 Kddi株式会社 疑似乱数生成装置及び方法、並びにプログラム難読化装置及び方法
EP2913772A1 (de) * 2014-02-28 2015-09-02 Wibu-Systems AG Verfahren und Computersystem zum Schutz eines Computerprogramms gegen Beeinflussung
US9858440B1 (en) * 2014-05-23 2018-01-02 Shape Security, Inc. Encoding of sensitive data
US20160328539A1 (en) * 2015-05-05 2016-11-10 Nxp B.V. Obscuring Software Code With Split Variables
US10068070B2 (en) * 2015-05-05 2018-09-04 Nxp B.V. White-box elliptic curve point multiplication
WO2017007521A1 (en) * 2015-07-09 2017-01-12 Hrl Laboratories, Llc Non-malleable obfuscator for sparse functions
US10509918B1 (en) * 2015-09-18 2019-12-17 Hrl Laboratories, Llc One-time obfuscation for polynomial-size ordered binary decision diagrams (POBDDs)
EP3502935A1 (en) * 2017-12-20 2019-06-26 Koninklijke Philips N.V. Compiling device and method
US11550903B1 (en) * 2019-04-26 2023-01-10 Joseph Alan Epstein System and method for trustworthiness, reputation, provenance, and measurement of software
US11163675B1 (en) 2021-04-07 2021-11-02 State Farm Mutual Automobile Insurance Company Mutation testing in parallel threads

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6006328A (en) * 1995-07-14 1999-12-21 Christopher N. Drake Computer software authentication, protection, and security system
US6192475B1 (en) * 1997-03-31 2001-02-20 David R. Wallace System and method for cloaking software
US6668325B1 (en) * 1997-06-09 2003-12-23 Intertrust Technologies Obfuscation techniques for enhancing software security
US6643775B1 (en) * 1997-12-05 2003-11-04 Jamama, Llc Use of code obfuscation to inhibit generation of non-use-restricted versions of copy protected software applications
US6779114B1 (en) * 1999-08-19 2004-08-17 Cloakware Corporation Tamper resistant software-control flow encoding
CA2305078A1 (en) * 2000-04-12 2001-10-12 Cloakware Corporation Tamper resistant software - mass data encoding
CA2353347A1 (en) * 2001-07-20 2003-01-20 Cloakware Corporation Tamper-resistant control-flow with software fingerprinting
US7210134B1 (en) * 2001-09-06 2007-04-24 Sonic Solutions Deterring reverse-engineering of software systems by randomizing the siting of stack-based data
US7124445B2 (en) * 2002-06-21 2006-10-17 Pace Anti-Piracy, Inc. Protecting software from unauthorized use by converting source code modules to byte codes
US7383443B2 (en) * 2002-06-27 2008-06-03 Microsoft Corporation System and method for obfuscating code using instruction replacement scheme
JP2004185064A (ja) * 2002-11-29 2004-07-02 Matsushita Electric Ind Co Ltd プログラムの難読化装置及び難読化方法
US7631292B2 (en) * 2003-11-05 2009-12-08 Microsoft Corporation Code individualism and execution protection
US7996671B2 (en) * 2003-11-17 2011-08-09 Bluerisc Inc. Security of program executables and microprocessors based on compiler-architecture interaction
US7444677B2 (en) * 2004-03-05 2008-10-28 Microsoft Corporation Intentional cascade failure
US7620987B2 (en) * 2005-08-12 2009-11-17 Microsoft Corporation Obfuscating computer code to prevent an attack
CN101416197A (zh) * 2006-02-06 2009-04-22 松下电器产业株式会社 程序混淆装置

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102713839A (zh) * 2009-10-08 2012-10-03 埃德图加拿大公司 用于动态函数调用系统中的积极自我修改的系统和方法
US9195476B2 (en) 2009-10-08 2015-11-24 Irdeto B.V. System and method for aggressive self-modification in dynamic function call systems
CN102713839B (zh) * 2009-10-08 2015-11-25 爱迪德技术有限公司 用于动态函数调用系统中的积极自我修改的系统和方法
CN102582268A (zh) * 2012-01-10 2012-07-18 珠海天威技术开发有限公司 微控制器及其算法保护方法、存储芯片、耗材容器、成像设备
CN104798075A (zh) * 2012-09-28 2015-07-22 惠普发展公司,有限责任合伙企业 应用随机化
CN107077562A (zh) * 2014-06-20 2017-08-18 智能Ic卡公司 用于动态控制代码执行的计算机实现的方法和系统

Also Published As

Publication number Publication date
JP4971200B2 (ja) 2012-07-11
JPWO2007091558A1 (ja) 2009-07-02
WO2007091558A1 (ja) 2007-08-16
US20090307500A1 (en) 2009-12-10

Similar Documents

Publication Publication Date Title
CN101416197A (zh) 程序混淆装置
JP4970279B2 (ja) セキュア処理装置、セキュア処理方法、難読化秘密情報埋め込み方法、プログラム、記憶媒体および集積回路
US8312297B2 (en) Program illegiblizing device and method
Archetti et al. A column generation approach for the split delivery vehicle routing problem
CN100534180C (zh) 用于连续控制和保护媒体内容的方法和装置
CN100555300C (zh) 程序变换装置、安全处理装置、计算机程序及记录媒体
CN104662553B (zh) 程序验证装置、程序验证方法
Miller et al. Smart contracts and opportunities for formal methods
CN112910912A (zh) 用于对等内容共享的访问控制技术
CN102047220A (zh) 生成软件应用程序的白盒实现的系统和方法
CN109478996A (zh) 用于执行混淆算术的设备和方法
CN101208690B (zh) 计算环境中翻译表达式
CN106464484B (zh) 预定函数的混淆执行
CN108446538A (zh) 基于状态、符号执行和单点逻辑的源代码加固方法及装置
CN101479774B (zh) 加密处理装置、数据变换方法和集成电路
Schedl et al. Multiperspective and multidisciplinary treatment of fairness in recommender systems research
WO2020090118A1 (ja) ブロックチェーンテクノロジーを活用したディジタルコンテンツライセンス管理システム
US8312550B2 (en) Method, system and apparatus for processing rights
CN109558341A (zh) 计算机内存数据保护方法和计算机
Van Drunen et al. Recommenders you can rely on: A legal and empirical perspective on the transparency and control individuals require to trust news personalisation
Sørlie et al. Sensing as a service revisited: A property rights enforcement and pricing model for IIoT data marketplaces
Owens et al. Inter-family communication in hyperledger sawtooth and its application to a crypto-asset framework
Bajwa et al. Stack-aware hyperproperties
CN105245333A (zh) 一种多应用智能卡密钥管理方法及系统
CN108369613A (zh) 计算设备和方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Open date: 20090422