CN1971519A - 用于生成受保护可执行程序的设备、存储介质和方法 - Google Patents
用于生成受保护可执行程序的设备、存储介质和方法 Download PDFInfo
- Publication number
- CN1971519A CN1971519A CNA2006101625157A CN200610162515A CN1971519A CN 1971519 A CN1971519 A CN 1971519A CN A2006101625157 A CNA2006101625157 A CN A2006101625157A CN 200610162515 A CN200610162515 A CN 200610162515A CN 1971519 A CN1971519 A CN 1971519A
- Authority
- CN
- China
- Prior art keywords
- function
- code
- generate
- objective function
- parts
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 49
- 238000003860 storage Methods 0.000 title claims abstract description 11
- 230000006870 function Effects 0.000 claims description 511
- 238000003780 insertion Methods 0.000 claims description 75
- 230000037431 insertion Effects 0.000 claims description 75
- 238000012545 processing Methods 0.000 claims description 55
- 238000004458 analytical method Methods 0.000 claims description 19
- 230000008676 import Effects 0.000 claims description 2
- 230000006378 damage Effects 0.000 claims 1
- 230000008569 process Effects 0.000 abstract description 10
- 238000006243 chemical reaction Methods 0.000 description 28
- 230000008859 change Effects 0.000 description 16
- 239000003607 modifier Substances 0.000 description 13
- 238000005516 engineering process Methods 0.000 description 5
- 239000000284 extract Substances 0.000 description 4
- 238000005457 optimization Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- GOLXNESZZPUPJE-UHFFFAOYSA-N spiromesifen Chemical compound CC1=CC(C)=CC(C)=C1C(C(O1)=O)=C(OC(=O)CC(C)(C)C)C11CCCC1 GOLXNESZZPUPJE-UHFFFAOYSA-N 0.000 description 2
- 241001269238 Data Species 0.000 description 1
- 230000009471 action Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 238000005034 decoration Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000009826 distribution Methods 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 239000003550 marker Substances 0.000 description 1
- 230000010076 replication Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 238000004513 sizing Methods 0.000 description 1
- 238000005728 strengthening Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/121—Restricting unauthorised execution of programs
- G06F21/125—Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L2209/00—Additional information or applications relating to cryptographic mechanisms or cryptographic arrangements for secret or secure communication H04L9/00
- H04L2209/60—Digital content management, e.g. content distribution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Signal Processing (AREA)
- Computer Networks & Wireless Communication (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Storage Device Security (AREA)
Abstract
提供一种受保护可执行代码生成装置。所述装置包括:用于生成插入函数的部件,所述插入函数具有与待保护的目标函数的函数名相同的函数名,所述插入函数包括用于与所述目标函数的保护有关的处理的代码以及用于在所述处理之后调用所述目标函数的调用指令;以及用于基于目标代码和所述插入函数生成受保护可执行代码的部件,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为第二函数名。
Description
技术领域
本发明涉及用于为程序增加局部保护(例如加密)以使得不能读取包含在程序中的受保护部分的内容的技术。
背景技术
作为本领域的相关技术,在文件1(日本专利No.3033562的说明书)中公开了一种技术。简要地说,如图1所示,标记(或用于解密的代码)112、116被人工地插入源代码100中的待保护部分114之前及之后,插入处理之后的源代码110被传送到编译器进行编译,产生的目标代码120被传送至链接器并执行链接处理。然后加密工具被应用于链接处理之后产生的目标代码130。加密工具根据目标代码130中的标记132、136加密待保护的部分134(因此加密产生加密代码144),并且以用于解密处理的二进制代码(解密代码142)替换标记132、136,最后生成可执行码140。
此外,与在上述文件1中公开的插入标记不同,在文件2(日本专利特开No.2005-165919)中公开的另一个有关技术中,则插入用于解密加密代码的函数的形式的解密代码。简要地说,在这种技术中,如图2所示,解密函数212被人工地插入源代码200中的待保护部分214之前,并且指示加密部分的结尾的函数216被人工地插入部分214之后,插入处理之后的源代码210被传送至编译器并且进行编译,产生的目标代码220被传送至链接器并且被链接至必要的代码,例如解密函数的目标代码230。因此,该过程生成包括跟随在调用解密代码246的指令242之后的待保护部分244的明文的目标代码240。然后,加密工具被应用于链接处理之后产生的目标代码240。加密工具加密目标代码240中的待保护部分244(因此加密产生加密代码254),最后生成可执行代码250。如果执行该可执行代码,则指令252调用解密代码256并使其执行,从而使得加密代码254被解密并被执行。
上述相关技术都实现部分地保护可执行形式的程序的功能。然而,编译器通常在代码执行序列中进行代码优化。因为由于代码优化而导致代码部分的执行序列发生改变,所以另一个代码部分可能插入待加密的代码部分,或者一部分待加密的代码部分可能移动到外面的另一个位置。因此,因为不打算加密的部分可能最终与打算加密的部分一同被加密,或者打算加密的部分可能最终在加密范围之外从而未被加密,所以,存在生成不能正确地工作的程序的风险,例如失控的程序。尽管可以小心地生成源代码以防止由于优化而导致待加密部分中的执行序列发生改变,但是这会增大程序员的负担。
发明内容
在本发明的一个方面,提供了一种受保护可执行代码生成装置,包括:用于生成插入函数的部件,所述插入函数具有与待保护的目标函数的函数名相同的函数名,所述插入函数包括用于与所述目标函数的保护有关的处理的代码以及用于在所述处理之后调用所述目标函数的调用指令;以及用于基于目标代码和所述插入函数生成受保护可执行代码的部件,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为第二函数名。
附图说明
将基于下列附图详细描述本发明的实施例,其中:
图1说明了相关技术中的加密程序生成系统的处理;
图2说明了另一个相关技术中的加密程序生成系统的处理;
图3显示用于生成其中待保护的代码部分被加密的加密程序的加密程序生成系统的一个典型实施例;
图4示意性地显示由图3的系统执行的处理的流程;
图5示意性地显示被插入的函数的内容的一个例子;
图6显示第一转换器的处理过程的例子;
图7显示第二转换器的处理过程的例子;
图8示意性地显示被插入的函数的内容的另一个例子;
图9说明多重加密的例子;
图10说明多重加密的另一个例子;
图11说明用于在被插入的函数和目标函数之间传递参数的方法的一个例子;
图12说明用于在被插入的函数和目标函数之间传递参数的方法的另一个例子;
图13显示当考虑经由跳转表的函数调用时的“转换2”的处理过程的例子;
图14显示当考虑经由跳转表的函数调用时的“转换2”的处理过程的另一个例子;
图15显示用于防止使用一种工具(例如调试器)进行代码分析的插入函数的例子;以及
图16显示提供保护以防止使用一种工具(例如调试器)进行代码分析的系统的例子。
具体实施方式
以下将参照附图描述本发明的典型实施例。
图3显示用于生成其中待保护的代码部分被加密的加密程序的加密可执行程序生成系统的一个典型实施例。该系统包括编译器302、目标函数指定模块306、第一转换器308、链接器310以及第二转换器312。这些模块302、306、308、310、312通常通过在通用计算机上执行程序来实现,该程序中包含用于以下将描述的每个模块的函数或处理,所述通用计算机包括CPU、存储器、固定存储器设备、显示设备以及输入设备,例如键盘和鼠标。这种程序可以通过从便携式记录介质(例如CD-ROM或DVD)加载其或者经由网络下载其从而安装到计算机上。应该注意,所有的模块不必安装在单个计算机中,也可以配置一种系统,其中,多个模块分布并安装在多个计算机上,从而在操作中链接这些模块。
编译器302编译待处理的程序的源代码300并生成目标代码304。一种传统的编译器可以被用于编译器302。虽然在上述相关技术中,标记或对解密函数的调用指令被人工地插入源代码中,但是在图3的例子中,源代码300不是人工地编辑的。编译器302可以使用公知的技术编译源代码300。
目标函数指定模块306从用户接收对源代码300中的作为待保护(在该例子中为加密)对象的函数的指定。例如,目标函数指定模块306使得能够通过在屏幕上显示源代码300,在包含在源代码300中的函数附近设置复选框,并且提供选择状态,可以由用户点击复选框从而选择一函数作为待保护的对象(以下称为目标函数)。或者代替显示源代码300,可以提取包含在源代码300中的函数,并且将其显示在屏幕上,并且带有对应的复选框,然后由用户进行选择。然后,目标函数指定模块306生成并且输出由用户经由这种用户接口屏幕选择的目标函数的列表(例如函数名的列表)。
或者,可以由用户使用文本编辑器创建目标函数的函数名的列表,然后由目标函数指定模块306接收。
第一转换器308使用由目标函数指定模块306生成的目标函数列表对由编译器302生成的目标代码304执行转换。该转换将被称为“转换1”。在转换1中,目标代码304中的目标函数名(或表示函数的符号名称)被改变为不同的名称。此外,在转换1中,创建插入函数以使得目标函数能够被正确地加密,并且使得在执行时能够正确地解密该加密函数。随后将详细说明改变函数名和创建插入函数。
例如,第一转换器308将其中函数名已经被改变的目标代码和插入函数作为分离的文件输出。此外,第一转换器308可以代替地将插入函数添加入其中函数名已经被改变的目标代码的文件,然后输出该文件。插入函数和由第一转换器308输出的目标代码的文件,或文件组合被传递给链接器310。
链接器310将从第一转换器308接收的文件与其它必需的函数(例如库)链接为一个可执行程序文件。现有技术中的常规链接器可以用于链接器310。
第二转换器312获取从链接器310输出的可执行程序文件,并加密其中的待保护的部分,从而生成部分被加密的加密可执行代码314的文件。由第二转换器312执行的处理(包括加密)被称为“转换2”。稍后将详细说明转换2。
图4示意性地显示由图3的系统执行的处理的流程。在该实施例中,由用户执行的人工步骤包括生成源代码400(对应于图3的源代码300),其包括待保护的代码部分,所述人工步骤还包括通过操作目标函数指定模块306创建待加密的函数的列表410。其余的过程是自动化的,基本上不需要任何用户操作。
通过编译器302,源代码400被转换为目标代码420(对应于图3的目标代码304)。在该例子中,目标代码420中的表示为函数名funcA422的函数是目标函数。
由第一转换器308对目标代码420进行“转换1”的处理。在“转换1”中,目标函数的函数名被改变为另一个函数名。改变函数名以便不与目标代码420中的现存函数的函数名相一致,并且不与另一个目标函数在改变之后的函数名相一致。例如,一种方法是通过将特定的字符串(或数据串)添加到原函数名从而生成改变后的函数名。添加在普通函数名中不使用的字符串或添加足够长的字符串可以产生不与其它的函数名相同的函数名。在所显示的例子中,原函数名“funcA”被改变为添加了字符串“X”的函数名“funcAX”432。应该注意,虽然以该方式在“转换1”中改变目标函数的定义(函数体)中的函数名,但是不改变调用目标函数的指令中的函数名。
此外,在“转换1”中创建插入函数434。第一转换器308将与原目标函数名称相同的函数名“funcA”提供给插入函数434。因此,目标代码430中的用于调用目标函数“funcA”的指令调用插入函数434而不是目标函数。
图5示意性地显示由“转换1”创建的插入函数434(在图5中显示为插入函数500)的一个例子。
到解密代码510的跳转指令502首先位于插入函数500的开始。其后有将在“转换2”的处理(加密)(稍后说明)中使用的数据504、数据506和数据区域508,并且它们之后跟随着解密代码510。解密代码510包括至少一条用于解密处理的指令。因为解密函数是不变的,所以其可以保留在第二转换器312中。数据可以被设置入重新定位表(稍后详细说明),从而使得例如在确定地址之后,通过链接器310将指示将由解密处理解密的加密函数的地址的信息嵌入。因为数据504到数据508之间的尺寸是已知的,所以可以确定跳转指令502的跳转目的地的地址。数据504表示用于找到“转换2”的处理中的函数500的专用的标记信息,并且使用通常不在可执行代码中表示的数据串。数据506指示函数“funcAX”(即,已使函数名改变的目标函数)的大小。这可以从目标代码420获得。
此外,固定数据区域508是具有足够大小以存储地址信息的数据区域。由链接器310的后续处理分配的函数“funcAX”的地址被设置到该固定数据区域中。也就是说,因为该插入函数“funcA”是用于解密目标函数“funcAX”的,所以函数“funcAX”的地址对于解密处理和函数调用都是必需的。然而,直到链接器310已执行链接处理之后,才能确定执行过程中函数将加载到的地址的值。因此,预先在这里保留固定数据区域508,作为用于保存由链接器310获得的函数“funcAX”的地址的空间。
其中描述了用于解密已加密的目标函数的处理的解密代码510位于上述数据504至数据508之后。通过参考关于函数“funcAX”的大小的数据506和将由链接器310写到固定数据区域508之后的位置的函数“funcAX”的起始地址,从而获取将由解密代码510解密的代码的位置。虽然在加密处理(转换2)中使用数据504,但是当执行加密程序时,不使用其并且可以在转换2中删除其。跳转指令502位于插入函数500的开始,从而使得数据504至数据508不作为指令执行。然后,用于调用已替换其函数名的函数的代码512位于解密代码510之后。
跳转指令502、数据506至数据508、代码510和代码512的排列或序列不局限于该例子,它们以它们各自的相对于参考标记504的位置(地址)的预定关系来定位。(然而,解密代码510和函数调用指令512的排列需要指令512在解密代码510之后执行。)
此外,“转换1”还创建将附加于插入函数500的重新定位表520。除常规重新定位信息之外,该重新定位表520包括数据条目522和数据条目524。数据条目522写有数据,从而使得链接器310将在链接过程中显露的函数“funcAX”的地址插入插入函数500中的固定数据区域508。此外,数据条目524设置有数据,以使得链接器310将函数“funcAX”的地址写入指令代码512的操作数,该指令代码512调用函数“funcAX”。这些地址可以适当的根据需要使用相对地址或绝对地址来指定。在以下表格中显示了重新定位表的数据条目522和数据条目524的具体例子。
表1
偏移量 | 类型 | 应用于 | 索引 | 名称 |
00000012 | REL32 | 00000000 | 13 | _funcAX |
00000056 | REL32 | 00000000 | 13 | _funcAX |
该例子是由Microsoft Visual Studio(注册商标)使用的COFF(公用目标文件格式)格式。表的首行显示数据项头而不是表的内容。第二行对应于数据条目522的数据,第三行对应于数据条目524的数据。“偏移量”数据项是表示位置的值,其中一地址将被写为从函数开始的偏移量(相对位置)。“类型”是将被写的地址的类型,并且在上述例子(“REL32”)中指示将写32位的相对地址。“应用于”指示写目的地的数据(固定数据区域508中的数据和调用指令512的操作数)。这些项不表示重新定位表中的数据。“索引”是处于将被写的地址的数据的符号名的索引(符号表的条目编号),在该例子中指示函数“funcAX”。“名称”显示通过参考符号表由“索引”指示的符号(这里为函数名),并且实际上不存在于重新定位表中。
在表1的例子中,“00000012”指示固定数据区域的位置距离函数的开始0x12字节,“00000056”指示funcAX指令的操作数距离函数的开始0x56字节。此外,索引“13”假定funcAX的符号已被分配索引号13。在这种方式下,重新定位表由包括写目的地偏移量、将被写的地址的类型以及处于将被写的地址的数据的符号(索引)等三项的条目组成。
以下将参照图6详细描述由第一转换器308执行的“转换1”的处理过程的例子。
首先,第一转换器308接受由编译器302输出的目标代码304(即420)以及由目标函数指定模块306创建的目标函数列表作为输入(S1)。第一转换器308接下来从目标函数的列表中提取(S2)一个目标函数。如果未达到函数列表的结尾(即,如果可以在S3中从列表中提取一函数),那么执行进行至步骤S4。
在步骤4,扫描目标代码304,并且检测在步骤S2中提取的目标函数。更详细地,从目标代码304中的符号表中检测到对应于目标函数的函数名的符号,并且从符号表读取目标文件中的对应于该符号的代码位置。代码位置例如由目标文件中的段号和距该段的开始的偏移量的组合来表示。从而可以检测到目标函数。
接下来第一转换器308在步骤S5中获取目标函数的大小(数据大小)。然后,在步骤S6,目标函数的函数名被改变为另一个不与其它名称相同的函数名。即,通过添加特定的字符串而改变的函数名的符号被添加到符号表,并且指向函数的函数定义的符号名称变为新增加的符号名称。
接下来,在步骤S7,第一转换器308将具有原目标函数的函数名的插入函数500插入目标代码304。即,添加具有指示原函数的函数名的符号名称的新函数(插入函数500)的函数定义。关于目标函数的大小的数据506是插入函数500中的唯一的依赖于目标函数的部分。如果在步骤S5获得其,那么可以创建插入函数500。在步骤S8,重新定位表的数据条目522和数据条目524被添加到插入函数500的预定位置,从而使得链接器310可以设置目标函数的地址。然后执行返回到步骤S2。
重复步骤S2至S8的处理,直到完成对目标函数列表中的所有函数的处理。当达到列表的结尾时(S3),转换1的处理完成并且第一转换器308输出(S9)转换结果作为符合目标代码格式的数据(目标代码430)。从而“转换1”的处理终止。
返回图4的描述,由链接器310将由“转换1”生成的目标代码430与其它所需的函数进行链接。链接器310的处理确定函数“funcAX”的地址,该地址被设置到固定数据区域508中,并且该地址被进一步设置为调用指令代码512的操作数。在由链接器310输出的可执行代码440中,目标函数的代码被以明文的机器代码的形式写在调用插入函数500的插入代码的指令442之后,之后跟随有插入函数500的插入代码(434)。应该注意,将目标函数的代码444放于调用指令442之后仅仅是一个例子。实际上,代码执行序列由链接器适当地确定,从而使得调用指令442和目标函数代码444可以具有任意的排列。
可执行代码440被传送至第二转换器312。第二转换器312基于可执行代码440中的插入代码446的数据指定待保护的代码444的范围,并且加密该代码444。将参照图7描述该过程。
在该过程中,第二转换器312首先输入并接受(S11)由链接器310输出的明文形式的可执行代码440。接下来,使用在“转换1”中嵌入的标记504作为关键字搜索可执行代码440以检测(S12)插入函数500。如果在达到可执行代码440的结尾之前找到(S13)插入函数500,那么利用标记504作为参考识别数据506和数据508的地址,从数据506和数据508分别获取(S14)对应于插入函数500的目标函数的大小(数据506)和地址(数据508)。第二转换器312然后在标记504上重写(S15)另一个数据串,以便删除检测到的标记504。这样做是为了如果加密的可执行代码450被分析,那么可以防止将标记504用作分析的线索。可以通过以不可预知的并且相互不同的数据串(例如随机数)来重写可执行代码中的每个标记位置来隐藏标记的踪迹。然后,使用预定的加密算法,第二转换器312加密(S16)可执行代码440中的由在步骤S14中获取的地址和大小指示的范围(即,目标函数的代码段)。之后,执行返回步骤S12,并且重复步骤S12和S13的处理,直到达到可执行代码440的结尾。当在步骤S13中判断出已达到可执行代码440的结尾时,这时输出(S17)所创建的可执行代码450。
在由第二转换器312的处理创建的可执行代码450中,有用于调用解密代码的指令452,以及目标函数的加密代码454,其后跟随有解密代码456,解密代码456之后有用于调用目标函数454的加密代码的指令。调用指令452以及代码454可以具有任何排列,并不局限于图中所显示的序列。如果计算机系统执行可执行代码450,那么解密代码456首先被函数“funcA”调用,并且被执行,之后,目标函数的加密代码454被调用。因此,加密代码454被解密然后被执行。
根据上述例子,以函数为单位指定并执行加密。这极大地减少了相关技术中存在的问题,即,插入待加密的代码的其它代码也被加密的问题。此外,在相关技术中,在程序开发环境中需要内联汇编的功能以将解密代码和标记插入源代码。然而,在该实施例中,仅需指定目标函数,并且目标函数指定模块306可用于该目的,从而对于无内联汇编器的环境是理想的。此外,在该例子中,源代码本身不被修改,从而改进了源代码的可维护性。
此外,如果将保护一个程序中的多个函数,那么由第一转换器308或第二转换器312插入的解密代码可以具有相互不同的目标函数中的代码。例如,可以使用表示为不同的代码的相同的解密算法的多个解密代码,或使用对应于不同的加密算法的多个解密代码。在后一情况中,在解密代码被第一转换器308插入的结构中,对于第二转换器312,适当加密对应于相应的解密代码的部分的处理是必需的。可以使用多种方法,例如,第一转换器308可以按照预定顺序被用于不同的解密代码,第二转换器312可以根据所述顺序应用对应于相应的解密代码的加密算法,或者第一转换器308可以写指示对应于匹配的加密算法的解密代码的数据,并且第二转换器312可以解释该数据并应用适当的加密算法。
此外,用于重新加密目标函数的代码可以被添加在插入函数500中的用于调用目标函数的调用指令512之后。由此,在执行加密的可执行代码时已解密目标函数并执行其之后,处理返回至插入函数500,并且对所执行的目标函数重新加密。因此,即使执行之后目标函数有留存,主存储器的内容也可以被隐藏。虽然在用于重新加密的代码中,指定将被加密的存储器地址的范围的信息是必需的,但是链接器310可以通过使用例如目标函数的尺寸数据506和地址数据(将被链接器310写入固定数据区域508的数据)这样的信息来解析该范围。
接下来,将参照图8描述将由“转换1”插入目标代码304的插入函数的另一个例子。
插入函数800中的标记802、数据806和数据808可以分别与图5的插入函数中的标记504、数据506和数据508相同。此外,将被添加到重新定位表820的数据条目822和数据条目824可以分别与图5的重新定位表中的数据条目522和数据条目524相同。与图5的插入函数500的区别在于,插入函数800包括指示插入函数800本身的大小的数据804,以及代替解密代码510,保留用于后续的解密代码插入的区域810。
当加密插入函数800本身的一部分时,使用指示插入函数800本身的大小的数据804。即,当包含在插入函数800中的数据(例如代码)被分析时,加密代码的安全性会受到威胁。因此,可以加密插入函数中的除需要为明文形式的部分(例如数据804和用于解密加密的解密代码的代码)以外的那些部分。即,在这种情况下,用于解密目标函数的解密代码(称为第一解密代码)和用于解密所述已加密的解密代码的解密代码(第二解密代码)是必需的。在这种情况下,例如,代码按照第二解密代码和已加密的第一解密代码的顺序设置。此外,在这种情况下,数据804可用于确定插入函数的结尾的位置,因此,在执行过程中,解密处理停止在插入函数的结尾。
此外,在后续的“转换2”处理期间,解密代码(和调用已解密的目标函数的代码)被插入区域810中。通过这种方式,在“转换2”中插入解密代码减少在明文状态下查看解密代码的机会,从而增强了加密代码的安全性。
此外,以这种方式在“转换2”处理中加密插入的解密代码段使得能够保护解密代码,并且提高目标函数的安全性。
应该注意,即使不执行解密代码的加密,仅通过在“转换1”中保留区域810,就可以对解密代码进行一定的保护。
接下来,将描述通过对目标函数应用多重加密处理来强化加密的例子。
图9示意性地显示用于插入一解密函数作为用于每个单独的加密处理的另一个函数的方法的例子。在该例子中,对可执行代码900中的目标函数“funcA()”执行三重加密。在该例子中,执行每个加密处理,通过将预定的字符串(在该例子中为“X”)添加到函数名的结尾,系统地改变函数名。即,因为在该例子中应用三重加密,所以目标函数名改变为函数904“funcAXXX”。用于解密三个加密处理中的外层加密的解密函数908继承与原目标函数相同的函数名“funcA”。函数908包括对应于外层加密的解密代码910以及用于调用用于解密中间层加密的解密函数914“funcAX”的指令912。中间层解密函数914包括用于解密中间层加密的解密代码916以及用于调用内层解密函数920“funcAXX”的指令918。内层解密函数920包括用于解密内层加密的解密代码922以及用于调用目标函数904“funcAXXX”的指令924。根据使加密难以破解的观点,这里的解密代码910、916以及922可以是相互不同的代码。这可以通过将相同的解密算法表示为不同的代码来实现(在这种情况下,内层、中间层和外层加密算法是相同的)。此外,可以使用不同的内层、中间和外层加密算法,以及对应的不同的解密代码910、916和922。
用于目标函数的名称改变规则以及用于各个步骤中的解密函数的命名规则不局限于所说明的例子。可以根据任何使得函数可以在可执行代码中被唯一辨别的规则来命名函数,最外层的解密函数被目标函数的调用所调用,从最内层的解密函数调用名称改变之后的目标函数。
为了创建可执行代码900,第一转换器308根据规则在目标代码中的目标函数的函数定义的开始处改变函数名,并且创建外层、中间以及内层解密函数。虽然未在图中显示,每个解密函数包括标记504、尺寸数据506、固定数据区域508以及重新定位表条目522、524。通过第一转换器308添加的重新定位表的数据条目包括数据以使得由链接器310为函数名“funcAX”、“funcAXX”以及“funcAXXX”确定的地址被设置到相应目标代码的必要的位置(如图5的例子所示的固定数据区域508以及调用指令512)。函数名已被改变的目标代码以及外层、中间层和内层解密函数被链接器310链接为一个可执行代码,同时为函数“funcAX”、“funcAXX”以及“funcAXXX”执行地址解析。
第二转换器312从输出自链接器310的可执行代码中检测解密函数908、914以及920,根据函数之间的调用关系为解密函数指定顺序(内层、中间层、外层),并且指定待保护的代码906的范围。然后按照从内部开始的顺序执行加密。对待保护的代码906和用于调用目标函数904的指令924执行内层加密。指令924是典型的指令,尺寸和位置是已知的,这是因为它是由第一转换器308创建的。此外,与图5中一样,目标函数904的位置和函数920的大小包含在代码922中,根据其可以获得加密所需的信息。因此,第二转换器312可以加密由指令924的位置和尺寸指定的范围。对待保护的代码906(已对其执行了内层加密)和用于调用内层解密函数920的指令918以及内层解密函数920执行中间加密。因为第一转换器308创建指令918和内层解密函数920,所以位置和尺寸是已知的,因此它们也可以被加密。对待保护的代码906(已对其执行了内层和中间层加密)和用于调用中间层解密函数914的指令912以及中间层解密函数914执行外层加密。在通过该处理创建的可执行代码900中,对应于外层加密的解密代码910是明文形式的。然而,与中间和内层加密对应的解密代码916和解密代码918被加密。此外,待保护的代码906被加密三次。
当在计算机系统上执行其中目标函数904已被按这种方式多次加密的可执行代码900时,首先由调用指令902调用外层解密函数908并且解密外层加密。因此,中间层的加密的解密代码916变为明文。接下来,调用中间层解密函数920并且执行明文形式的解密代码916以解密中间层加密。类似地,内层加密被解密,从而使得受保护代码906变为明文,并且代码906由指令924调用并且被执行。
将参照图10描述应用多重加密处理的另一个例子。在该例子中,多个解密代码1010、1012和1014按照该顺序被包含,用于单个解密函数(插入函数)1008中的外层、中间层以及内层。包括待保护的代码1006的目标函数1004被改变为函数名“funcAX”,以与原函数名“funcA”不同,解密函数1008被给予原函数名“funcA”。第一转换器308已知解密代码1010至1014的内容和尺寸(或者可以从写入类似于图5的例子的每个解密代码中的信息获得)。因此,第一转换器300嵌入解密代码,从而用中间层加密处理加密内层解密代码1014,并且用外层加密处理加密中间层解密代码1012。第二转换器312利用内层加密处理加密待保护的代码1006和用于调用目标函数1004的指令1016,利用中间层加密处理加密所述加密结果和内层解密代码1014,并且利用外层加密处理加密所述加密结果和中间解密代码1012。
当在计算机系统上执行如此创建的可执行代码1000时,由用于调用目标函数1004的指令1002调用解密函数1008,并且首先执行外层解密代码1010以解密外层加密。由此已变为明文的中间层解密代码1012被执行以解密中间层加密。由此已变为明文的内层解密代码1014被执行以解密内层加密,从而使得指令1016和受保护的代码1006变为明文。之后,执行指令1016,从而调用受保护代码1006并执行其。
如图9和图10的例子所示,准备多个解密代码,以嵌套的方式,从内层解密代码开始,按顺序对应于每个解密代码的加密产生另一个被加密的解密代码。因此,用于解密目标函数的代码的大部分可以被加密。这可以实现具有较高抵抗分析能力的保护。
在图9和图10的例子中,对待保护的代码906和1006执行内层、中间层和外层加密处理。然而,或者可以仅对待保护的代码执行内层加密,并且用于解密内层加密的解密代码可以由中间层和外层加密来保护。
此外,在上述例子中,目标函数指定模块根据用户指定创建目标函数的列表,并且第一转换器308根据该列表改变目标函数的函数名。然而,这不是实质性要求。代替其,用户(程序员)可以通过添加预定的修饰符来改变源代码中的目标函数名。在该方法中,用户使用编辑器根据预定规则为源代码中的待保护函数的函数定义的函数名添加修饰符。例如,预定字符串“x”被添加到函数名“funcA”的结尾以将其改变为“funcA x”。
然而,所改变的函数名在程序内是唯一的,可以想像可能需要添加长的和复杂的修饰字符串,对于用户来讲之后难以记住、输入或读取和识别。为了在名称改变处理中给予帮助,预处理器宏功能可被用于预处理源代码。即,在这种情况下,用户创建并添加宏到源代码中,用于替代修饰符,其容易理解并且相对容易由用户输入,利用修饰符,其容易被计算机识别并且具有高概率的唯一性。然后用户使用编辑器向源代码中的目标函数的定义的函数名添加面向人的修饰符。如果由预处理器处理该已被添加修饰符的源代码,那么目标函数的定义的函数名可以被改变为具有面向计算机的修饰符的名称。这时,如果已通过添加修饰符而改变的函数名碰巧与另一个函数的函数名相同,那么预处理器检测到该重复,并发出警告,因此作为响应,用户可以改变面向人的修饰符并提供另一个给目标函数的函数名。此外,当如同在该例子中一样,由宏提供修饰符时,删除或修改宏允许修饰符直到那一点才清除。因此,一个优点是,当指定多个用于保护的函数时,这方便了启动保护或禁止保护的切换任务。
在这种情况下,图3的系统中的目标函数指定模块306变得不必要。第一转换器308创建插入函数但是不需要改变函数名。在插入函数的创建中,第一转换器308在目标代码304中搜索具有对应于目标函数的预定修饰符(面向计算机的修饰符)的函数的定义,并且从函数定义的函数名称中删除修饰符以产生插入函数的函数名。插入函数的内容可以与上述例子相同。链接器310和第二转换器312还可以是等同于图3的例子。
如果程序员以这种方式改变源代码中的目标函数的函数名,那么加密可以容易地在启动和禁止之间切换,并且函数名可以被修饰,同时保持可以容易地对源代码进行调试、修改和维护。此外,在图3的例子中,因为第一转换器308自动地改变目标函数的函数名,所以程序员不能预期的副作用可能出现。然而,在其中程序员改变必要的函数名的方法中,可以减少意外的副作用的风险。
在其中用户改变源代码中的目标函数的函数名的方法中,由用户进行的源代码的修改符合具有下列差别的相关技术。即,因为在相关技术中,通过将解密代码或解密函数插入源代码中的函数来修改函数的内部,所以编译器优化向代码的执行序列添加意外的改变,从而导致操作与想要的操作不同。比较起来,这类问题不容易出现在所述实施例的方法中,这是因为仅改变函数定义的函数名。
接下来,通过在计算机系统上执行由图3和图4的装置创建的加密的可执行代码314的例子来说明当从插入函数434调用加密的目标函数432时的函数参数的传递。
在图3和图4的装置中,由调用指令430调用插入函数434,调用指令430原来调用目标函数432。因此,在调用指令430中指定的函数参数被传递给插入函数434。在插入函数434被执行并且加密的目标函数432被解密之后,需要将这些参数正确地传送至解密的目标函数432。
一些参数被设置到寄存器中,另一些被压入堆栈。对于设置到寄存器中的参数,如果正在被使用的寄存器在插入函数中被破坏,那么可以将破坏之前的寄存器的值存入另一个位置(例如以局部变量的形式存储在主存储器中的数据区域或堆栈中),并且所保存的值仅需在调用目标函数之前被再次设置到相同的寄存器中。插入函数434包含用于存储到寄存器中以及从寄存器中恢复的代码。
此外,在图11和图12中显示了传递压入堆栈的参数的方法。
在图11的例子中,复制插入函数的参数并且新压入堆栈。如图11所示,紧接着插入函数被调用之后,堆栈1100的顶层存储到调用源的返回地址1102、参数a 1104、参数b 1106等等,以及调用源的工作区域1108。之后,在其中执行插入函数并且调用解密的目标函数的步骤,原堆栈内容还剩余,用于插入函数的工作区域1118被压入堆栈1100的顶层,参数a 1104、参数b 1106等等被复制并被作为参数a 1114、参数b 1116等压入。这时,当目标函数被调用时,压入到插入函数的返回地址。通过这么做,从插入函数调用的目标函数使用在调用源指定的参数a、b等等并执行计算。为了完成其,第一转换器308包括用于将堆栈的内容复制到在待创建的插入函数中的调用目标函数之前的位置的代码,因此可以将参数传递给目标函数。当在广泛可用的英特尔公司的“奔腾”(注册商标)处理器上执行调用指令时,返回地址被自动地压入堆栈,因此将包含在插入函数中的代码指示将除了到插入函数的返回地址1112以外的数据压入的处理。
一种用于C++语言的编译器,例如通过添加信息(例如参数)到函数名来执行名称修饰,因此,根据修饰信息可以获知参数的数量,并且可以获知每个参数的数据大小。因此,第一转换器308可以判断出从堆栈的顶层复制出多少。
在图12的方法中,用于插入函数的参数不被复制和新压入堆栈。作为替代,保持原堆栈的内容并且用于插入函数。在图12的例子中,插入函数刚被调用之后的堆栈1200与图11的情况相同。在其中插入函数被执行并且解密的目标函数被调用的步骤中,到调用源的返回地址1202被存储到安全的保存区(1210)。对于保存区1210,可以使用存储器中的数据区域、不会被破坏的寄存器、或在主存储器中的数据区域或代码区域中预留的位置(例如,与图5中的固定数据区域508一同留出的)。调用目标函数使得到插入函数的返回地址1204被压入。当已解密的目标函数的执行结束,并且处理返回到插入函数时,保持自目标函数的返回值,并且处理跳转到保存区1210中的到调用源的返回地址1202。可以通过使用转移指令来实现该跳转。此外,另一种方法是将保存区1210的返回地址压入堆栈的顶层,然后执行从插入函数的返回指令(例如ret指令)。为完成其,第一转换器308将用于在调用目标函数的指令之前保存调用源地址1202的代码合并到待创建的插入函数中,并将使处理跳转到返回地址的代码合并到在用于调用目标函数的指令之后的所保存的调用源。
此外,对于由链接器生成的可执行代码中的程序函数的调用结构,通常存在两种方法:函数的直接调用以及经由跳转表的函数的调用。能够将这些方法组合在单个程序中。在经由跳转表调用的情况中,上述函数调用指令指向跳转表中的一个跳转指令。因此,与在图4中说明的,其中对由调用指令指向的目的地进行加密的转化处理一样,也可以对跳转指令进行加密。然而,在跳转目的地的函数体(函数定义)是应被加密的,而不是跳转表。因此,当在“转换2”中获取目标函数的地址,并且在所述地址存在跳转表时,需要找到并且加密在跳转目的地处的函数体的代码。
因此,为了方便起见,第二转换器312检查参考地址(即,由链接器310设置到固定数据区域508中的地址)处的指令,如图13所示。如果指令不是跳转指令(S22),判断出参考地址指向目标函数(S24)并且从该地址开始执行加密。另一方面,如果参考地址处的指令是跳转指令(S22),那么判断出由指令指示的跳转目的地的地址是所述目标函数的开始(S23)并且从该地址开始执行加密。该方法是基于以下事实的,即,与作为跳转指令的跳转表中的条目相比,在函数体的开始处的跳转指令是少有的。
然而,跳转指令能够位于函数定义的开始。考虑这种少有的情况,可以设计下列处理。即,在该处理方法中,第一转换器308将由用户指定的目标函数的主体(例如函数开始处的预定数量的指令)整体或部分地复制并存储到目标函数数据库,第二转换器312参考其。根据由目标函数指定模块306提供的信息,第一转换器308可以确定将保护哪一个函数体并且可以获取关于该函数体的信息。待存储的目标函数体的一部分可以是在函数体中的预定位置处(例如开始处)的预定大小的代码,并且可以是目标函数体的散列值。如图14所示,第二转换器312检查参考地址处的指令(S31),并且判断该指令是否与注册在目标函数数据库中的指令相同(S32)。如果注册了该指令,那么判断出参考地址指向目标函数(S33)并且从该地址开始执行加密。如果指令未注册,那么判断由参考地址指向的代码的开始是否是跳转指令(S34)。如果该参考地址的开始是跳转指令,那么判断(S35)在该指令的跳转目的地的地址是目标函数的开始并且从该地址开始执行加密。如果其不是跳转指令并且目标函数不在参考地址,那么只要未发现正确的目标函数,就不存在跳转到目标函数的指令。在这种情况下,当未发现正确的目标函数时,执行预定的错误处理(S36)。
在上述例子中,加密被用作用于保护目标函数的方法。然而,函数的保护不局限于加密。例如,保护方法可以被设计为防止或禁止使用工具(例如调试器)来分析目标函数。一种保护方式是例如,将分析防止函数包含到一个程序中,所述分析防止函数描述了用于检测由这种工具执行的分析的处理,以及当检测到该工具时,通过停止该工具的执行来禁止对目标函数的分析的处理。
即,在该例子中,改变目标函数的函数名并且创建图15中显示的具有目标函数的原函数名“funcA”的插入函数1500。如上所述,插入函数1500包括分析防止代码1502,该代码中写有用于检测由工具执行的分析的处理,以及用于当检测到分析正在被执行时,停止工具的执行的处理。如果分未被执行,那么不执行用于停止该工具的处理,分析防止代码1502的执行结束,并且执行用于调用对应的目标函数“funcAX”的指令1504。为了使指令1504用作正确的调用指令,附加到插入函数1500的重新定位表1510包括数据条目1512,因此通过链接器将目标函数“funcAX”设置到操作数中。将参照图16描述用于将该类型的保护应用到程序上的系统。
在图16的系统中,编译器1602和链接器1610可以是现有技术中的。编译器1602将源代码1600转换为目标代码1604。目标函数指定模块1606按照与图3的系统中的目标函数指定模块306相同的方式工作,用户使用目标函数指定模块1606指定待保护的函数。代码转换器1608执行与图3中的第一转换器308类似的处理,并且转换目标代码1604中的每个目标函数的函数体的函数名,并将具有每个目标函数的原函数名的插入函数1500插入目标代码1604。链接器1610链接插入函数1500、目标代码1604以及其它的库函数,并在这时执行必要的处理,例如地址解析。该链接处理生成受保护的可执行代码1614。当正常执行受保护的可执行代码1614时,还执行目标函数。另一方面,如果在使用分析工具的分析期间执行,插入函数1500检测该分析并执行控制,例如通过立即停止执行,因此分析工具不转到目标函数。因此,可以防止目标函数被加载到分析工具中。
如上所述的保护目标函数的例子说明了加密和防止基于调试器的分析。然而,存在多种保护目标函数的方法并且使用图15和图16描述的方法适用于各种方法。
虽然使用具体的例子在一定的详细程度上描述了本发明的优选形式,但是应当理解,本发明不局限于此。本领域的技术人员可以进一步理解,在不脱离本发明的精神和范围的情况下,可以对其做出各种改变和变形。
Claims (21)
1.一种受保护可执行代码生成装置,包括:
用于生成插入函数的部件,所述插入函数具有与待保护的目标函数的函数名相同的函数名,所述插入函数包括用于与所述目标函数的保护有关的处理的代码以及用于在所述处理之后调用所述目标函数的调用指令;以及
用于基于目标代码和所述插入函数生成受保护可执行代码的部件,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为第二函数名。
2.根据权利要求1所述的装置,其中:
所述插入函数包括用于解密已被加密的所述目标函数的解密代码,作为所述与保护有关的处理;以及
所述用于生成所述受保护可执行代码的部件包括用于加密所述目标函数的部件。
3.根据权利要求2所述的装置,其中,所述用于生成所述受保护可执行代码的部件包括:
用于使链接器链接所述目标代码和所述插入函数的部件,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为所述第二函数名;以及
用于通过加密由所述链接器输出的可执行代码中的所述目标函数生成所述受保护可执行代码的部件。
4.根据权利要求3所述的装置,其中:
所述用于生成所述插入函数的部件生成包括以下部分的插入函数:
固定数据区域;以及
第一重新定位信息,用于使所述链接器执行处理以将所述目标函数的地址写入所述固定数据区域。
5.根据权利要求3所述的装置,其中:
所述用于生成所述插入函数的部件生成包括第二重新定位信息的插入函数,所述第二重新定位信息用于使所述链接器执行处理以将所述目标函数的地址写入所述调用指令的操作数。
6.根据权利要求1所述的装置,其中:
所述插入函数包括保留区域;以及
所述用于生成所述受保护可执行代码的处理的部件包括:
用于使所述链接器链接所述插入函数和所述目标代码的部件,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为所述第二函数名;以及
用于通过将解密代码插入由所述链接器输出的可执行代码的保留区域,并且加密所述可执行代码中的所述目标函数,从而生成所述受保护可执行代码的部件。
7.根据权利要求6所述的装置,其中:
所述用于生成所述插入函数的部件生成包括以下部分的插入函数:
固定数据区域;以及
第一重新定位信息,用于使所述链接器执行处理以将所述目标函数的地址写入所述固定数据区域。
8.根据权利要求6所述的装置,其中:
所述用于生成所述插入函数的部件生成包括第二重新定位信息的插入函数,所述第二重新定位信息用于使所述链接器执行处理以将所述目标函数的地址写入所述调用指令的操作数。
9.根据权利要求2所述的装置,其中:
所述用于生成所述插入函数的部件生成包括标记信息的插入函数,所述标记信息用于在加密所述目标函数的处理中找到所述插入函数。
10.根据权利要求2所述的装置,其中:
所述用于生成所述插入函数的部件生成包括指示对应的目标函数的大小的数据的插入函数。
11.根据权利要求2所述的装置,其中:
所述解密代码包括多个子解密代码,所述多个子解密代码中的每一个解密对应的加密;以及
用于加密所述目标函数的部件通过对应于所述多个子解密代码中的至少一个的加密处理来加密所述目标函数,以及利用对应于另一个子解密代码的加密处理来加密用于加密所述目标函数的子解密代码。
12.根据权利要求2所述的装置,其中:
提供多个不同的解密代码,并且为不同的目标函数插入不同的解密代码。
13.根据权利要求12所述的装置,其中:
所述多个不同的解密代码分别对应于不同的加密算法;以及
所述用于生成所述受保护可执行代码的部件使用对应于所述插入的解密代码的加密算法来加密对应于所述解密代码的目标函数。
14.根据权利要求2所述的装置,其中:
所述用于生成所述插入函数的部件生成包括在所述调用指令之后,重新加密所述目标函数的代码的插入函数。
15.根据权利要求1所述的装置,其中,所述用于生成所述插入函数的部件生成包括以下代码的插入函数:
用于在执行破坏之前把将被破坏的寄存器的值保存到预定保存区域的代码;以及
用于在与保护相关的处理之后调用所述目标函数之前,将已被保存到所述保存区域的值写回所述寄存器的代码。
16.根据权利要求1所述的装置,其中:
所述用于生成所述插入函数的部件生成包括以下代码的插入函数:所述代码用于在与保护有关的处理之后调用所述目标函数之前,把从通过执行调用插入函数的指令而被压入堆栈的数据得到的参数复制并压入所述堆栈。
17.根据权利要求1所述的装置,其中,所述用于生成所述插入函数的部件生成包括以下代码的插入函数:
用于在与保护有关的处理之后调用所述目标函数之前,将到所述插入函数的调用源的返回地址保存到预定的保存区域的代码;以及
用于在所述目标函数的执行结束并且返回到所述插入函数之后,将执行返回到保存在所述保存区域中的所述返回地址的代码。
18.根据权利要求1所述的装置,还包括:
用于从用户接受输入以指定目标函数的部件;以及
用于根据预定规则将所述目标代码中的所述指定的目标函数的函数定义的函数名改变为第二函数名的部件。
19.根据权利要求1所述的装置,其中:
用于生成所述插入函数的部件生成包括以下代码的插入函数:所述代码用于检测是否所述受保护可执行代码正被一工具分析,以及如果检测到分析则阻止对所述目标函数的分析。
20.一种用于生成受保护可执行代码的方法,该方法包括:
生成插入函数,所述插入函数具有与待保护的目标函数的函数名相同的函数名,所述插入函数包括用于与所述目标函数的保护有关的处理的代码以及用于在所述处理之后调用所述目标函数的调用指令;以及
基于目标代码和所述插入函数生成受保护可执行代码,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为第二函数名。
21.一种计算机可读存储介质,该存储介质存储可由计算机执行的指令的程序,以实现保护目标函数的功能,所述功能包括:
生成插入函数,所述插入函数具有与所述目标函数的函数名相同的函数名,所述插入函数包括用于与所述目标函数的保护有关的处理的代码以及用于在所述处理之后调用所述目标函数的调用指令;以及
基于目标代码和所述插入函数生成受保护可执行代码,在所述目标代码中,所述目标函数的函数定义的函数名已被改变为第二函数名。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2005339269A JP4770425B2 (ja) | 2005-11-24 | 2005-11-24 | 保護済み実行プログラムの作成のためのプログラム、方法及び装置 |
JP339269/2005 | 2005-11-24 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1971519A true CN1971519A (zh) | 2007-05-30 |
CN100498712C CN100498712C (zh) | 2009-06-10 |
Family
ID=38054850
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2006101625157A Expired - Fee Related CN100498712C (zh) | 2005-11-24 | 2006-11-24 | 用于生成受保护可执行程序的设备、存储介质和方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US7870396B2 (zh) |
JP (1) | JP4770425B2 (zh) |
KR (1) | KR100841282B1 (zh) |
CN (1) | CN100498712C (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100464301C (zh) * | 2007-08-09 | 2009-02-25 | 威盛电子股份有限公司 | 应用程序处理方法及系统 |
CN101650664B (zh) * | 2009-06-30 | 2012-06-27 | 飞天诚信科技股份有限公司 | 链接方法和链接器 |
CN102831215A (zh) * | 2012-08-17 | 2012-12-19 | 芯原微电子(北京)有限公司 | 一种基于嵌入元语言指令的文本处理方法及装置 |
CN103827817A (zh) * | 2011-08-01 | 2014-05-28 | 微软公司 | 减少字体指令 |
CN103858101A (zh) * | 2011-10-03 | 2014-06-11 | 国际商业机器公司 | 采用解码时间指令优化连接用于增强应用二进制接口(abi)的代码 |
CN105074712A (zh) * | 2013-03-19 | 2015-11-18 | 株式会社东芝 | 代码处理装置和程序 |
WO2015192637A1 (zh) * | 2014-06-17 | 2015-12-23 | 北京奇虎科技有限公司 | 软件安装包的加固保护方法和装置 |
CN105224309A (zh) * | 2015-09-02 | 2016-01-06 | 青岛中星微电子有限公司 | 一种调取函数的方法和装置 |
CN103856481B (zh) * | 2012-11-30 | 2017-09-22 | 辉达公司 | 使用在线认证和经加密代码执行的代码保护方法和系统 |
CN108595921A (zh) * | 2018-03-22 | 2018-09-28 | 北京奇艺世纪科技有限公司 | 一种源代码中字符串的混淆方法和装置 |
CN111506491A (zh) * | 2019-01-31 | 2020-08-07 | 阿里巴巴集团控股有限公司 | 信息处理方法及装置、存储介质和处理器 |
CN113254347A (zh) * | 2021-06-21 | 2021-08-13 | 南京统信软件技术有限公司 | 一种日志函数添加方法、计算设备及储存介质 |
Families Citing this family (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7581103B2 (en) * | 2001-06-13 | 2009-08-25 | Intertrust Technologies Corporation | Software self-checking systems and methods |
DE10256587A1 (de) * | 2002-12-04 | 2004-06-17 | Philips Intellectual Property & Standards Gmbh | Datenverarbeitungseinrichtung, insbesondere elektronisches Speicherbauteil, und hierauf bezogenes Verschlüsselungsverfahren |
US8880901B2 (en) * | 2006-05-25 | 2014-11-04 | Red Hat, Inc. | Secure address handling in a processor |
US20080263366A1 (en) * | 2007-04-19 | 2008-10-23 | Microsoft Corporation | Self-verifying software to prevent reverse engineering and piracy |
JP5387089B2 (ja) * | 2009-03-27 | 2014-01-15 | 富士ゼロックス株式会社 | プログラム及びプログラム実行装置 |
CA2761065C (en) * | 2009-05-06 | 2018-01-02 | Irdeto Canada Corporation | Interlocked binary protection using whitebox cryptography |
US8381188B2 (en) * | 2009-12-04 | 2013-02-19 | International Business Machines Corporation | Leveraging the relationship between object IDs and functions in diagnosing software defects during the post-deployment phase |
US8806436B2 (en) * | 2010-04-30 | 2014-08-12 | Cray Inc. | Systems and methods for debugging applications using dual code generation |
KR101256149B1 (ko) * | 2010-07-12 | 2013-04-19 | 홍익대학교 산학협력단 | 프로그램 카운터 인코딩을 이용한 간접 함수 호출 보호 방법 및 보호 장치 |
JP5988473B2 (ja) * | 2011-09-20 | 2016-09-07 | 株式会社Dnpハイパーテック | モジュールの暗号化/復号化プログラム |
JP2013137646A (ja) * | 2011-12-28 | 2013-07-11 | Nec System Technologies Ltd | プログラム保護装置、プログラム保護方法、及びプログラム |
WO2013130548A2 (en) * | 2012-02-27 | 2013-09-06 | University Of Virginia Patent Foundation | Method of instruction location randomization (ilr) and related system |
JP2013179453A (ja) * | 2012-02-28 | 2013-09-09 | Nippon Telegr & Teleph Corp <Ntt> | 計算機システムおよび計算方法 |
US9032102B2 (en) * | 2012-03-02 | 2015-05-12 | International Business Machines Corporation | Decode data for fast PCI express multi-function device address decode |
JP5953867B2 (ja) * | 2012-03-26 | 2016-07-20 | 富士ゼロックス株式会社 | プログラム、及びプログラム保護装置 |
US10089126B2 (en) * | 2013-03-21 | 2018-10-02 | Vmware, Inc. | Function exit instrumentation for tail-call optimized code |
JP5574550B2 (ja) * | 2012-11-22 | 2014-08-20 | 京セラドキュメントソリューションズ株式会社 | 情報秘匿化方法および情報秘匿化装置 |
KR101556908B1 (ko) * | 2013-11-14 | 2015-10-02 | (주)잉카엔트웍스 | 프로그램 보호 장치 |
EP3057019A1 (en) * | 2015-02-13 | 2016-08-17 | Thomson Licensing | Method and device for protecting an application and method and device for executing a protected application thus protected |
JP2016028334A (ja) * | 2015-09-25 | 2016-02-25 | 株式会社Dnpハイパーテック | モジュールの暗号化/復号化プログラム |
JP6374453B2 (ja) * | 2016-08-08 | 2018-08-15 | 株式会社Dnpハイパーテック | モジュールの暗号化/復号化プログラム |
JP6374454B2 (ja) * | 2016-08-08 | 2018-08-15 | 株式会社Dnpハイパーテック | モジュールの暗号化/復号化プログラム |
FR3094515B1 (fr) * | 2019-03-28 | 2021-09-10 | Ingenico Group | procédé d’exécution de code sécurisé, dispositifs, système et programmes correspondants |
JP7123001B2 (ja) * | 2019-04-26 | 2022-08-22 | ルネサスエレクトロニクス株式会社 | 記録システム |
CN110389753B (zh) * | 2019-06-06 | 2024-01-23 | 五八有限公司 | 原生应用的链式调用方法、装置、电子设备及存储介质 |
CN112668004B (zh) * | 2019-10-16 | 2022-06-21 | 武汉斗鱼网络科技有限公司 | 一种基于llvm的函数校验方法及相关装置 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5768372A (en) * | 1996-03-13 | 1998-06-16 | Altera Corporation | Method and apparatus for securing programming data of a programmable logic device |
US6668325B1 (en) | 1997-06-09 | 2003-12-23 | Intertrust Technologies | Obfuscation techniques for enhancing software security |
US6473897B1 (en) * | 1998-04-13 | 2002-10-29 | Intel Corporation | Method and apparatus for generating multiple processor-specific code segments in a single executable |
US5983021A (en) * | 1998-05-27 | 1999-11-09 | Sun Microsystems | Dynamically switching statically bound function calls to dynamically bound function calls without recompilation |
JP3033562B2 (ja) | 1998-09-02 | 2000-04-17 | 富士ゼロックス株式会社 | 再配置可能な実行プログラムの生成方法及び実行プログラム生成装置 |
JP4042280B2 (ja) * | 1999-12-21 | 2008-02-06 | 富士ゼロックス株式会社 | 実行プログラムの生成方法及び実行プログラム生成装置、実行プログラムの実行方法、並びに、コンピュータ可読プログラム記憶媒体 |
FR2828303B1 (fr) * | 2001-07-31 | 2010-09-03 | Validy | Procede pour proteger un logiciel a l'aide d'un principe dit de "renommage" contre son utilisation non autorisee |
JP2003280755A (ja) * | 2002-03-25 | 2003-10-02 | Nec Corp | 自己復元型プログラム、プログラム生成方法及び装置、情報処理装置並びにプログラム |
JP2005135265A (ja) * | 2003-10-31 | 2005-05-26 | Fujitsu Ltd | 情報処理装置 |
JP4517636B2 (ja) | 2003-12-05 | 2010-08-04 | 富士ゼロックス株式会社 | 実行プログラム作成方法、関数プログラム、及び関数プログラム実行方法 |
US7490268B2 (en) * | 2004-06-01 | 2009-02-10 | The Trustees Of Columbia University In The City Of New York | Methods and systems for repairing applications |
JP4664055B2 (ja) * | 2004-12-10 | 2011-04-06 | 株式会社エヌ・ティ・ティ・ドコモ | プログラム分割装置、プログラム実行装置、プログラム分割方法及びプログラム実行方法 |
-
2005
- 2005-11-24 JP JP2005339269A patent/JP4770425B2/ja not_active Expired - Fee Related
-
2006
- 2006-06-14 US US11/452,540 patent/US7870396B2/en not_active Expired - Fee Related
- 2006-11-23 KR KR1020060116378A patent/KR100841282B1/ko active IP Right Grant
- 2006-11-24 CN CNB2006101625157A patent/CN100498712C/zh not_active Expired - Fee Related
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100464301C (zh) * | 2007-08-09 | 2009-02-25 | 威盛电子股份有限公司 | 应用程序处理方法及系统 |
CN101650664B (zh) * | 2009-06-30 | 2012-06-27 | 飞天诚信科技股份有限公司 | 链接方法和链接器 |
CN103827817B (zh) * | 2011-08-01 | 2016-05-11 | 微软技术许可有限责任公司 | 用于减少字体指令的方法和系统 |
CN103827817A (zh) * | 2011-08-01 | 2014-05-28 | 微软公司 | 减少字体指令 |
CN103858101A (zh) * | 2011-10-03 | 2014-06-11 | 国际商业机器公司 | 采用解码时间指令优化连接用于增强应用二进制接口(abi)的代码 |
CN103858101B (zh) * | 2011-10-03 | 2016-10-26 | 国际商业机器公司 | 代码处理方法和代码处理系统 |
CN102831215A (zh) * | 2012-08-17 | 2012-12-19 | 芯原微电子(北京)有限公司 | 一种基于嵌入元语言指令的文本处理方法及装置 |
CN102831215B (zh) * | 2012-08-17 | 2016-06-08 | 芯原微电子(北京)有限公司 | 一种基于嵌入元语言指令的文本处理方法及装置 |
CN103856481B (zh) * | 2012-11-30 | 2017-09-22 | 辉达公司 | 使用在线认证和经加密代码执行的代码保护方法和系统 |
CN105074712A (zh) * | 2013-03-19 | 2015-11-18 | 株式会社东芝 | 代码处理装置和程序 |
US10229277B2 (en) | 2013-03-19 | 2019-03-12 | Kabushiki Kaisha Toshiba | Code processing apparatus and computer program product |
WO2015192637A1 (zh) * | 2014-06-17 | 2015-12-23 | 北京奇虎科技有限公司 | 软件安装包的加固保护方法和装置 |
CN105224309A (zh) * | 2015-09-02 | 2016-01-06 | 青岛中星微电子有限公司 | 一种调取函数的方法和装置 |
CN105224309B (zh) * | 2015-09-02 | 2019-03-19 | 青岛中星微电子有限公司 | 一种调取函数的方法和装置 |
CN108595921A (zh) * | 2018-03-22 | 2018-09-28 | 北京奇艺世纪科技有限公司 | 一种源代码中字符串的混淆方法和装置 |
CN108595921B (zh) * | 2018-03-22 | 2020-11-13 | 北京奇艺世纪科技有限公司 | 一种源代码中字符串的混淆方法和装置 |
CN111506491A (zh) * | 2019-01-31 | 2020-08-07 | 阿里巴巴集团控股有限公司 | 信息处理方法及装置、存储介质和处理器 |
CN111506491B (zh) * | 2019-01-31 | 2023-05-02 | 阿里巴巴集团控股有限公司 | 信息处理方法及装置、存储介质和处理器 |
CN113254347A (zh) * | 2021-06-21 | 2021-08-13 | 南京统信软件技术有限公司 | 一种日志函数添加方法、计算设备及储存介质 |
Also Published As
Publication number | Publication date |
---|---|
US7870396B2 (en) | 2011-01-11 |
JP2007148575A (ja) | 2007-06-14 |
US20070118763A1 (en) | 2007-05-24 |
KR100841282B1 (ko) | 2008-06-25 |
CN100498712C (zh) | 2009-06-10 |
KR20070055377A (ko) | 2007-05-30 |
JP4770425B2 (ja) | 2011-09-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100498712C (zh) | 用于生成受保护可执行程序的设备、存储介质和方法 | |
CN101084478B (zh) | 为计算机程序代码加水印 | |
US7877613B2 (en) | Protecting mobile code against malicious hosts | |
CN103761475B (zh) | 检测智能终端中恶意代码的方法及装置 | |
US8589897B2 (en) | System and method for branch extraction obfuscation | |
US7263722B1 (en) | Obfuscation of executable code | |
CN101981580B (zh) | 从多形态可执行程序到多形态操作系统 | |
US7421586B2 (en) | Protecting mobile code against malicious hosts | |
CN102047220A (zh) | 生成软件应用程序的白盒实现的系统和方法 | |
CN106599628A (zh) | 一种基于模块钩子的Python字节码文件保护方法 | |
JP2004362532A (ja) | 透かし挿入装置および透かし取出装置 | |
CN105074712A (zh) | 代码处理装置和程序 | |
US20120151600A1 (en) | Method and system for protecting intellectual property in software | |
JP3949105B2 (ja) | 「リネーム」原理を使用してその無許可使用に対してソフトウェアを保護する方法 | |
KR102524627B1 (ko) | 중간언어를 활용한 바이너리 프로그램 난독화 시스템 및 그 방법 | |
JP3949108B2 (ja) | 「一時的分離」原理により不正使用に対してソフトウェアを保護する方法 | |
CN101206702A (zh) | 一种web源代码保护技术 | |
CN114357389B (zh) | 一种基于llvm的指令加花混淆方法及装置 | |
CN113282294B (zh) | 基于安卓平台Java字符串混淆的方法和装置 | |
JP6752347B1 (ja) | 情報処理装置、コンピュータプログラム及び情報処理方法 | |
KR101747767B1 (ko) | 자바 자동 식별자 리네이밍 기법 | |
JP3949103B2 (ja) | 「条件分岐」原理により不正使用に対してソフトウェアを保護する方法 | |
JP3949107B2 (ja) | 「変数」原理により不正使用に対してソフトウェアを保護する方法 | |
JP3949106B2 (ja) | 「基本関数」原理により不正使用に対してソフトウェアを保護する方法 | |
US20030149878A1 (en) | Method of marking a program for identification/authentication |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder |
Address after: Tokyo, Japan Patentee after: Fuji film business innovation Co.,Ltd. Address before: Tokyo, Japan Patentee before: Fuji Xerox Co.,Ltd. |
|
CP01 | Change in the name or title of a patent holder | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20090610 |
|
CF01 | Termination of patent right due to non-payment of annual fee |