CN108932407B - 一种程序安全保护方法及装置 - Google Patents
一种程序安全保护方法及装置 Download PDFInfo
- Publication number
- CN108932407B CN108932407B CN201810493964.2A CN201810493964A CN108932407B CN 108932407 B CN108932407 B CN 108932407B CN 201810493964 A CN201810493964 A CN 201810493964A CN 108932407 B CN108932407 B CN 108932407B
- Authority
- CN
- China
- Prior art keywords
- function
- called
- index
- column
- row
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 63
- 230000006870 function Effects 0.000 claims abstract description 728
- 238000012545 processing Methods 0.000 claims description 31
- 238000004590 computer program Methods 0.000 claims description 16
- 230000008569 process Effects 0.000 description 23
- 238000010586 diagram Methods 0.000 description 11
- 230000014509 gene expression Effects 0.000 description 11
- 238000012216 screening Methods 0.000 description 8
- 238000012986 modification Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 238000012546 transfer Methods 0.000 description 4
- 238000007596 consolidation process Methods 0.000 description 3
- 230000002787 reinforcement Effects 0.000 description 3
- 238000013461 design Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 239000000969 carrier Substances 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003014 reinforcing effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000008685 targeting Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
Images
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)
- Storage Device Security (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种程序安全保护方法及装置,该方法包括:从用户编辑的源程序文件中获取M个被调函数;建立包含M个被调函数的函数查找表,M为大于1的整数;将M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从函数查找表中获得当前被调函数;生成与新的程序文件对应的可执行程序文件。
Description
技术领域
本发明涉及软件开发技术领域,尤其涉及一种程序安全保护方法及装置。
背景技术
高级语言编写的源程序文件经过编译变成可执行程序文件,用于机器执行,而反编译是其逆过程,可以将可执行程序文件通过反编译得到可读的源程序文件。计算机软件反向工程(Reversepengineering)也称为计算机软件还原工程,就是指通过对他人软件的可执行程序文件进行“逆向分析、研究”等工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,从而作为自己开发软件时的参考,或者直接用于自己的软件产品中。
因此,用户所自主开发的软件产品很容易被竞争对手通过计算机软件反向工程,反编译而知晓该软件产品所使用的思路、原理、结构、算法、处理过程、运行方法,导致软件产品被模仿,甚至盗取。因此,目前的软件产品的安全性不高。
发明内容
本发明实施例提供一种程序安全保护方法及装置,解决了软件产品的安全性不高的技术问题。
第一方面,本发明实施例提供了一种程序安全保护方法,包括:
从用户编辑的源程序文件中获取M个被调函数;
建立包含所述M个被调函数的函数查找表,M为大于1的整数;
将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
生成与所述新的程序文件对应的可执行程序文件。
可选的,所述建立包含所述M个被调函数的函数查找表,包括:
以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
在所述函数查找表的每列,建立对该列所在的被调函数的索引。
可选的,所述从用户编辑的源程序文件中获取M个被调函数,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
可选的,所述在所述函数查找表的每列,建立对该列所在的被调函数的索引,包括:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数。
可选的,所述对每个所述被调函数分配列索引,包括:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
可选的,所述对所述函数查找表中当前列的被调函数建立行索引,包括:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
可选的,所述对当前列的被调函数建立N级行索引,包括:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
可选的,在所述将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令之后,还包括:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
第二方面,本发明实施例提供一种程序安全保护装置,包括:
函数获取单元,用于从用户编辑的源程序文件中获取M个被调函数;
查找表建立单元,用于建立包含所述M个被调函数的函数查找表,M为大于1的整数;
指令替换单元,用于将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
文件生成单元,用于生成与所述新的程序文件对应的可执行程序文件。
可选的,所述查找表建立单元,包括:
建表子单元,用于以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
建索引子单元,用于在所述函数查找表的每列,建立对该列所在的被调函数的索引。
可选的,所述函数获取单元,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
可选的,所述建索引子单元,具体用于:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数。
可选的,所述建索引子单元,具体用于:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
可选的,所述建索引子单元,具体用于:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
可选的,所述建索引子单元,具体用于:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
可选的,还包括查表指令处理单元,用于:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
第三方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面中任一可能的实现方式所述的步骤。
第四方面,本发明实施例提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面中任一可能的实现方式所述的步骤。
本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
通过从用户编辑的源程序文件中获取M个被调函数;建立包含M个被调函数的函数查找表,将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,查表操作指令用于从函数查找表中获得当前被调函数;生成与新的程序文件对应的可执行程序文件。将直接的函数调用指令变成了对被调函数在函数查找表中的查表操作指令,能够将程序中的函数调用完全隐藏在表中,使得最后生成的可执行程序文件中不再是直接的函数调用,而是需要查表才能得到被调函数,以此实现了查表调用函数。而这种查表调用函数的方式,使得逆向工程师很难从反编译可执行程序文件得到程序中看出真实的调用函数,从而提高了逆向难度,进而提高了软件产品的安全性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的程序安全保护方法的流程图;
图2为本发明实施例提供的程序保护装置的程序模块图;
图3为本发明实施例提供的计算机设备的结构框图。
具体实施方式
本发明实施例通过提供一种程序安全保护方法及装置,解决了软件产品的安全性不高的技术问题,总体思路如下:
从用户编辑的源程序文件中获取M个被调函数;建立包含M个被调函数的函数查找表,将M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,查表操作指令用于从函数查找表中获得当前被调函数;生成与新的程序文件对应的可执行程序文件。
通过上述技术方案,将直接的函数调用指令变成了对被调函数在函数查找表中的查表操作指令,能够将程序中的函数调用完全隐藏在表中,使得最后生成的可执行程序文件中不再是直接的函数调用,而是需要查表才能得到被调函数,以此实现了查表调用函数。而这种查表调用函数的方式,使得逆向工程师很难从反编译可执行程序文件得到程序中看出真实的调用函数,从而提高了逆向难度,进而提高了软件产品的安全性。
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。需要说明的是,在不冲突的前提,本发明实施例提供的各个实施例可以相互结合。
用户编辑的源程序文件经过编译步骤和链接步骤生成可执行程序文件。需要说明的是,本发明实施例提供的步骤S101~S104正是应用于对源程序文件进行的编译步骤中,因此,在对源程序文件所进行的编译步骤中,除了本发明所给出的步骤,所需要进行的其他处理细节均可以参考现有技术,为了说明书的简洁,本文不进行赘述。
参考图1所示,本发明实施例提供的程序安全保护方法,包括如下步骤:
步骤S101:从用户编辑的源程序文件中获取M个被调函数。
具体的,通过扫描源程序文件获取该源程序文件中的M个被调函数。获取该源程序文件中的M个被调函数,可以是:获取源程序文件中存在的每个被调函数或者满足预设条件的被调函数。
就满足预设条件的被调函数而言,可以是获取源程序文件中用户自定义的被调函数,或者,获取源程序文件中属于库函数的被调函数,或者属于预设名单的被调函数。
步骤S102、建立包含所述M个被调函数的函数查找表,M为大于1的整数。
在具体实施过程中,可以是将用户编辑的源程序导入程序加固工具中,由程序加固工具建立函数查找表。
函数查找表具体为M列*N行的函数查找表,N为大于1的整数。
需要说明的是,函数查找表的列数根据从源程序文件中所获取的被调函数的数量确定,而函数查找表的行数至少为两行,因为在函数查找表的行数高度超过1时,分析出每一个真实调用的目标函数难度更高。
在具体实施过程中,步骤S102的实现过程为:以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;在所述函数查找表的每列,建立对该列所在的被调函数的索引。
具体来讲,将每一个被调函数对应存放在函数查找表的一列,从而,函数查找表的每一列对应用于:一个主调函数对一个被调函数进行调用的被调函数查找。举例来讲,从源程序文件中获取2个被调函数,则建立的函数查找表为2列,比如,main()函数依次调用for()函数和bar()函数,则函数查找表为两列,一列针对for()函数的调用,另一列针对bar()函数的调用。
在具体实施过程中,建立对该列所在的被调函数的索引,可以有多种实施方式:
可以是:直接为每个被调函数随机分配一个索引值,形成被调函数与索引值之间的一对一的直接索引关系,基于索引值直接查找到被调函数。而索引值可以为int值,比如,索引值为随机数1,对应被调函数A;索引值为随机数2,对应被调函数B。但是,这种方式被逆向的难度较低,为了提高逆向难度,可以基于如下流程实现:
步骤1:对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在函数查找表的所在列。
具体来讲,在步骤1中,随机为每个被调函数分配作为列索引的整数值int。对每个被调函数的列索引进行加密处理,得到每个被调函数的加密列索引;构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与所述加密列索引对应的作为列索引的整数值。
具体的,可以是基于任何一种哈希加密算法对列索引进行加密处理,而第一解密函数是基于对应的哈希解密算法实现。
在步骤1之后,接着执行步骤2:在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数。
在步骤2中,对所述函数查找表中当前列的被调函数建立行索引,具体可以是:对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。行索引的级数与函数查找表的行数相同。
需要说明的是,根据列索引对应的查表结果为第一级行索引,根据第一级行索引的查表结果为第二级级索引,基于第二级行索引进行查找,得到再下一行的行索引,依次进行,直到得到最后一行的查表结果,即:得到隐藏在最后一行的被调函数。
在具体实施过程中,为了提高逆向难度,对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
通过上述步骤1~2,每一次通过查表函数table()的查表操作能够查到被调函数处于函数查找表的对应列、以及下一行的行索引,直到查找到函数查找表当前列的最后一行,而真正的被调函数正是隐藏在函数查找表的最后一行。
具体的,可以是基于任何一种哈希加密算法对行索引进行加密处理,而第二解密函数是基于对应的哈希解密算法实现。
通过对行索引的加解密,基于列索引并不能直接得到下一行的行索引,而需要基于对应的哈希解密算法才能得到下一行的行索引,进而才能得到最后一行的行索引,进而才能得到被调函数,实现查表调用函数。
在步骤S102之后,接着执行步骤S103:将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数。
需要说明的是,查表操作指令为利用查表函数table()的指令。具体的,查表操作指令所用的查表函数table(),由于步骤S102进行了至少一次的索引加密/解密处理,使得查表操作指令所用的查表函数table()并不是直接通过索引值对应每一个函数调用,以增加了查表函数本身的逆向难度。
为了进一步增加逆向难度,除函数查找表的第一行与最后一行之外,中间行的查表操作指令处理为查表函数本身的递归调用,或者多个查表函数之间的相互递归调用。实现过程具体为:将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
下面,以源程序文件中包括如下函数调用为例:main(){foo();bar();},对步骤S101~S103的实现过程进行举例说明,建立的函数查找表包括两列,一列为对foo()函数的索引,另一列为对bar()函数的索引。
为foo()函数分配随机int值并加密该随机int值,得到加密列索引为encode_rand_1,为foo()函数分配随机int值并加密该随机int值,得到加密列索引为encode_rand_2。在需要调用foo()函数时,基于列索引encode_rand_1能够索引到foo()函数所在列为函数查找表的第一列,在需要调用bar()函数时,基于列索引encode_rand_2能够索引到bar()函数所在列为函数查找表的第二列。以及建立foo()函数和bar()函数的行索引。
将原始的函数调用指令{foo();bar();}替换用于在函数查找表查找的查表操作指令,具体为:{table(encode_rand_1);table(encode_rand_2);}
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
基于上述实现过程,最后得到新的程序如下:
而建立的函数查找表如下:
index_1_1—>encoded_index_2_1 | index_1_2—>encoded_index_2_2 |
index_2_1—>foo() | index_2_2—>bar() |
在步骤S103之后,接着执行步骤S104、生成所述新的程序文件对应的可执行程序文件。
具体来讲,通过链接步骤生成与所述新的程序对应的可执行程序文件。
需要说明的是,本发明实施例提供的技术方案,可以应用于白盒加固工具对程序进行加固的场景下,白盒加固工具为相对于黑盒加固工具而言的一种对程序进行测试、加固的工具,白盒加固工具具体是在将用户编辑的源程序处理为可执行程序文件过程中进行的,这里的可执行程序文件即二进制文件(Binary)。而黑盒是对已经形成的可执行程序文件在此处理为可执行程序文件的过程中所进行的程序测试、加固过程。
还需要说明的是,本发明实施例提供的如上技术方案,可以应用于多种平台下软件产品(可执行程序文件)的生成:基于安卓操作***的ELF文件,基于苹果手机操作***的应用程序,苹果电脑操作***的应用程序,基于Linux***的软件和加载的库文件,Windows操作***的可执行程序和DLL(Dynamic Link Library,动态链接库)文件。需要说明的是,本发明实施例提供的如上技术方案,可基于如下执行集类型:X86、X86_64、ARM、ARM64。
进一步的,为了进一步增加逆向难度,从而增加程序安全性,本发明实施例在前述实施过程的前提下,在获得新的程序之前,包括如下步骤:
首先,执行步骤A1:从用户编辑的源程序文件中确定N个目标函数,所述源程序文件至少由N个函数组成,N为大于1的整数。
需要说明的是,用户编辑的源程序文件具体指用户按照一定的程序设计语言规范书写的最原始程序的未经编译的代码,源程序文件为可读的文本文件。通常由高级语言编写,比如:C语言、C++语言、Java语言等,源程序文件可以是以书籍或者磁带或者其他载体的形式出现,但最为常用的格式是文本文件。并且,源程序文件中的函数是一个自我包含的完成一定相关功能的一系列指令。
具体的,用户编辑的源程序文件由多个函数组成,可以包括函数库中的函数、还可以包括用户自定义的函数。源程序文件包括主函数以及各个子函数,无论是主函数还是子函数,每个函数具有各自的函数名。
具体的,步骤A1具体为:对用户编辑的源程序文件进行扫描,得到源程中存在的全部函数,则通过扫描源程序文件中的全部函数,均确定为目标函数。
步骤A1具体为:确定源程序文件中的全部函数,从源程序文件的全部函数中筛选出一个或者多个函数,确定为目标函数。在具体实施过程中,可以有多种筛选规则,进行举例说明:
筛选规则一:预先建立一个函数名单,函数名单中写有可以确定为目标函数的函数名。步骤A1具体为:对源程序文件进行扫描,得到源程中存在的全部函数的函数名,判断源程中存在的每个函数的函数名是否在函数名单中,如果存在于函数名单中,则确定为目标函数,否则不是目标函数。
具体的,在函数名单为一些完成特定功能的函数的函数名,从而能够更有针对性进行函数调用混淆。
筛选规则二:随机从源程序文件的全部函数中筛选出多个函数,各自确定为目标函数。
筛选规则三:确定源程序文件中的全部函数,从源程序文件的全部函数中筛选出有函数调用的函数,确定为目标函数。
在步骤A1之后,接着执行步骤A2:在所述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{对其他函数的调用};
当然,在具体实施过程中,条件调用语句也可以为其他形式,源程序文件的编程语言不同,则使用的条件调用语句也可以不同。
在步骤A2之后,接着执行步骤A3:在每个所述目标函数的不可达分支中添加该目标函数对其他函数的调用,得到新的程序,所述其他函数属于所述源程序文件。
需要说明的是,其他函数是针对该目标函数而言,其他函数具体是与该目标函数的条件调用语句的可达分支中所调用的函数不同的函数,针对该目标函数的其他函数可以包括该目标函数,即调用该目标函数自身。
举例来讲,源程序文件包括函数A、函数A调用函数B和函数C,函数B调用函数D、函数D调用函数E,在目标函数A的条件调用语句的可达分支中存在真实函数调用为:调用函数B和函数C,将对函数B、C的调用移动至该目标函数A的条件调用语句的可达分支中。在该目标函数A的条件调用语句的不可达分支中,可以添加对函数D、函数E中的一个或者多个的调用。
具体的,在步骤A3中,在每个所述目标函数的不可达分支中添加所述目标函数对其他函数的调用,可以有多种实施方式,下面进行分别描述:
实施方式一:
对每个所述目标函数分别执行如下步骤:在所述目标函数的条件调用语句的不可达分支中,添加所述目标函数对其他函数的随机调用。
具体而言,在该目标函数的条件调用语句的可达分支中,添加该目标函数对该可达分支中所调用函数不同的各个函数的随机调用。
举例来讲,源程序文件包括函数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)。
因为不可达分支中的指令并不会被执行到,因此,在不可达分支中写入的针对所述候选被调函数的传递参数可以随机生成,而不影响程序本身的功能。
基于同一发明构思,本发明实施例提供了一种程序安全保护装置,参考图2所示,包括:
函数获取单元201,用于从用户编辑的源程序文件中获取M个被调函数;
查找表建立单元202,用于建立包含所述M个被调函数的函数查找表,M为大于1的整数;
指令替换单元203,用于将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
文件生成单元204,用于生成与所述新的程序文件对应的可执行程序文件。
在一具体的实施方式中,所述查找表建立单元202,包括:
建表子单元,用于以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
建索引子单元,用于在所述函数查找表的每列,建立对该列所在的被调函数的索引。
在一具体的实施方式中,所述函数获取单元201,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
在一具体的实施方式中,所述建索引子单元,具体用于:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数。
在一具体的实施方式中,所述建索引子单元,具体用于:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
在一具体的实施方式中,所述建索引子单元,具体用于:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
在一具体的实施方式中,所述建索引子单元,具体用于:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
在一具体的实施方式中,还包括查表指令处理单元,用于:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
基于同一发明构思,作为对上述方法的实现,本发明实施例提供一种计算机设备30,图3为本发明实施例中的计算机设备30的结构示意图,参见图3所示,该计算机设备30包括:存储器301、处理器302以及存储在存储器301上并可在处理器302上运行的计算机程序303,处理器执行程序303时实现前述程序保护方法实施例中的任一实施方式所述的步骤。
基于同一发明构思,本发明实施例提供一种计算机存储介质,其上存储有计算机程序,上述指令可由图3所示的该计算机设备30的处理器302执行以完成上述方法。所述计算机存储介质具体为非临时性计算机可读存储介质,具体可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
上述本发明实施例中的技术方案,至少具有如下的技术效果或优点:
通过从用户编辑的源程序文件中获取M个被调函数;建立包含M个被调函数的函数查找表,将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,查表操作指令用于从函数查找表中获得当前被调函数;生成与新的程序文件对应的可执行程序文件。将直接的函数调用指令变成了对被调函数的查表操作指令,能够将程序中的函数调用关系完全隐藏在表中,逆向工程师很难根据反编译的程序中看出真实的函数调用,从而提高了逆向每一个真实的调用函数的难度,进而提高了软件产品的安全性。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
本发明公开了一种A1、一种程序安全保护方法,包括:
从用户编辑的源程序文件中获取M个被调函数;
建立包含所述M个被调函数的函数查找表,M为大于1的整数;
将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
生成与所述新的程序文件对应的可执行程序文件。
A2、如A1所述的程序安全保护方法,所述建立包含所述M个被调函数的函数查找表,包括:
以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
在所述函数查找表的每列,建立对该列所在的被调函数的索引。
A3、如A2所述的程序安全保护方法,所述从用户编辑的源程序文件中获取M个被调函数,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
A4、如A2或A3所述的程序安全保护方法,所述在所述函数查找表的每列,建立对该列所在的被调函数的索引,包括:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数。
A5、如A4所述的程序安全保护方法,所述对每个所述被调函数分配列索引,包括:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
A6、如A4所述的程序安全保护方法,所述对所述函数查找表中当前列的被调函数建立行索引,包括:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
A7、如A6所述的程序安全保护方法,所述对当前列的被调函数建立N级行索引,包括:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
A8、如A2或A3所述的程序安全保护方法,在所述将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令之后,还包括:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
本发明还公开一种B9、一种程序安全保护装置,包括:
函数获取单元,用于从用户编辑的源程序文件中获取M个被调函数;
查找表建立单元,用于建立包含所述M个被调函数的函数查找表,M为大于1的整数;
指令替换单元,用于将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
文件生成单元,用于生成与所述新的程序文件对应的可执行程序文件。
B10、如B9所述的程序安全保护装置,所述查找表建立单元,包括:
建表子单元,用于以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
建索引子单元,用于在所述函数查找表的每列,建立对该列所在的被调函数的索引。
B11、如A10所述的程序安全保护装置,所述函数获取单元,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
B12、如B10或B11所述的程序安全保护装置,所述建索引子单元,具体用于:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数。
B13、如B12所述的程序安全保护装置,所述建索引子单元,具体用于:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
B 14、如B 12所述的程序安全保护装置,所述建索引子单元,具体用于:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
B 15、如B 14所述的程序安全保护装置,所述建索引子单元,具体用于:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
B16、如B10或B11所述的程序安全保护装置,还包括查表指令处理单元,用于:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
本发明还公开了C17、一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现A1-A8中任一项所述的步骤。
本发明还公开了D18、一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现A1-A8中任一项所述的步骤。
Claims (12)
1.一种程序安全保护方法,其特征在于,包括:
从用户编辑的源程序文件中获取M个被调函数;
建立包含所述M个被调函数的函数查找表,M为大于1的整数;
将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
生成与所述新的程序文件对应的可执行程序文件;
所述建立包含所述M个被调函数的函数查找表,包括:
以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
在所述函数查找表的每列,建立对该列所在的被调函数的索引;
所述在所述函数查找表的每列,建立对该列所在的被调函数的索引,包括:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数;
所述对所述函数查找表中当前列的被调函数建立行索引,包括:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
2.如权利要求1所述的程序安全保护方法,其特征在于,所述从用户编辑的源程序文件中获取M个被调函数,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
3.如权利要求1所述的程序安全保护方法,其特征在于,所述对每个所述被调函数分配列索引,包括:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
4.如权利要求1所述的程序安全保护方法,其特征在于,所述对当前列的被调函数建立N级行索引,包括:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
5.如权利要求1或2所述的程序安全保护方法,其特征在于,在所述将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令之后,还包括:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
6.一种程序安全保护装置,其特征在于,包括:
函数获取单元,用于从用户编辑的源程序文件中获取M个被调函数;
查找表建立单元,用于建立包含所述M个被调函数的函数查找表,M为大于1的整数;
指令替换单元,用于将所述M个被调函数中每个被调函数的函数调用指令均替换为查表操作指令,以使获得新的程序文件,所述查表操作指令用于从所述函数查找表中获得当前被调函数;
文件生成单元,用于生成与所述新的程序文件对应的可执行程序文件;
所述查找表建立单元,包括:
建表子单元,用于以单个所述被调函数对应所述函数查找表的一列,建立包含M列*N行的函数查找表,N为大于1的整数;
建索引子单元,用于在所述函数查找表的每列,建立对该列所在的被调函数的索引;
所述建索引子单元,具体用于:
对每个所述被调函数分配列索引,所述列索引用于确定所述被调函数在所述函数查找表的所在列;
在每个所述被调函数的列索引下,对所述函数查找表中当前列的被调函数建立行索引,所述行索引用于在所述函数查找表中当前列获取所述被调函数;
所述建索引子单元,具体用于:
对当前列的被调函数建立N级行索引,其中,当前行的行索引为上一行的查表结果,最后一级行索引对应的查表结果为当前列的被调函数。
7.如权利要求6所述的程序安全保护装置,其特征在于,所述函数获取单元,包括:
通过扫描所述源程序文件,获取所述源程序文件中存在的每个被调函数,或者满足预设条件的被调函数。
8.如权利要求6所述的程序安全保护装置,其特征在于,所述建索引子单元,具体用于:
随机为每个所述被调函数分配作为列索引的整数值;
对每个所述被调函数的列索引进行加密处理,得到每个所述被调函数的加密列索引;
构建针对每个所述加密列索引的第一解密函数,所述第一解密函数用于解密每个所述加密列索引,得到与加密列索引对应的列索引。
9.如权利要求6所述的程序安全保护装置,其特征在于,所述建索引子单元,具体用于:
对所述N级行索引中的一个或者多个行索引进行加密处理,得到对应的加密行索引;
构建针对每个所述加密行索引的第二解密函数,所述第二解密函数用于解密每个所述加密行索引,得到对应的行索引。
10.如权利要求6或7所述的程序安全保护装置,其特征在于,还包括查表指令处理单元,用于:
将对应所述函数查找表中间行的查表操作指令处理为该查表操作指令中查表函数的递归调用;或者
将对应所述函数查找表中间行的查表操作指令处理为多个查表操作指令中查表函数的相互递归调用。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-5中任一项所述的步骤。
12.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1-5中任一项所述的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810493964.2A CN108932407B (zh) | 2018-05-22 | 2018-05-22 | 一种程序安全保护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810493964.2A CN108932407B (zh) | 2018-05-22 | 2018-05-22 | 一种程序安全保护方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108932407A CN108932407A (zh) | 2018-12-04 |
CN108932407B true CN108932407B (zh) | 2022-01-25 |
Family
ID=64449188
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810493964.2A Active CN108932407B (zh) | 2018-05-22 | 2018-05-22 | 一种程序安全保护方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108932407B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109918872B (zh) * | 2019-01-28 | 2021-06-29 | 中国科学院数据与通信保护研究教育中心 | Android应用加固方法 |
CN110717150A (zh) * | 2019-10-08 | 2020-01-21 | 北京顶象技术有限公司 | 代码保护方法、装置、保护设备及可读存储介质 |
CN113791838B (zh) * | 2021-08-20 | 2024-04-23 | 深圳市元征科技股份有限公司 | 一种程序文件调用方法、装置以及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103186730A (zh) * | 2013-03-26 | 2013-07-03 | 北京深思数盾科技有限公司 | 保护.net软件安全的方法和设备 |
CN103246848A (zh) * | 2013-03-26 | 2013-08-14 | 北京深思数盾科技有限公司 | 保护软件安全的方法和设备 |
CN106934298A (zh) * | 2017-03-06 | 2017-07-07 | 戴林 | 一种通用数据库透明加密*** |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1230744C (zh) * | 2002-08-16 | 2005-12-07 | 华为技术有限公司 | 一种嵌入式***软件补丁的实现和控制方法 |
CN103309683B (zh) * | 2012-03-07 | 2016-08-03 | 京信通信***(中国)有限公司 | 硬件设备的软件补丁嵌入方法及装置 |
CN103559450B (zh) * | 2013-10-11 | 2016-01-13 | 南京邮电大学 | 一种基于内核驱动钩子技术的电子标签数据保护方法 |
-
2018
- 2018-05-22 CN CN201810493964.2A patent/CN108932407B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103186730A (zh) * | 2013-03-26 | 2013-07-03 | 北京深思数盾科技有限公司 | 保护.net软件安全的方法和设备 |
CN103246848A (zh) * | 2013-03-26 | 2013-08-14 | 北京深思数盾科技有限公司 | 保护软件安全的方法和设备 |
CN106934298A (zh) * | 2017-03-06 | 2017-07-07 | 戴林 | 一种通用数据库透明加密*** |
Also Published As
Publication number | Publication date |
---|---|
CN108932407A (zh) | 2018-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102132289B (zh) | 用于代码迷惑的方法及设备 | |
CN108932407B (zh) | 一种程序安全保护方法及装置 | |
CN110598379B (zh) | 一种实现字符串混淆的方法、设备及存储介质 | |
CN105022936A (zh) | 一种类class文件加密解密方法和装置 | |
KR101861341B1 (ko) | 애플리케이션 코드의 역난독화 장치 및 이를 이용한 애플리케이션 코드의 역난독화 방법 | |
CN107632832B (zh) | 一种面向dalvik字节码控制流混淆方法 | |
CN112839036B (zh) | 基于拟态防御理论的软件运行环境生成方法及*** | |
US11119741B2 (en) | Compiling device and method | |
CN108134673A (zh) | 一种生成白盒库文件的方法及装置 | |
CN111324591B (zh) | 区块链分叉的检测方法及相关装置 | |
CN112434266A (zh) | 一种shellcode控制流扁平化混淆方法 | |
CN114611074A (zh) | Solidity语言源代码混淆方法、***、设备及存储介质 | |
CN113031967B (zh) | 一种代码转换方法及装置 | |
JP6919973B2 (ja) | プログラムコードのコンピュータ支援難読化方法 | |
CN113626773B (zh) | 一种基于中间语言的代码保护方法 | |
JP2021530057A (ja) | マスク関数を用いるコンパイラデバイス | |
JP2017509942A (ja) | 暗号アルゴリズムで使用されるときに秘密データを保護する方法 | |
CN117093964A (zh) | 一种源代码的加密方法、装置、存储介质及电子设备 | |
US10140436B1 (en) | Program obfuscation by reorganizing execution paths | |
CN107506644B (zh) | 动态生成代码中隐式常数威胁的安全保护方法 | |
CN108846265B (zh) | 一种程序加固方法及装置 | |
CN112115428B (zh) | 代码文件的混淆方法、装置、电子设备和存储介质 | |
CN111428209B (zh) | 一种应用程序的混淆方法、装置及存储介质 | |
CN113946804B (zh) | 一种源代码的混淆方法和装置 | |
CN105095698A (zh) | 基于最近执行的程序代码的程序代码模糊处理 |
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 |