CN108763878A - 一种程序保护方法及装置 - Google Patents
一种程序保护方法及装置 Download PDFInfo
- Publication number
- CN108763878A CN108763878A CN201810350231.3A CN201810350231A CN108763878A CN 108763878 A CN108763878 A CN 108763878A CN 201810350231 A CN201810350231 A CN 201810350231A CN 108763878 A CN108763878 A CN 108763878A
- Authority
- CN
- China
- Prior art keywords
- basic block
- target
- block
- target basic
- program
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 55
- 230000011218 segmentation Effects 0.000 claims abstract description 14
- 230000006870 function Effects 0.000 claims description 106
- 238000004590 computer program Methods 0.000 claims description 8
- 238000004364 calculation method Methods 0.000 claims description 2
- 230000018109 developmental process Effects 0.000 abstract description 3
- 230000008569 process Effects 0.000 description 12
- 230000009466 transformation Effects 0.000 description 5
- 230000008859 change Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 230000002787 reinforcement Effects 0.000 description 4
- 108010001267 Protein Subunits Proteins 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 238000013461 design Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000009191 jumping Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 239000000969 carrier Substances 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000003014 reinforcing effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
Classifications
-
- 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/14—Protecting 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)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种程序保护方法及装置,应用于软件开发技术领域,该方法包括:分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;生成与所述新的程序对应的可执行程序文件。通过本发明提高了软件产品被逆向工程师逆向的难度,从而解决了软件产品的安全性不高的技术问题。
Description
技术领域
本发明涉及软件开发技术领域,尤其涉及一种程序保护方法及装置。
背景技术
高级语言编写的源程序经过编译变成可执行程序文件,用于机器执行,而反编译是其逆过程,可以将可执行程序文件通过反编译得到可读的源程序。计算机软件反向工程(Reversepengineering)也称为计算机软件还原工程,就是是指通过对他人软件的目标程序(可执行程序文件)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,从而作为自己开发软件时的参考,或者直接用于自己的软件产品中。
因此,用户所自主开发的软件产品很容易被竞争对手通过计算机软件反向工程,反编译而知晓该软件产品所使用的思路、原理、结构、算法、处理过程、运行方法,导致软件产品被模仿,甚至盗取。因此,目前的软件产品的安全性不高。
发明内容
本发明实施例提供一种程序保护方法及装置,解决了软件产品的安全性不高的技术问题。
第一方面,本发明实施例提供一种程序保护方法,包括:
分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
生成与所述新的程序对应的可执行程序文件。
优选地,所述在每个所述目标基本块中创建不可达分支,包括:
分割每个所述目标基本块为M个子代码块,M为大于1的整数;
在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,所述条件跳转指令包括可达分支和所述不可达分支,m依次取2至M中的一个;
将用于所述目标基本块中第m-1个子代码块向所述第m个子代码块进行跳转的指令,写入在所述目标基本块的条件跳转指令的可达分支中。
优选地,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括对每个所述目标基本块执行如下步骤:
扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;
从所述目标基本块所在函数内的所有基本块中,确定所述其他基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转。
优选地,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括对每个所述目标基本块执行如下步骤:
确定所述目标基本块所在函数内的基本块个数;
判断所述基本块个数是否大于预设数值;
如果是,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;
否则,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
优选地,所述在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转,包括:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
优选地,所述从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块,包括:
随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块;或者
从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
优选地,所述从所述基本块序列中确定一个以上的目标基本块,包括:
将所述基本块序列中尺寸大于预设代码尺寸的各个基本块,分别确定为目标基本块;或者
从所述基本块序列中随机选择一个以上的基本块,分别确定为目标基本块。
优选地,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括对每个所述目标基本块执行如下步骤:
获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块向第m-1个子代码块所在函数内的所有未分割的基本块和相对于所述目标基本块中第m-1个子代码块的其他子代码块的随机跳转。
第二方面,本发明实施例提供一种程序保护装置,包括:
程序分割单元,用于分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
文件生成单元,用于生成与所述新的程序对应的可执行程序文件。
优选地,所述分支创建单元,包括:
代码块分割子单元,用于分割每个所述目标基本块为M个子代码块,M为大于1的整数;
条件指令生成单元,用于在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,所述条件跳转指令包括可达分支和所述不可达分支,m依次取2至M中的一个;
指令写入子单元,用于将用于所述目标基本块中第m-1个子代码块向所述第m个子代码块进行跳转的指令,写入在所述目标基本块的条件跳转指令的可达分支中。
优选地,所述跳转添加单元,包括:
扫描子单元,用于扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;
确定子单元,用于从所述目标基本块所在函数内的所有基本块中,确定所述其他基本块;
随机跳转子单元,用于在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转。
优选地,所述跳转添加单元,包括:
个数确定子单元,用于确定所述目标基本块所在函数内的基本块个数;
个数判断子单元,用于判断所述基本块个数是否大于预设数值;
随机跳转子单元,用于如果所述个数判断子单元的判断结果为是,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;
直接跳转子单元,用于如果所述个数判断子单元的判断结果为否,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
优选地,所述随机跳转子单元,具体用于:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
优选地,所述随机跳转子单元,具体用于:
随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块;或者
从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
优选地,所述分支创建单元,还包括:目标基本块确定子单元,用于将所述基本块序列中尺寸大于预设代码尺寸的各个基本块,分别确定为目标基本块;或者从所述基本块序列中随机选择一个以上的基本块,分别确定为目标基本块。
优选地,所述跳转添加单元,包括:
代码块获取子单元,用于获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;
随机跳转子单元,用于在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块向第m-1个子代码块所在函数内的所有未分割的基本块和相对于所述目标基本块中第m-1个子代码块的其他子代码块的随机跳转。
优选地,所述条件跳转指令基于具有唯一比较结果的数学比较运算设置,在得到所述唯一比较结果时,执行所述条件跳转指令的可达分支中的跳转指令。
第三方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面中任一可能的实现方式所述的步骤。
第四方面,本发明实施例提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面中任一可能的实现方式所述的步骤。
本发明实施例提供的一个或者多个技术方案,至少实现了如下技术效果或者优点:
通过分割用户编辑的源程序为包含若干基本块的基本块序列;从基本块序列中确定一个以上的目标基本块,在每个目标基本块中创建不可达分支;在每个目标基本块的不可达分支中添加该目标基本块向与该目标基本块处于同一函数的其他基本块的跳转,获得新的程序;生成与新的程序对应的可执行程序文件,由于不可达分支具有不可执行的特性,因此,可执行程序文件在实际执行过程中,不可达分支中的程序内容并不会被执行到,也就不会改变软件产品的实际功能,但是可执行程序文件被反编译处理得到的可读程序中,不可达分支中的程序内容又是真实存在的,因此,在不可达分支中添加的基本块之间的跳转关系能够混淆真实的函数内执行流程,进而误导逆向工程师,使得很难被逆向工程师分辨程序内的实际逻辑,以此提高了软件产品被逆向工程师逆向的难度,故而,提高了软件产品的安全性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的程序保护方法的流程图;
图2A为xx函数内基本块的原始跳转示意图;
图2B为基于本发明实施例提供的程序保护方法得到的xx函数内跳转示意图;
图3为本发明实施例提供的程序保护装置的程序模块图;
图4为本发明实施例提供的计算机设备的结构框图。
具体实施方式
本发明实施例提供的一种程序保护方法及装置,从而提高了软件产品的安全性,总体思路如下:
通过在用户编辑的源程序的目标基本块中创建不可达分支,又在不可达分支中添加目标基本块向与相对于目标函数的其他基本块的跳转,从而获得新的程序,最后生成与新的程序对应的可执行程序文件。
由于不可达分支具有不可执行的特性,因此通过上述技术方案,可执行程序文件在实际执行过程中,不可达分支中的程序内容并不会被执行到,也就不会改变软件产品的实际功能,但是可执行程序文件被反编译处理得到的可读程序中,不可达分支中的程序内容又是真实存在的,因此,在不可达分支中添加的基本块之间的跳转关系能够混淆真实的函数内执行流程,进而误导逆向工程师,使得很难被逆向工程师分辨程序内的实际逻辑,以此提高了软件产品被逆向工程师逆向的难度,故而,提高了软件产品的安全性。
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。需要说明的是,在不冲突的前提,本发明实施例提供的各个实施例可以相互结合。
源程序经过编译步骤和链接步骤生成可执行程序文件。需要说明的是,本发明实施例提供的步骤S101~S104正是应用于对源程序进行的编译步骤中,因此,对源程序所进行的全部编译步骤中,除了本发明所给出的步骤,所需要进行的其他处理细节均可以参考现有技术,为了说明书的简洁,本文不进行赘述。下面,对本发明所提供的对源程序所进行的编译步骤中的那部分步骤进行详细描述,以理解本发明。
参考图1所示,本发明实施例提供的程序保护方法的流程图,本发明实施例提供的程序保护方法包括如下步骤:
首先,执行步骤S101:分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块。
需要说明的是,用户编辑的源程序具体指用户按照一定的程序设计语言规范书写的最原始程序的未经编译的代码,源程序为可读的文本文件。通常由高级语言编写,比如:C语言、C++语言、Java语言,源程序可以是以书籍或者磁带或者其他载体的形式出现,但最为常用的格式是文本文件。
具体的,在步骤S101中,用户编辑的源程序分割为多个基本块(Basic block),则分割得到的多个基本块组成了顺序跳转的基本块序列。其中,基本块是划分程序的一个单位,一个基本块具体为一条或数条指令的组合,基本块中包含第一条指令和最后一条指令,只要基本块中的第一条指令被执行了,那么该基本块内所有指令都会按照顺序仅执行一次,直到执行到基本块中最后一条指令,这样的一条或者多条指令的组合则被分割为一个基本块。一个函数内的各个基本块通过跳转指令顺序执行,在上一个基本块执行完后,通过jump跳转类指令进入到下一个需要执行的基本块中。
在步骤S101之后,接着执行步骤S102:从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支。
需要说明的是,不可达分支是指不能通过任何输入来执行的路径,因此,不可达分支中的指令在实际被执行时不会执行到。相对于不可达分支而言的是可达分支,而可达分支是在实际执行时,在某一输入下可被执行到的路径,因此,可达分支中的指令在实际执行时会在某一输入下会被执行到。
具体的,本文中的目标基本块,具体为:按照预设挑选规则从基本块序列中确定的基本块。在具体实施过程中,可以从基本块序列中确定一个或者多个目标基本块,而根据预设挑选规则的不同,选择目标基本块的实施方式也可以有多种,下面分别进行描述:
实施方式一:
判断基本块序列中每个基本块的尺寸是否大于预设代码尺寸,确定所述基本块序列中尺寸大于预设代码尺寸的各个基本块;将所述基本块序列中尺寸大于所述预设代码尺寸的各个基本块,分别确定为目标基本块。
具体的,基本块的尺寸具体为:在该基本块中的全部指令被转换为汇编指令的前提下,基本块中所包含的汇编指令行数。对应的,预设代码尺寸可以设置为20行汇编指令,分别判断基本块序列中每个基本块的汇编指令行数是否大于20行,确定出基本块序列中汇编指令行数大于20行的各个基本块;接着,将基本块序列中汇编指令行数大于20行的各个基本块分别确定为目标基本块。
当然,在具体实施过程中,预设代码尺寸还可以根据实际需求设置为其他的汇编指令行数值,更甚者,还可以是其他方式定义的尺寸参数。
实施方式二:将基本块序列中的每个基本块,分别确定为目标基本块。当然,在具体实施过程中,实施方式二仅应用于源程序的代码量较少的情形。
实施方式三:随机从基本块序列中选择一个以上的基本块,分别确定为目标基本块。比如,从基本块序列中随机选择3个基本块,确定为3个目标基本块。
通过上述三种实施方式,均可以从基本块序列中确定一个以上的目标基本块。
具体的,在每个目标基本块中创建不可达分支,可以有多种实施方式。一种实施方式可以是:将目标基本块向下一个基本块进行跳转的跳转指令(,比如,jump跳转类指令)变换为包括可达分支和不可达分支的条件跳转指令,将用于目标基本块向下一个基本块进行跳转的跳转指令(jump跳转类指令)写入在该条件跳转指令的可达分支中。
具体的,在每个目标基本块中创建不可达分支的另一种实施方式可以包括如下步骤1~3:
步骤1、分割每个目标基本块为M个子代码块,M为大于1的整数。
具体实施过程中,可以根据目标基本块的汇编指令行数对目标基本块进行指令平分,得到多个子代码块。
需要说明的是,针对从基本块序列中所确定出的目标基本块不同,被分割为子代码块的个数可以相同。具体而言,不区别目标基本块的汇编指令行数,每个目标基本块均分割为两个子代码块,具体来讲,每个目标基本块分割为前半部分指令行和后半部分指令行。当然,目标基本块被分割为子代码块的个数也可以不同,具体而言,各个目标基本块被分割为子代码块的个数与目标基本块的指令行数相关,比如,基本块的汇编指令行数越多,被分割为子代码块的个数越多。
在步骤1之后,执行步骤2:在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向所述目标基本块中第m个子代码块进行跳转的条件跳转指令,其中,所述条件跳转指令包括可达分支和不可达分支,m依次取2至M中的一个整数。
需要说明的是,步骤2具体为:生成用于所述目标基本块中第m-1个子代码块向所述目标基本块中第m个子代码块进行跳转的无条件跳转指令(jump指令)。接着,将用于所述目标基本块中第m-1个子代码块向所述目标基本块中第m个子代码块进行跳转的无条件跳转指令(jump指令)经过变换得到条件跳转指令,该变换得到的条件跳转指令包括一条可达分支和一条不可达分支。
在步骤2之后,执行步骤3:将用于所述目标基本块中第m-1个子代码块向所述目标基本块中第m个子代码块进行跳转的无条件跳转指令写入在所述条件跳转指令的可达分支中。
针对一个目标基本块进行举例,步骤1~3的一种具体实施方式可以为:
分割每个目标基本块分割为前半部分指令行和后半部分指令行,得到目标基本块的前1/2子代码块和目标基本块的后1/2子代码块;生成用于前1/2子代码块向后1/2子代码块进行跳转的无条件跳转指令;对用于前1/2子代码块向后1/2子代码块进行跳转的无条件跳转指令进行变换,经过变换得到条件跳转指令,将用于前1/2子代码块向后1/2子代码块进行跳转的无条件跳转指令写入在变换所得到的条件跳转指令的可达分支中。
针对一个目标基本块进行举例,步骤1~3的另一种具体实施方式可以为:
分割目标基本块为前1/3子代码块、中1/3子代码块和后1/3子代码块。首先,生成用于前1/3子代码块向中1/3子代码块进行跳转的无条件跳转指令,接着,将用于前1/3子代码块向中1/3子代码块进行跳转的无条件跳转指令变换得到第一条件跳转指令,再接着,将用于前1/3子代码块向中1/3子代码块进行跳转的无条件跳转指令写入在变换所得到的该第一条件跳转指令的可达分支中。接着,生成用于中1/3子代码块向后1/3子代码块进行跳转的无条件跳转指令,接着,用于中1/3子代码块向后1/3子代码块进行跳转的无条件跳转指令经过变换得到第二条件跳转指令,再接着,将用于中1/3子代码块向后1/3子代码块进行跳转的无条件跳转指令写入在变换得到的该第二条件跳转指令的可达分支中。
在步骤S102之后,接着执行步骤S103:在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数。
具体而言,通过在所述目标基本块的不可达分支中添加所述目标基本块向其他基本块的跳转,所得到的新的程序中,不仅包含源程序中原先已经有的指令,还包含在目标基本块所创建的不可达分支以及不可达分支中所添加的指令。
需要说明的是,针对从基本块序列中确定的每个目标基本块,都会执行步骤S102~S103,从而在对源程序编译的步骤中会创建多个不可达分支,每个不可达分支中都有不可达分支所在的目标基本块对该目标基本块所在函数内的其他基本块的跳转,从而形成了源程序中各个基本块之间比较复杂的跳转关系,以此混淆了源程序中实际的函数内执行流程,因此,很难被逆向工程师逆向。
具体的,一个函数内的全部指令在编译时会被分割为多个基本块。需要说明的是,在本文中所出现的“其他基本块”均是指与该目标基本块属于同一函数,并且相对于该目标基本块而言的其他基本块。比如,某一函数的全部指令被分割为:基本块1、基本块2、基本块3。比如,基本块1、2确定为目标基本块,则基本块2、3为相对于目标基本块1的其他基本块,基本块1、3为相对于目标基本块2的其他基本块。
举例来讲,某一函数的全部指令分割顺序跳转的:基本块1、基本块2、基本块3、基本块4和基本块5。如果基本块1和基本块3选择为目标基本块,则在步骤S103,具体是:在基本块1中创建不可达分支A,在不可达分支1中添加基本块1向相对于基本块1的其他基本块的跳转,即:基本块1向基本块2、3、4、5中一个以上基本块的跳转;在基本块3中创建不可达分支B,在不可达分支B中添加基本块3相对于基本块3的其他基本块的跳转,即:基本块3向基本块1、2、4、5中一个以上基本块的跳转。
为了实现在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,在具体实施过程中,可以为如下多种实施方式,下面,针对每个所述目标基本块向其他基本块的跳转给出如下三种跳转方式,而针对另外的目标基本块的实施方式相同或者相似:
跳转方式一:扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;从所述目标基本块所在函数内的所有基本块中,确定所述其他基本块;在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向相对于该目标基本块的其他基本块的随机跳转。
具体来讲,对所述目标基本块所在函数进行扫描,获得所述目标基本块所在函数内的所有基本块,从而,所述目标基本块向所述其他基本块的跳转仅限于目标基本块所在函数内,而不会跳转到目标基本块函数外的那些基本块。
跳转方式二:
确定所述目标基本块所在函数内的基本块个数;判断所述目标基本块所在函数内的基本块个数是否大于预设数值;如果所述目标基本块所在函数内的基本块个数大于所述预设数值,在该目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;否则,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
具体而言,通过在所述目标基本块的不可达分支中添加用于目标基本块向相对于目标基本块的其他基本块进行跳转的跳转指令,从而实现了目标基本块向函数内其他基本块的跳转。
在具体实施过程中,实现随机跳转的流程,可以如下:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
具体而言,在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向各个候选基本块进行一对一跳转的跳转指令。举例来讲,在所述目标基本块的条件跳转指令的不可达分支中,添加用于从目标基本块跳转至一个候选基本块的跳转指令,还添加用于从目标基本块跳转至另一个候选基本块的跳转指令。
需要说明的是,所述目标基本块所在函数内确定候选基本块可以有多种实施方式:
方式1、随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块。
具体而言,选择多少个候选基本块可以基于实际需求决定,本文不进行具体限定。比如,为了提高软件产品更加安全,可以按照一定比例选择目标基本块所在函数内的基本块;或者,从目标基本块所在函数内选择出的候选基本块的个数固定,比如,为了减少代码量,从目标基本块所在函数内选择唯一个候选基本块。
方式2、从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
具体而言,可以从目标基本块所在函数内筛选出与目标基本块具有相关性的一个以上候选块,或者汇编指令行数大于预设行数值的基本块为候选基本块。从而能够增加不可大分支中的不可执行程序代码的复杂性,增加了程序加固后的安全性。
跳转方式三:
获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块向第m-1个子代码块所在函数内所有未分割的基本块的随机跳转,还添加所述目标基本块中第m-1个子代码块向相对于所述目标基本块中第m-1个子代码块的其他子代码块的随机跳转,所述其他子代码块属于所述第m-1个子代码块所在函数内。
具体的,还可以是在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块对所述目标基本块所在函数内所述其他基本块的随机跳转。需要说明的是,随机跳转的实现方式可以参考前文所述,此处不再赘述。
下面,参考图2A~图2B进行举例说明:
在XX函数内的全部指令基于步骤S101分割为基本块1、基本块2、基本块3和基本块4,在执行步骤S102~S103之前,参考图2A所示,仅有基本块1通过jump指令跳转至基本块2,基本块2通过jump指令跳转至基本块3,基本块3通过jump指令跳转至基本块4,执行步骤S102~S103:将基本块2分割为前1/2代码块和后1/2代码块,生成用于前1/2代码块向后1/2代码块跳转的无条件跳转指令,接着,将用于前1/2代码块向后1/2代码块跳转的无条件跳转指令通过变换得到用于前1/2代码块向后1/2代码块跳转的条件跳转指令,在该条件跳转指令的可达分支中写入用于前1/2代码块向后1/2代码块跳转的jump指令,在该条件跳转指令的不可达分支中添加用于基本块2的前1/2代码块向基本块1跳转的jump指令,以及添加用于基本块2的前1/2代码块向基本块3跳转的jump指令。结果参考图2B所示。不仅包含原有跳转,还新增加了前1/2子代码块向后1/2子代码块的跳转,还包含在实际执行时不会执行的跳转,即:基本块2的前1/2子代码块跳转至基本块1,基本块2的前1/2子代码块跳转至基本块3,因此,混淆了XX函数内的实际执行跳转,进而混淆XX函数内的实际执行流程。
在具体实施过程中,每一个基本块会存在一个对应的标签lable,无论是在可达分支还是在不可达分支中,在jump指令中写入目标基本块所要跳转至的基本块的标签lable,从而通过jump指令能够跳转到该标签lable对应的基本块中。
在步骤S103之后,执行步骤S104:生成与所述新的程序对应的可执行程序文件。
具体来讲,通过链接步骤生成与所述新的程序对应的可执行程序文件。
需要说明的是,条件跳转指令具体可以为如下条件语句:if(一个返回bool值的条件表达式){程序块A}else{程序块B},其中,程序块A为所述第m-1个子代码块向所述第m个子代码块进行跳转的无条件跳转指令,程序块B为:目标基本块向与所述目标基本块属于同一函数的一个以上其他基本块进行跳转的无条件跳转指令,bool为布尔型变量的值。
所述条件跳转指令,具体为:基于具有唯一比较结果的数学比较运算设置,在得到所述唯一比较结果时,执行所述第m-1个子代码块向所述第m个子代码块的跳转。
针对if(一个返回bool值的条件表达式){程序块A}else{程序块B}语句而言,唯一比较结果即是布尔型变量的值是唯一的。在基于某一输入获得唯一比较结果,执行条件跳转指令的可达分支中的指令,即:用于所述第m-1个子代码块向所述第m个子代码块进行跳转的跳转指令。
需要说明的是,本发明实施例提供的技术方案,可以应用于白盒加固工具对程序进行加固的场景下,需要说明的是,白盒加固工具为相对于黑盒加固工具而言的一种对程序进行测试、加固的工具,白盒加固工具具体是在将用户编辑的源程序处理为可执行程序文件过程中进行的,这里的可执行程序文件即二进制文件(Binary)。而黑盒是对已经形成的可执行程序文件在此处理为可执行程序文件的过程中所进行的程序测试、加固过程。
需要说明的是,本发明实施例提供的如上技术方案,可以应用于多种平台下软件产品(可执行程序文件)的生成:基于安卓操作系统的ELF文件,基于苹果手机操作系统的应用程序,苹果电脑操作系统的应用程序,基于Linux系统的软件和加载的库文件,Windows操作系统的可执行程序和DLL(Dynamic Link Library,动态链接库)文件。需要说明的是,本发明实施例提供的如上技术方案,可基于如下执行集类型:X86、X86_64、ARM、ARM64。
基于同一发明构思,本发明实施例提供一种程序保护装置,参考图3所示,包括:
程序分割单元201,用于分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
分支创建单元202,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元203,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
文件生成单元204,用于生成与所述新的程序对应的可执行程序文件。
在一具体的实施方式中,所述分支创建单元202包括:
代码块分割子单元,用于分割每个所述目标基本块为M个子代码块,M为大于1的整数;
条件指令生成单元,用于在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,所述条件跳转指令包括可达分支和所述不可达分支,m依次取2至M中的一个;
指令写入子单元,用于将用于所述目标基本块中第m-1个子代码块向所述第m个子代码块进行跳转的指令,写入在所述目标基本块的条件跳转指令的可达分支中。
在一具体的实施方式中,所述跳转添加单元203,包括:
扫描子单元,用于扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;
确定子单元,用于从所述目标基本块所在函数内的所有基本块中,确定所述其他基本块;
随机跳转子单元,用于在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转。
在一具体的实施方式中,所述跳转添加单元203,包括:
个数确定子单元,用于确定所述目标基本块所在函数内的基本块个数;
个数判断子单元,用于判断所述基本块个数是否大于预设数值;
随机跳转子单元,用于如果所述个数判断子单元的判断结果为是,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;
直接跳转子单元,用于如果所述个数判断子单元的判断结果为否,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
在一具体的实施方式中,所述随机跳转子单元,具体用于:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
在一具体的实施方式中,所述随机跳转子单元,具体用于:
随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块;或者
从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
在一具体的实施方式中,所述分支创建单元202还包括:目标基本块确定子单元,用于将所述基本块序列中尺寸大于预设代码尺寸的各个基本块,分别确定为目标基本块;或者从所述基本块序列中随机选择一个以上的基本块,分别确定为目标基本块。
在一具体的实施方式中,所述跳转添加单元203包括:
代码块获取子单元,用于获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;
随机跳转子单元,用于在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块向第m-1个子代码块所在函数内的所有未分割的基本块和相对于所述目标基本块中第m-1个子代码块的其他子代码块的随机跳转。
在一具体的实施方式中,所述条件跳转指令基于具有唯一比较结果的数学比较运算设置,在得到所述唯一比较结果时,执行所述条件跳转指令的可达分支中的跳转指令。
基于同一发明构思,作为对上述方法的实现,本发明实施例提供一种计算机设备30,图4为本发明实施例中的计算机设备30的结构示意图,参见图4所示,该计算机设备30包括:存储器301、处理器302以及存储在存储器301上并可在处理器302上运行的计算机程序303,处理器执行程序303时实现前述程序保护方法实施例中的任一实施方式所述的步骤。
基于同一发明构思,本发明实施例提供一种计算机存储介质,其上存储有计算机程序,上述指令可由图4所示的该计算机设备30的处理器302执行以完成上述方法。所述计算机存储介质具体为非临时性计算机可读存储介质,具体可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
本发明实施例提供的以上实施例,至少实现了如下技术效果或者优点:
通过分割用户编辑的源程序为包含若干基本块的基本块序列;从基本块序列中确定一个以上的目标基本块,在每个目标基本块中创建不可达分支;在每个目标基本块的不可达分支中添加该目标基本块向与该目标基本块处于同一函数的其他基本块的跳转,获得新的程序;生成与新的程序对应的可执行程序文件,由于不可达分支具有不可执行的特性,因此,可执行程序文件在实际执行过程中,不可达分支中的程序内容并不会被执行到,也就不会改变软件产品的实际功能,但是可执行程序文件被反编译处理得到的可读程序中,不可达分支中的程序内容又是真实存在的,因此,在不可达分支中添加的基本块之间的跳转关系能够混淆真实的函数内执行流程,进而误导逆向工程师,使得很难被逆向工程师分辨程序内的实际逻辑,以此提高了软件产品被逆向工程师逆向的难度,故而,提高了软件产品的安全性。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的各描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的智能摄像系统以及网络摄像头中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者系统程序(如计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是,上述各实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应该将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或者步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干系统的单元权利要求中,这些系统中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明公开A1、一种程序保护方法,包括:
分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
生成与所述新的程序对应的可执行程序文件。
A2、如A1所述的程序保护方法,所述在每个所述目标基本块中创建不可达分支,包括:
分割每个所述目标基本块为M个子代码块,M为大于1的整数;
在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,所述条件跳转指令包括可达分支和所述不可达分支,m依次取2至M中的一个;
将用于所述目标基本块中第m-1个子代码块向所述第m个子代码块进行跳转的指令,写入在所述目标基本块的条件跳转指令的可达分支中。
A3、如A2所述的程序保护方法,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括:
扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;
从所述目标基本块所在函数内的所有基本块中,确定所述其他基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转。
A4、如A2所述的程序保护方法,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括:
确定所述目标基本块所在函数内的基本块个数;
判断所述基本块个数是否大于预设数值;
如果是,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;
否则,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
A5、如A3或A4所述的程序保护方法,所述在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转,包括:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
A6、如A5所述的程序保护方法,所述从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块,包括:
随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块;或者
从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
A7、如A2所述的程序保护方法,所述从所述基本块序列中确定一个以上的目标基本块,包括:
将所述基本块序列中尺寸大于预设代码尺寸的各个基本块,分别确定为目标基本块;或者
从所述基本块序列中随机选择一个以上的基本块,分别确定为目标基本块。
A8、如A7所述的程序保护方法,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括:
获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块向第m-1个子代码块所在函数内的所有未分割的基本块和相对于所述目标基本块中第m-1个子代码块的其他子代码块的随机跳转。
本发明公开了B9、一种程序保护装置,包括:
程序分割单元,用于分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
文件生成单元,用于生成与所述新的程序对应的可执行程序文件。
B10、如B9所述的程序保护装置,所述分支创建单元,包括:
代码块分割子单元,用于分割每个所述目标基本块为M个子代码块,M为大于1的整数;
条件指令生成单元,用于在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,所述条件跳转指令包括可达分支和所述不可达分支,m依次取2至M中的一个;
指令写入子单元,用于将用于所述目标基本块中第m-1个子代码块向所述第m个子代码块进行跳转的指令,写入在所述目标基本块的条件跳转指令的可达分支中。
B11、如B10所述的程序保护装置,所述跳转添加单元,包括:
扫描子单元,用于扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;
确定子单元,用于从所述目标基本块所在函数内的所有基本块中,确定所述其他基本块;
随机跳转子单元,用于在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转。
B12、如B10所述的程序保护装置,所述跳转添加单元,包括:
个数确定子单元,用于确定所述目标基本块所在函数内的基本块个数;
个数判断子单元,用于判断所述基本块个数是否大于预设数值;
随机跳转子单元,用于如果所述个数判断子单元的判断结果为是,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;
直接跳转子单元,用于如果所述个数判断子单元的判断结果为否,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
B13、如B11或B12所述的程序保护装置,所述随机跳转子单元,具体用于:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
B14、如B13所述的程序保护装置,所述随机跳转子单元,具体用于:
随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块;或者
从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
B15、如B10所述的程序保护装置,所述分支创建单元,还包括:目标基本块确定子单元,用于将所述基本块序列中尺寸大于预设代码尺寸的各个基本块,分别确定为目标基本块;或者从所述基本块序列中随机选择一个以上的基本块,分别确定为目标基本块。
B16、如B15所述的程序保护装置,所述跳转添加单元,包括:
代码块获取子单元,用于获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;
随机跳转子单元,用于在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块中第m-1个子代码块向第m-1个子代码块所在函数内的所有未分割的基本块和相对于所述目标基本块中第m-1个子代码块的其他子代码块的随机跳转。
B17、如B10-B12中任一项所述的程序保护装置,所述条件跳转指令基于具有唯一比较结果的数学比较运算设置,在得到所述唯一比较结果时,执行所述条件跳转指令的可达分支中的跳转指令。
本发明公开了C18、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现A1-A8中任一项所述的步骤。
本发明公开了D19、一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现A1-A8中任一项所述的步骤。
Claims (10)
1.一种程序保护方法,其特征在于,包括:
分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
生成与所述新的程序对应的可执行程序文件。
2.如权利要求1所述的程序保护方法,其特征在于,所述在每个所述目标基本块中创建不可达分支,包括:
分割每个所述目标基本块为M个子代码块,M为大于1的整数;
在所述目标基本块中,生成用于所述目标基本块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,所述条件跳转指令包括可达分支和所述不可达分支,m依次取2至M中的一个;
将用于所述目标基本块中第m-1个子代码块向所述第m个子代码块进行跳转的指令,写入在所述目标基本块的条件跳转指令的可达分支中。
3.如权利要求2所述的程序保护方法,其特征在于,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括对每个所述目标基本块执行如下步骤:
扫描所述目标基本块所在函数,获得所述目标基本块所在函数内的所有基本块;
从所述目标基本块所在函数内的所有基本块中确定所述其他基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转。
4.如权利要求2所述的程序保护方法,其特征在于,所述在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,包括对每个所述目标基本块执行如下步骤:
确定所述目标基本块所在函数内的基本块个数;
判断所述基本块个数是否大于预设数值;
如果是,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转;
否则,在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的一对一跳转。
5.如权利要求3或4所述的程序保护方法,其特征在于,所述在所述目标基本块的条件跳转指令的不可达分支中,添加所述目标基本块向所述其他基本块的随机跳转,包括:
从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块;
在所述目标基本块的条件跳转指令的不可达分支中,添加用于所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
6.如权利要求5所述的程序保护方法,其特征在于,所述从所述目标基本块所在函数内确定不包括所述目标基本块的一个以上候选基本块,包括:
随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块;或者
从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
7.如权利要求2所述的程序保护方法,其特征在于,所述从所述基本块序列中确定一个以上的目标基本块,包括:
将所述基本块序列中尺寸大于预设代码尺寸的各个基本块,分别确定为目标基本块;或者
从所述基本块序列中随机选择一个以上的基本块,分别确定为目标基本块。
8.一种程序保护装置,其特征在于,包括:
程序分割单元,用于分割用户编辑的源程序为基本块序列,所述基本块序列包含若干基本块;
分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,得到新的程序,所述其他基本块与所述目标基本块属于同一函数;
文件生成单元,用于生成与所述新的程序对应的可执行程序文件。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-7中任一项所述的步骤。
10.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1-7中任一项所述的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810350231.3A CN108763878A (zh) | 2018-04-18 | 2018-04-18 | 一种程序保护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810350231.3A CN108763878A (zh) | 2018-04-18 | 2018-04-18 | 一种程序保护方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108763878A true CN108763878A (zh) | 2018-11-06 |
Family
ID=64011060
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810350231.3A Pending CN108763878A (zh) | 2018-04-18 | 2018-04-18 | 一种程序保护方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108763878A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101872393A (zh) * | 2009-04-23 | 2010-10-27 | 李嘉 | 一种Java程序防篡改响应方案 |
CN103065069A (zh) * | 2013-01-28 | 2013-04-24 | 电子科技大学 | 一种基于壳技术的软件保护方法 |
CN106778101A (zh) * | 2016-12-08 | 2017-05-31 | 合肥康捷信息科技有限公司 | 一种基于控制流和外形混淆的Python代码混淆方法 |
CN107506623A (zh) * | 2017-08-15 | 2017-12-22 | 北京奇虎科技有限公司 | 应用程序的加固方法及装置、计算设备、计算机存储介质 |
-
2018
- 2018-04-18 CN CN201810350231.3A patent/CN108763878A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101872393A (zh) * | 2009-04-23 | 2010-10-27 | 李嘉 | 一种Java程序防篡改响应方案 |
CN103065069A (zh) * | 2013-01-28 | 2013-04-24 | 电子科技大学 | 一种基于壳技术的软件保护方法 |
CN106778101A (zh) * | 2016-12-08 | 2017-05-31 | 合肥康捷信息科技有限公司 | 一种基于控制流和外形混淆的Python代码混淆方法 |
CN107506623A (zh) * | 2017-08-15 | 2017-12-22 | 北京奇虎科技有限公司 | 应用程序的加固方法及装置、计算设备、计算机存储介质 |
Non-Patent Citations (1)
Title |
---|
孙国梓: "子程序花指令模糊变换逻辑一致性研究", 《计算机科学》 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10353796B2 (en) | System and method for using development objectives to guide implementation of source code | |
Goodrich et al. | Data structures and algorithms in Java | |
US5881290A (en) | Industrial controller decompiler accommodating an expandable instruction set | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
Karrer et al. | Stacksplorer: Call graph navigation helps increasing code maintenance efficiency | |
CN111949170B (zh) | 一种配置任务流程的方法、装置和电子设备 | |
US20230004368A1 (en) | Multi-chip compatible compiling method and device | |
US5819097A (en) | Industrial controller compiler with expandable instruction set | |
EP1459175A2 (en) | Method and apparatus for creating software objects | |
CN103645930B (zh) | 汇编级跨文件调度框架的构建方法 | |
Barrett et al. | UCPOP user's manual | |
Einarsson et al. | A survivor’s guide to Java program analysis with soot | |
CN108021507A (zh) | 符号执行的并行路径搜索方法及装置 | |
CN108763878A (zh) | 一种程序保护方法及装置 | |
CN108846265A (zh) | 一种程序加固方法及装置 | |
JP2013242604A (ja) | 実行モジュール最適化装置、実行モジュール最適化方法、およびプログラム | |
Visser | Understanding software through linguistic abstraction | |
McNamara | Rust in Action | |
Price et al. | Mastering Visual C#. Net | |
Stec | SFC graphic editor for CPDev environment | |
McGrath | C Programming in easy steps | |
CN108647500A (zh) | 一种基于对抗逆向的程序加固方法及装置 | |
Jansen | Hands-On Functional Programming with TypeScript: Explore functional and reactive programming to create robust and testable TypeScript applications | |
US20230176823A1 (en) | Automatic generation of source code implementing a regular expression | |
Smyth | Objective-C 2. 0 Essentials |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20181106 |