CN108846265B - 一种程序加固方法及装置 - Google Patents

一种程序加固方法及装置 Download PDF

Info

Publication number
CN108846265B
CN108846265B CN201810350873.3A CN201810350873A CN108846265B CN 108846265 B CN108846265 B CN 108846265B CN 201810350873 A CN201810350873 A CN 201810350873A CN 108846265 B CN108846265 B CN 108846265B
Authority
CN
China
Prior art keywords
function
functions
target
branch
program file
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.)
Active
Application number
CN201810350873.3A
Other languages
English (en)
Other versions
CN108846265A (zh
Inventor
黄绍莽
潘剑锋
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.)
Beijing Qihoo Technology Co Ltd
Original Assignee
Beijing Qihoo Technology 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 Beijing Qihoo Technology Co Ltd filed Critical Beijing Qihoo Technology Co Ltd
Priority to CN201810350873.3A priority Critical patent/CN108846265B/zh
Publication of CN108846265A publication Critical patent/CN108846265A/zh
Application granted granted Critical
Publication of CN108846265B publication Critical patent/CN108846265B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Abstract

本发明公开了一种程序加固方法及装置,应用于软件开发技术领域,该方法包括:从用户编辑的源程序文件中确定N个目标函数,源程序文件至少由N个函数组成,N为大于1的整数;在N个目标函数的每个目标函数内创建不可达分支;在每个目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,其他函数属于源程序文件;生成与新的程序对应的可执行程序文件。通过本发明提高了软件产品被逆向工程师逆向的难度,从而解决了软件产品的安全性不高的技术问题。

Description

一种程序加固方法及装置
技术领域
本发明涉及软件开发技术领域,尤其涉及一种程序加固方法及装置。
背景技术
高级语言编写的源程序文件经过编译变成可执行程序文件,用于机器执行,而反编译是其逆过程,可以将可执行程序文件通过反编译得到可读的源程序文件。计算机软件反向工程(Reversepengineering)也称为计算机软件还原工程,就是是指通过对他人软件的目标程序(可执行程序文件)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,从而作为自己开发软件时的参考,或者直接用于自己的软件产品中。
因此,用户所自主开发的软件产品很容易被竞争对手通过计算机软件反向工程,反编译而知晓该软件产品所使用的思路、原理、结构、算法、处理过程、运行方法,导致软件产品被模仿,甚至盗取。因此,目前的软件产品的安全性不高。
发明内容
本发明实施例提供一种程序加固方法及装置,解决了软件产品的安全性不高的技术问题。
第一方面,本发明实施例提供一种程序加固方法,包括:
从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
在所述N个目标函数的每个目标函数内创建不可达分支;
在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
生成与所述新的程序对应的可执行程序文件。
可选的,所述在所述N个目标函数的每个目标函数内创建不可达分支,包括:
在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用。
可选的,所述在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,包括:
对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
可选的,所述在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,包括:
对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用。
可选的,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用,包括:
从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
可选的,所述从所述源程序文件的全部函数中确定一个以上候选被调函数,包括:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
可选的,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
可选的,所述方法还包括:
通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
记录所述源程序文件中全部函数的函数名。
可选的,所述在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
可选的,在所述函数调用指令中写入所述候选被调函数的函数名之后,还包括:
针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
可选的,在所述从用户编辑的源程序文件中确定N个目标函数之前,还包括:
分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
第二方面,本发明实施例提供一种程序加固装置,包括:
函数确定单元,用于从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
第一分支创建单元,用于在所述N个目标函数的每个目标函数内创建不可达分支;
添加函数调用单元,用于在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
可执行文件生成单元,用于生成与所述新的程序对应的可执行程序文件。
可选的,所述第一分支创建单元,包括:
语句创建子单元,用于在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
调用写入子单元,用于在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用。
可选的,所述添加函数调用单元,包括:
添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
可选的,所述添加函数调用单元,包括:
所述添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用。
可选的,所述添加函数调用子单元,包括:
函数确定模块,用于从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
一对一调用模块,用于在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
可选的,所述函数确定模块,具体用于:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
可选的,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
可选的,所述装置还包括:
函数名获取单元,用于通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
函数名记录单元,用于记录所述源程序文件中全部函数的函数名。
可选的,所述一对一调用模块,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
可选的,所述装置还包括:
参数随机生成单元,用于针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
可选的,所述装置还包括:
分割单元,用于分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
第二分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
第三方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面中任一实施方式所述的步骤。
第四方面,本发明实施例提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面中任一实施方式所述的步骤。
本发明实施例提供的一个或者多个技术方案,至少实现了如下技术效果或者优点:
由于从用户编辑的源程序文件中确定N个目标函数;在N个目标函数的每个目标函数内创建不可达分支;在每个目标函数的不可达分支中添加该目标函数对与该目标函数属于同一源程序文件的其他函数的调用,得到新的程序;生成与新的程序对应的可执行程序文件。而不可达分支具有不可执行的特性,因此,可执行程序文件在实际执行过程中,其中的不可达分支中的程序内容并不会被执行到,也就不会改变软件产品的实际功能,但是可执行程序文件被反编译处理得到的可读程序中,不可达分支中的程序又是存在的,因此,在不可达分支中添加的该目标函数对其他函数的调用能够混淆真实的函数间调用关系,进而误导逆向工程师,使得很难被逆向工程师分辨程序内的实际逻辑,以此提高了软件产品被逆向工程师逆向的难度,故而,提高了软件产品的安全性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的程序加固方法的流程图;
图2A为XX函数内的基本块跳转示意图;
图2B为基于本发明实施例提供的程序加固方法得到的xx函数内跳转示意图;
图3为本发明实施例提供的程序加固装置的程序模块图;
图4为本发明实施例提供的计算机设备的结构框图。
具体实施方式
本发明实施例提供一种程序加固方法及装置,提高了软件产品的安全性,总体思路如下:
从用户编辑的源程序文件中确定目标函数,在目标函数内创建不可达分支;在目标函数的不可达分支中添加该目标函数对源程序文件中其他函数的调用,从而得到新的程序,最后,生成与新的程序对应的可执行程序文件。
通过上述技术方案,在不可达分支中添加的该目标函数对其他函数的调用能够混淆真实的函数间调用关系,进而误导逆向工程师,使得很难被逆向工程师分辨程序内的实际逻辑,以此提高了软件产品的安全性。
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。需要说明的是,在不冲突的前提,本发明实施例提供的各个实施例可以相互结合。
源程序文件经过编译步骤和链接步骤生成可执行程序文件。需要说明的是,本发明实施例提供的步骤S101~S104正是应用于对源程序文件进行的编译步骤中,因此,在对源程序文件所进行的编译步骤中,除了本发明所给出的步骤,所需要进行的其他处理细节均可以参考现有技术,为了说明书的简洁,本文不进行赘述。
参考图1所示,本发明实施例提供的程序加固方法的流程图,本发明实施例提供的程序加固方法包括如下步骤:
首先,执行步骤S101:从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数。
需要说明的是,用户编辑的源程序文件具体指用户按照一定的程序设计语言规范书写的最原始程序的未经编译的代码,源程序文件为可读的文本文件。通常由高级语言编写,比如:C语言、C++语言、Java语言等,源程序文件可以是以书籍或者磁带或者其他载体的形式出现,但最为常用的格式是文本文件。并且,源程序文件中的函数是一个自我包含的完成一定相关功能的一系列指令。
具体的,用户编辑的源程序文件由多个函数组成,可以包括函数库中的函数、还可以包括用户自定义的函数。源程序文件包括主函数以及各个子函数,无论是主函数还是子函数,每个函数具有各自的函数名。
具体的,步骤S101具体为:对用户编辑的源程序文件进行扫描,得到源程中存在的全部函数,则通过扫描源程序文件中的全部函数,均确定为目标函数。
步骤S101具体为:确定源程序文件中的全部函数,从源程序文件的全部函数中筛选出一个或者多个函数,确定为目标函数。在具体实施过程中,可以有多种筛选规则,进行举例说明:
筛选规则一:预先建立一个函数名单,函数名单中写有可以确定为目标函数的函数名。步骤S101具体为:对源程序文件进行扫描,得到源程中存在的全部函数的函数名,判断源程中存在的每个函数的函数名是否在函数名单中,如果存在于函数名单中,则确定为目标函数,否则不是目标函数。
具体的,在函数名单为一些完成特定功能的函数的函数名,从而能够更有针对性进行函数调用混淆。
筛选规则二:随机从源程序文件的全部函数中筛选出多个函数,各自确定为目标函数。
筛选规则三:确定源程序文件中的全部函数,从源程序文件的全部函数中筛选出有函数调用的函数,确定为目标函数。
在步骤S101之后,接着执行步骤S102:在所述N个目标函数的每个目标函数内创建不可达分支。
需要说明的是,不可达分支是不能通过输入来执行的路径,因此,不可达中的程序在执行时不会被执行到。相对于不可达分支的是可达分支,可达分支是在某一输入下可被执行到的路径,因此,可达分支中的程序在实际执行时会在某一输入下被执行到。
具体的,在所述N个目标函数的每个目标函数内创建不可达分支,实施方式如下:
在每个所述目标函数内创建条件调用语句,其中,每个所述目标函数内的条件调用语句包括可达分支和所述不可达分支;在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用。
在具体实施过程中,每个目标函数中的真实函数调用可能存在一个或者多个。需要说明的是,目标函数的真实函数调用,就是指:在源程序文件没有经过程序加固之前就已经存在的,该目标函数的函数调用,即:该目标函数调用了哪个函数或者哪些函数。具体而言,如果该目标函数中存在一个真实函数调用,将该目标函数函数调用指令处创建一个条件调用语句,而将用于实现该目标函数的真实函数调用的函数调用指令移动至该条件调用语句的可达分支中。
在具体实施过程中,在每个目标函数内创建条件调用语句,可以是:将用于实现该目标函数的真实函数调用的函数调用指令进行变换,得到针针对该目标函数的条件调用语句。
因此,如果该目标函数内具有多个连续的真实函数调用,在该目标函数内可以创建一个条件调用语句,在目标函数内的一个条件调用语句的可达分支中写入该多个连续的真实函数调用。也可以创建多个条件调用语句,在各个条件调用语句中,一对一写入一个真实函数调用。
具体的,每个目标函数内的条件调用语句可以是:基于具有唯一结果的数学表达式设置,在得到该数学表达式的唯一结果时,执行该条件调用语句的可达分支中的指令,即执行:用于实现该目标函数的真实函数调用的函数调用指令,而条件调用语句的不可达分支中的指令在实际执行时不会被执行到。因此,形成了具有可达分支和不可达分支的条件调用语句。
具体的,在N个目标函数的不同目标函数中,所使用的具有唯一结果的数学表达式可以相同,也可以有多种数学表达式,在针对当前的目标函数时从中随机确定一种数学表达式。
在具体实施过程中,所用的数学表达式具体为比较复杂的数学表达式,提高逆向难度。
在一具体实施方式中,条件调用语句可以是if语句,具体为:if(一个具有唯一结果的数学表达式){程序块A}else{程序块B}。具体的,该数学表达式为具有唯一结果的布尔型变量,该if语句的可达分支为执行程序块A,不可达分支为执行程序块B,程序块A为用于该目标函数的真实函数调用的函数调用指令。获得唯一结果时,执行条件调用语句的可达分支中的指令。程序块B为所添加的该目标函数对其他函数的调用,是源程序文件中该目标函数不存在的函数调用关系,用于混淆该目标函数真实的函数调用关系。
在具体实施过程中,可以是针对目标函数的每个真实函数调用,分别创建条件调用语句,也可以是,针对目标函数的多个连续的真实函数调用,创建一个条件调用语句。
以源程序文件中存在函数A的实函数调用关系为:函数A→调用函数B1,调用函数B2,进行举例来讲:
可以是如下方式:
int A()
{if(具有唯一结果的数学表达式){对函数B1的调用}else{对其他函数的调用};
if(具有唯一结果的数学表达式){对函数B2的调用}else{对其他函数调用};
也可以是如下方式:
int A(){if(具有唯一结果的数学表达式){对函数B1的调用,对函数B2的调用}else{对其他函数的调用}
当然,在具体实施过程中,条件调用语句也可以为其他形式,源程序文件的编程语言不同,则使用的条件调用语句也可以不同。
在步骤S102之后,接着执行步骤S103:在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件。
需要说明的是,其他函数是针对该目标函数而言,其他函数具体是与该目标函数的条件调用语句的可达分支中所调用的函数不同的函数,针对该目标函数的其他函数可以包括该目标函数,即调用该目标函数自身。
举例来讲,源程序文件包括函数A、函数A调用函数B和函数C,函数B调用函数D、函数D调用函数E,在目标函数A的条件调用语句的可达分支中存在真实函数调用为:调用函数B和函数C,将对函数B、C的调用移动至该目标函数A的条件调用语句的可达分支中。在该目标函数A的条件调用语句的不可达分支中,可以添加对函数D、函数E中的一个或者多个的调用。
具体的,在步骤S103中,在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,可以有多种实施方式,下面进行分别描述:
实施方式一:
对每个所述目标函数分别执行如下步骤:在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
具体而言,在该目标函数的条件调用语句的可达分支中,添加该目标函数对该可达分支中所调用函数不同的各个函数的随机调用。
举例来讲,源程序文件包括函数1,函数1调用函数2、3、4,函数3调用函数2、5,函数4调用函数6、7。
目标函数1(即在函数1)中创建条件调用语句1,在该条件调用语句1的可达分支中写入有函数1调用函数2、3、4,在该条件调用语句1的不可达分支中添加函数1对函数1、5、6、7的随机调用,在目标函数3(即在函数3中)中创建条件调用语句2,在该条件调用语句2的可达分支中写入有函数3调用函数2、5,在该条件调用语句2的不可达分支中添加函数3对函数1、3、4、6、7的随机调用。在目标函数4(即在函数1)中创建条件调用语句3,在该条件调用语句3的可达分支中写入有函数4调用函数6、7,在该条件调用语句3的不可达分支中写入函数4对函数1、2、3、4、5的随机调用。
更具体来讲,随机调用是从与该目标函数的条件调用语句的可达分支中所调用的函数不同的各个函数中随机选择出一个或者多个,接着,在不可达分支中写入对随机选择出的一个或者多个函数的调用。
通过实施方式一,能够在每个目标函数中都写入混淆该目标函数内真实函数调用逻辑的不可执行的函数调用关系。
由于用户编辑的源程序文件中可能包含的函数可能较多,在这种情况下,则实施方式一会大大增加生成可执行程序文件的代码量,增加了软件产品的尺寸,对此,给出如下实施方式二:
对每个所述目标函数执行如下步骤:扫描所述源程序文件,确定所述源程序文件中函数个数;判断所述源程序文件中函数个数是否大于预设数值;如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用。
通过实施方式二,能够兼顾最后生成的可执行程序文件的代码量与逆向难度。
在上述实施方式一、二中,该目标函数对其他函数的随机调用,实现过程均可以如下:
从所述源程序文件的全部函数中确定一个以上候选被调函数;在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
进一步的,所述候选被调函数与该目标函数的条件调用语句的可达分支中所调用的函数不同。
需要说明的是,针对该目标函数的候选被调函数只要与该目标函数的条件调用语句的可达分支中所调用的函数不同,但是可以与其他函数(包括N个目标函数中其他的目标函数)中所调用的函数相同。
从所述源程序文件的全部函数中确定一个以上候选被调函数,可以有多种方式,下面分别进行说明:
方式一、随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数。
方式二:从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。比如,可以从所述源程序文件的全部函数中筛选出用户自定义函数为候选被调函数,从而,候选被调函数不会是库函数,由此增加被逆向工程师解读的难度。
在具体实施过程,为了在该目标函数的条件调用语句的不可达分支中,添加该目标函数对所述一个以上候选被调函数的一对一调用。
添加该目标函数对所述候选被调函数的调用,具体实现方式如下:
首先,通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名,记录所述源程序文件中全部函数的函数名;在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;在所述函数调用指令中写入所述候选被调函数的函数名。
进一步的,所述候选被调函数可以为有参函数,也可以为无参函数,如果所述候选被调函数是有参函数,在所述函数调用指令中写入所述候选被调函数的函数名之后,还包括如下步骤:针对所述候选被调函数生成随机的传递参数;将所述随机的传递参数写入在所述函数调用指令中。
比如,将所述随机的传递参数写入在所述函数调用指令之后,可以表示如下:
int_stdcall function(随机的传递参数x,随机的传递参数y)。
因为不可达分支中的指令并不会被执行到,因此,在不可达分支中写入的针对所述候选被调函数的传递参数可以随机生成,而不影响程序本身的功能。
进一步的,为了进一步增加逆向难度,从而增加程序安全性,本发明实施例在前述实施过程的前提下,还可以在步骤S101之前包括如下步骤:
步骤1:分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
具体的,在步骤1中,用户编辑的源程序文件分割为由多个基本块(Basicblock),则分割为的多个基本块组成了基本块序列。其中,基本块是划分程序的一个单位,一个基本块为一条或数条指令的组合,基本块中包含第一条指令和最后一条指令,只要基本块中的第一条指令被执行了,那么基本块内所有执行都会按照顺序仅执行一次,直到执行到基本块中最后一条指令,这样的一条或者多条指令的组合会被分割为一个基本块。
在步骤1之后,接着执行步骤2:从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
具体的,目标基本块具体为:按照预设挑选规则从基本块序列中选择出的基本块。在具体实施过程中,可以从基本块序列中选择出一个或者多个目标基本块,而根据预设挑选规则不同,选择目标基本块的实施方式也可以有多种,下面分别进行描述:
实施方式一:
判断基本块序列中各基本块的尺寸是否大于预设代码尺寸,获得基本块序列中尺寸大于预设代码尺寸的基本块;将基本块序列中尺寸大于预设代码尺寸的基本块均选择为目标基本块。
具体的,基本块的尺寸具体为:基本块中的全部指令被转换为汇编指令的前提下,基本块中所包含的汇编指令行数。对应的,预设代码尺寸可以设置为20行汇编指令,分别判断基本块序列中各个基本块的汇编指令行数是否大于20行,获得基本块序列中汇编指令行数大于20行的各基本块;接着,将基本块序列中汇编指令行数大于20行的基本块均选择为目标基本块。
当然,在具体实施过程中,预设代码尺寸还可以根据实际需求设置为其他的汇编指令行数值,更甚者,还可以是其他方式定义的尺寸参数。
实施方式二:将基本块序列中的每一个基本块,均选择为目标基本块。当然,在具体实施过程中,实施方式二仅应用于源程序文件的代码量较少的情形。
实施方式三:随机从基本块序列中选择一个以上基本块,作为目标基本块。
通过上述三种实施方式,均可以从基本块序列中选择出一个以上的目标基本块,再通过步骤2可以在从基本块序列选择出的各个目标基本块中分别创建不可达分支。
具体的,在基本块序列的目标基本块中创建不可达分支,实现方式可以包括如下步骤1a~1c:
步骤1a、分割目标基本块为M个子代码块,M为大于1的整数。
具体实施过程中,根据目标基本块的汇编指令行数,对目标基本块进行指令平分,得到M个子代码块。具体来讲,如果是基本块序列中尺寸大于预设代码尺寸的基本块均选择为目标基本块,则步骤1a具体为:将基本块序列中尺寸大于预设代码尺寸的一个以上基本块,各自分割为多个子代码块。如果将基本块序列中的每一个基本块均选择为目标基本块。则步骤1a具体为:将所述基本块序列中每个基本块各自分割为多个子代码块。如果随机从基本块序列中选择一个以上基本块作为目标基本块,则步骤1a具体为:从所述基本块序列中随机选择的一个以上基本块,各自分割为多个子代码块。
需要说明的是,对基本块序列中不同的目标基本块,分割为子代码块的个数可以相同,具体而言,不区别目标基本块的汇编指令行数,统一分割为两个代码块;分割为子代码块的个数也可以不同,具体而言,目标基本块被分割为子代码块的个数与目标基本块的指令行数相关,比如,基本块的汇编指令行数越多,被分割为子代码块的个数越多。
在步骤1a之后,执行步骤2b:生成用于所述M个子代码块中第m-1个子代码块向第m个子代码块进行跳转的条件跳转指令,其中,所述条件跳转指令包括可达分支和不可达分支,m依次取2至M中的一个。
需要说明的是,步骤1b具体为:生成用于第m-1个子代码块向第m个子代码块进行跳转的无条件跳转指令(jump指令)。接着,将用于第m-1个子代码块向第m个子代码块进行跳转的无条件跳转指令(jump指令)经过变换得到条件跳转指令,该变换得到的条件跳转指令包括一条可达分支和一条不可达分支。
在步骤1b之后,接着,执行步骤1c:将用于所述m-1个子代码块向所述第m个子代码块进行跳转的无条件跳转指令写入在所述条件跳转指令的可达分支中。
具体来讲,步骤1a~1c的一种具体实施方式可以为:
分割目标基本块为前1/2子代码块和后1/2子代码块;生成用于前1/2子代码块向后1/2子代码块进行跳转的无条件跳转指令;对用于前1/2子代码块向后1/2子代码块进行跳转的无条件跳转指令进行变换,经过变换得到条件跳转指令,将用于前1/2子代码块向后1/2子代码块进行跳转的无条件跳转指令写入在变换所得到的条件跳转指令的可达分支中。
具体来讲,步骤a1~1c的另一种具体实施方式可以为:
分割目标基本块为前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之后,接着执行步骤2:在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
具体而言,在所述目标基本块的不可达分支中添加所述目标基本块向与所述目标基本块属于同一函数的一个以上其他基本块的跳转,从而所得到的新的程序中不仅包含源程序文件中的指令,还包含在目标基本块所创建的不可达分支以及不可达分支中所添加的程序内容。
需要说明的是,在源程序文件的基本块序列中选择的每个目标基本块都执行步骤2~3,从而在对源程序文件编译的步骤中会创建多个针对基本块的不可达分支,每个目标基本块的不可达分支中都有当前的目标基本块对函数内其他基本块的跳转,从而形成了源程序文件中基本块之间比较复杂的相互跳转关系,以此混淆了源程序文件中实际的函数内执行流程,因此,很难被逆向工程师逆向。
具体的,一个函数内的全部指令在编译时被分割为基本块。需要说明的是,在本文中所出现的“其他基本块”均是指与目标函数属于同一函数,同时又不是目标基本块的基本块。
举例来讲,某一函数的全部指令分割为:基本块1、基本块2、基本块3、基本块4和基本块5。如果基本块1和基本块3选择为目标基本块,则在步骤3,具体是:在基本块1中创建不可达分支A,在不可达分支A中添加用于基本块1向基本块2、3、4、5中一个以上基本块的跳转;在基本块3中创建不可达分支B,在不可达分支B中添加用于基本块3向基本块1、2、4、5中一个以上基本块的跳转。
为了实现所述目标基本块向与所述目标基本块属于同一函数的一个以上其他基本块的跳转,在具体实施过程中,可以为如下多种实施方式。给出如下三种跳转方式:
跳转方式一:扫描所述目标基本块所在函数内的所有基本块;在所述条件跳转指令的不可达分支中,添加所述目标基本块向与所述目标基本块属于同一函数的各个其他基本块的随机跳转。
具体来讲,对目标基本块所在函数内进行扫描,获得目标基本块所在函数内的所有基本块。从而目标基本块向一个以上其他基本块的跳转仅限于目标基本块所在函数内,而不会跳转到目标基本块的函数外的那些基本块。
跳转方式二:
确定所述目标基本块所在函数内的基本块个数;判断所述基本块个数是否大于预设数值;如果基本块个数大于预设数值,在所述条件跳转指令的不可达分支中,添加所述目标基本块向与所述目标基本块属于同一函数的各个其他基本块的随机跳转;否则,在所述条件跳转指令的不可达分支中,添加所述目标基本块向与所述目标基本块属于同一函数的各个其他基本块的一对一跳转。
具体而言,通过在目标基本块的不可达分支中添加用于目标基本块向目标基本块所在函数内的一个以上其他基本块进行跳转的跳转指令,从而实现添加目标基本块向与目标基本块属于同一函数的一个以上其他基本块的跳转。
其中,在具体实施过程中,实现随机跳转的流程如下:
从所述目标基本块所在函数内确定出不包括所述目标基本块的一个以上候选基本块;在所述目标基本块中条件跳转指令的不可达分支中,添加所述目标基本块向所述一个以上候选基本块进行跳转的跳转指令。
具体而言,在所述条件跳转指令的不可达分支中,添加所述目标基本块向各个候选基本块进行一对一跳转的跳转指令。举例来讲:在所述条件跳转指令的不可达分支中,添加用于从目标基本块跳转至候选基本块1的跳转指令,还添加用于从目标基本块跳转至候选基本块2的跳转指令。
需要说明的是,所述目标基本块所在函数内确定出候选基本块可以有多种实施方式:
方式1、随机从所述目标基本块所在函数内选择不包括所述目标基本块的一个以上候选基本块。
具体而言,选择多少个候选基本块可以基于实际需求决定,本文不进行具体限定。比如,为了提高软件产品更加安全,可以按照一定比例选择目标基本块所在函数内的基本块;或者,从目标基本块所在函数内选择出的候选基本块的个数固定,比如,为了减少代码量,从目标基本块所在函数内选择唯一个候选基本块。
方式2、从所述目标基本块所在函数内筛选出满足预设代码条件的一个以上候选基本块。
具体而言,可以从目标基本块所在函数内筛选出与目标基本块具有相关性的一个以上候选块,或者汇编指令行数大于预设行数值的基本块为候选基本块。从而能够增加不可大分支中的不可执行程序代码的复杂性,增加了程序加固后的安全性。
跳转方式三:
获取所述目标基本块所在函数内的所有子代码块和所有未分割的基本块;在所述条件跳转指令的不可达分支中,添加所述第m-1个子代码块对第m-1个子代码块所在函数内不包括所述第m-1个子代码块在内的各个子代码块和所有未分割的基本块的随机跳转。
在具体实施过程中,还可以是在所述条件跳转指令的不可达分支中,添加所述第m-1个子代码块对所述目标基本块所在函数内的各个其他基本块的随机跳转。
下面,参考图2A~图2B进行举例说明:
在XX函数内的全部指令基于步骤1分割为基本块1、基本块2、基本块3和基本块4,在执行步骤1~3之前,参考图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函数内的实际执行流程。
在步骤S103之后,执行步骤S104:生成与所述新的程序对应的可执行程序文件。
具体来讲,通过链接步骤生成与所述新的程序对应的可执行程序文件。
需要说明的是,本发明实施例提供的技术方案,可以应用于白盒加固工具对程序进行加固的场景下,需要说明的是,白盒加固工具为相对于黑盒加固工具而言的一种对程序进行测试、加固的工具,白盒加固工具具体是在将用户编辑的源程序文件处理为可执行程序文件过程中进行的,这里的可执行程序文件即二进制文件(Binary)。而黑盒是对已经形成的可执行程序文件在此处理为可执行程序文件的过程中所进行的程序测试、加固过程。
需要说明的是,本发明实施例提供的如上技术方案,可以应用于多种平台下软件产品(可执行程序文件)的生成:基于安卓操作系统的ELF文件,基于苹果手机操作系统的应用程序,苹果电脑操作系统的应用程序,基于Linux系统的软件和加载的库文件,Windows操作系统的可执行程序和DLL(Dynamic Link Library,动态链接库)文件。需要说明的是,本发明实施例提供的如上技术方案,可基于如下执行集类型:X86、X86_64、ARM、ARM64。
基于同一发明构思,本发明实施例提供一种程序加固装置,参考图3所示,包括:
函数确定单元201,用于从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
第一分支创建单元202,用于在所述N个目标函数的每个目标函数内创建不可达分支;
添加函数调用单元203,用于在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
可执行文件生成单元204,用于生成与所述新的程序对应的可执行程序文件。
可选的,所述第一分支创建单元202,包括:
语句创建子单元,用于在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
调用写入子单元,用于在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用。
可选的,所述添加函数调用单元203,包括:
添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
可选的,所述添加函数调用单元203,包括:
所述添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用。
可选的,所述添加函数调用子单元,包括:
函数确定模块,用于从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
一对一调用模块,用于在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
可选的,所述函数确定模块,具体用于:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
可选的,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
可选的,所述装置还包括:
函数名获取单元,用于通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
函数名记录单元,用于记录所述源程序文件中全部函数的函数名。
可选的,所述一对一调用模块,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
可选的,所述装置还包括:
参数随机生成单元,用于针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
可选的,所述装置还包括:
分割单元,用于分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
第二分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
基于同一发明构思,作为对上述方法的实现,本发明实施例提供一种计算机设备30,图4为本发明实施例中的计算机设备30的结构示意图,参见图4所示,该计算机设备30包括:存储器301、处理器302以及存储在存储器301上并可在处理器302上运行的计算机程序303,处理器执行程序303时实现前述程序保护方法实施例中的任一实施方式所述的步骤。
基于同一发明构思,本发明实施例提供一种计算机存储介质,其上存储有计算机程序,上述指令可由图4所示的该计算机设备30的处理器302执行以完成上述方法。所述计算机存储介质具体为非临时性计算机可读存储介质,具体可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
本发明实施例提供的一个或者多个技术方案,至少实现了如下技术效果或者优点:
由于从用户编辑的源程序文件中确定N个目标函数;在N个目标函数的每个目标函数内创建不可达分支;在每个目标函数的不可达分支中添加该目标函数对与该目标函数属于同一源程序文件的其他函数的调用,得到新的程序;生成与新的程序对应的可执行程序文件。而不可达分支具有不可执行的特性,因此,可执行程序文件在实际执行过程中,其中的不可达分支中的程序内容并不会被执行到,也就不会改变软件产品的实际功能,但是可执行程序文件被反编译处理得到的可读程序中,不可达分支中的程序又是存在的,因此,在不可达分支中添加的该目标函数对其他函数的调用能够混淆真实的函数间调用关系,进而误导逆向工程师,使得很难被逆向工程师分辨程序内的实际逻辑,以此提高了软件产品被逆向工程师逆向的难度,故而,提高了软件产品的安全性。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的各描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的智能摄像系统以及网络摄像头中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者系统程序(如计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是,上述各实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应该将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或者步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干系统的单元权利要求中,这些系统中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
本发明公开A1、一种程序加固方法,包括:
从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
在所述N个目标函数的每个目标函数内创建不可达分支;
在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
生成与所述新的程序对应的可执行程序文件。
A2、如A1所述的程序加固方法,所述在所述N个目标函数的每个目标函数内创建不可达分支,包括:
在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用。
A3、如A2所述的程序加固方法,所述在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,包括:
对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
A4、如A2所述的程序加固方法,所述在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,包括:
对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用。
A5、如A3或A4所述的程序加固方法,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用,包括:
从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
A6、如A5所述的程序加固方法,所述从所述源程序文件的全部函数中确定一个以上候选被调函数,包括:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
A7、如A2-4中任一项所述的程序加固方法,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
A8、如A5所述的程序加固方法,所述方法还包括:
通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
记录所述源程序文件中全部函数的函数名。
A9、如A8所述的程序加固方法,所述在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
A10、如A9所述的程序加固方法,在所述函数调用指令中写入所述候选被调函数的函数名之后,还包括:
针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
A11、如A1所述的程序加固方法,在所述从用户编辑的源程序文件中确定N个目标函数之前,还包括:
分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
本发明还公开了B12、一种程序加固装置,包括:
函数确定单元,用于从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
第一分支创建单元,用于在所述N个目标函数的每个目标函数内创建不可达分支;
添加函数调用单元,用于在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
可执行文件生成单元,用于生成与所述新的程序对应的可执行程序文件。
B13、如B12所述的程序加固装置,所述第一分支创建单元,包括:
语句创建子单元,用于在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
调用写入子单元,用于在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用。
B14、如B13所述的程序加固装置,所述添加函数调用单元,包括:
添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
B15、如B13所述的程序加固装置,所述添加函数调用单元,包括:
所述添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用。
B16、如B14或B15所述的程序加固装置,所述添加函数调用子单元,包括:
函数确定模块,用于从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
一对一调用模块,用于在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
B17、如B16所述的程序加固装置,所述函数确定模块,具体用于:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
B18、如B13-15中任一项所述的程序加固装置,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
B19、如B16所述的程序加固装置,所述装置还包括:
函数名获取单元,用于通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
函数名记录单元,用于记录所述源程序文件中全部函数的函数名。
B20、如B19所述的程序加固装置,所述一对一调用模块,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
B21、如B20所述的程序加固装置,还包括:
参数随机生成单元,用于针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
B22、如B12所述的程序加固装置,还包括:
分割单元,用于分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
第二分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
本发明还公开了C23、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现A1-A11中任一项所述的步骤。
本发明还公开了D24、一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现权利要求A1-A11中任一项所述的步骤。

Claims (18)

1.一种程序加固方法,其特征在于,包括:
从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
在所述N个目标函数的每个目标函数内创建不可达分支;
在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
生成与所述新的程序对应的可执行程序文件;
所述在所述N个目标函数的每个目标函数内创建不可达分支,包括:
在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用;
所述在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,包括:
对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用;或者
所述在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,包括:
对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
2.如权利要求1所述的程序加固方法,其特征在于,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用,包括:
从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
3.如权利要求2所述的程序加固方法,其特征在于,所述从所述源程序文件的全部函数中确定一个以上候选被调函数,包括:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
4.如权利要求1所述的程序加固方法,其特征在于,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
5.如权利要求2所述的程序加固方法,其特征在于,所述方法还包括:
通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
记录所述源程序文件中全部函数的函数名。
6.如权利要求5所述的程序加固方法,其特征在于,所述在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
7.如权利要求6所述的程序加固方法,其特征在于,在所述函数调用指令中写入所述候选被调函数的函数名之后,还包括:
针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
8.如权利要求1所述的程序加固方法,其特征在于,在所述从用户编辑的源程序文件中确定N个目标函数之前,还包括:
分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
9.一种程序加固装置,其特征在于,包括:
函数确定单元,用于从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数;
第一分支创建单元,用于在所述N个目标函数的每个目标函数内创建不可达分支;
添加函数调用单元,用于在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件;
可执行文件生成单元,用于生成与所述新的程序对应的可执行程序文件;
所述第一分支创建单元,包括:
语句创建子单元,用于在每个所述目标函数内创建条件调用语句,每个所述目标函数内的条件调用语句均包括可达分支和所述不可达分支;
调用写入子单元,用于在每个所述目标函数的条件调用语句的可达分支中,写入该目标函数的真实函数调用;
所述添加函数调用单元,包括:
所述添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
扫描所述源程序文件,确定所述源程序文件中函数个数;
判断所述源程序文件中函数个数是否大于预设数值;
如果是,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用;
否则,在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的一对一调用;或者
所述添加函数调用单元,包括:
添加函数调用子单元,用于对每个所述目标函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
10.如权利要求9所述的程序加固装置,其特征在于,所述添加函数调用子单元,包括:
函数确定模块,用于从所述源程序文件的全部函数中确定一个以上候选被调函数,所述候选被调函数与所述目标函数的条件调用语句的可达分支中所调用的函数不同;
一对一调用模块,用于在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对所述一个以上候选被调函数的一对一调用。
11.如权利要求10所述的程序加固装置,其特征在于,所述函数确定模块,具体用于:
随机从所述源程序文件的全部函数中,选择与该目标函数的条件调用语句的可达分支中所调用函数不同的函数,确定为所述候选被调函数;或者
从所述源程序文件的全部函数中,筛选出满足预设函数条件的函数,确定为所述候选被调函数。
12.如权利要求9所述的程序加固装置,其特征在于,所述条件调用语句基于具有唯一结果的数学表达式设置,在得到所述数学表达式的唯一结果时,执行在所述目标函数的条件调用语句的可达分支中的指令。
13.如权利要求9所述的程序加固装置,其特征在于,所述装置还包括:
函数名获取单元,用于通过扫描用户编辑的源程序文件,获取所述源程序文件中全部函数的函数名;
函数名记录单元,用于记录所述源程序文件中全部函数的函数名。
14.如权利要求10所述的程序加固装置,其特征在于,所述一对一调用模块,包括:
对每个所述候选被调函数执行如下步骤:
在所述目标函数的条件调用语句的不可达分支中添加函数调用指令;
从所述源程序文件中全部函数的函数名中,获取所述候选被调函数的函数名;
在所述函数调用指令中写入所述候选被调函数的函数名。
15.如权利要求14所述的程序加固装置,其特征在于,还包括:
参数随机生成单元,用于针对所述候选被调函数生成随机的传递参数;
将所述随机的传递参数写入在所述函数调用指令中。
16.如权利要求9所述的程序加固装置,其特征在于,还包括:
分割单元,用于分割用户编辑的源程序文件为基本块序列,所述基本块序列包含若干基本块;
第二分支创建单元,用于从所述基本块序列中确定一个以上的目标基本块,在每个所述目标基本块中创建不可达分支;
跳转添加单元,用于在每个所述目标基本块的不可达分支中添加该目标基本块向其他基本块的跳转,所述其他基本块与所述目标基本块属于同一函数。
17.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-8中任一项所述的步骤。
18.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1-8中任一项所述的步骤。
CN201810350873.3A 2018-04-18 2018-04-18 一种程序加固方法及装置 Active CN108846265B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810350873.3A CN108846265B (zh) 2018-04-18 2018-04-18 一种程序加固方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810350873.3A CN108846265B (zh) 2018-04-18 2018-04-18 一种程序加固方法及装置

Publications (2)

Publication Number Publication Date
CN108846265A CN108846265A (zh) 2018-11-20
CN108846265B true CN108846265B (zh) 2021-07-30

Family

ID=64212169

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810350873.3A Active CN108846265B (zh) 2018-04-18 2018-04-18 一种程序加固方法及装置

Country Status (1)

Country Link
CN (1) CN108846265B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109739582B (zh) * 2018-12-12 2022-05-17 北京字节跳动网络技术有限公司 函数调用方法、装置、电子设备和计算机可读存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101887500A (zh) * 2010-06-10 2010-11-17 复旦大学 基于标签的程序控制流深度混淆方法
CN104166822A (zh) * 2013-05-20 2014-11-26 阿里巴巴集团控股有限公司 一种数据保护的方法和装置
CN105787305A (zh) * 2016-02-26 2016-07-20 西北大学 一种抵抗符号执行和污点分析的软件保护方法
CN106326694A (zh) * 2016-08-30 2017-01-11 北京鼎源科技有限公司 一种基于C源代码的混淆的Android应用加固方法
CN106960140A (zh) * 2016-01-08 2017-07-18 阿里巴巴集团控股有限公司 虚拟机指令的混淆方法及装置、虚拟机保护系统
CN107437005A (zh) * 2017-07-18 2017-12-05 广东工业大学 一种基于混沌不透明谓词的代码混淆方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8589897B2 (en) * 2008-08-26 2013-11-19 Apple Inc. System and method for branch extraction obfuscation

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101887500A (zh) * 2010-06-10 2010-11-17 复旦大学 基于标签的程序控制流深度混淆方法
CN104166822A (zh) * 2013-05-20 2014-11-26 阿里巴巴集团控股有限公司 一种数据保护的方法和装置
CN106960140A (zh) * 2016-01-08 2017-07-18 阿里巴巴集团控股有限公司 虚拟机指令的混淆方法及装置、虚拟机保护系统
CN105787305A (zh) * 2016-02-26 2016-07-20 西北大学 一种抵抗符号执行和污点分析的软件保护方法
CN106326694A (zh) * 2016-08-30 2017-01-11 北京鼎源科技有限公司 一种基于C源代码的混淆的Android应用加固方法
CN107437005A (zh) * 2017-07-18 2017-12-05 广东工业大学 一种基于混沌不透明谓词的代码混淆方法及装置

Also Published As

Publication number Publication date
CN108846265A (zh) 2018-11-20

Similar Documents

Publication Publication Date Title
US9146715B1 (en) Suppression of table of contents save actions
US9639377B2 (en) Method for linking and loading to protect applications
US20160070548A1 (en) Table of contents pointer value save and restore placeholder positioning
CN110414261B (zh) 一种数据脱敏方法、装置、设备及可读存储介质
CN106406972B (zh) 程序编译方法和编译器
KR20150024842A (ko) 적응식 이식가능 라이브러리
US20110167407A1 (en) System and method for software data reference obfuscation
CN105930694A (zh) 用于模糊虚拟机的灵活指令集
CN110673852B (zh) 一种基于编译器前端实现控制流平坦的方法、系统及设备
CN107632832A (zh) 一种面向dalvik字节码控制流混淆方法
CN108932407B (zh) 一种程序安全保护方法及装置
CN111796829A (zh) 小程序更新方法、装置、电子设备及计算机可读存储介质
CN108846265B (zh) 一种程序加固方法及装置
CN109543368B (zh) 一种基于中间语言解释器的跨平台源码虚拟化保护方法
US20090187897A1 (en) Compiling method and compiling program
CN113626773A (zh) 一种基于中间语言的代码保护方法
CN116431127A (zh) 一种低代码开发方法、系统、设备和可读存储介质
CN115794162A (zh) 一种用于在热更新时对差分更新进行优化的方法和装置
CN112114809A (zh) 一种程序代码安全防护方法、装置及存储介质
CN111310133A (zh) 脚本混淆方法及装置
CN109614773A (zh) 代码自修改方法、装置及电子设备
US11783013B2 (en) Protected processing of operations
CN114357389B (zh) 一种基于llvm的指令加花混淆方法及装置
CN110532577B (zh) 数字逻辑电路编译方法及装置
EP4270177A1 (en) Multi-level graph programming interfaces for controlling image processing flow on ai processing unit

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
GR01 Patent grant
GR01 Patent grant