CN101477608A - 一种防止软件中数据和代码被修改的加密方法 - Google Patents

一种防止软件中数据和代码被修改的加密方法 Download PDF

Info

Publication number
CN101477608A
CN101477608A CN 200810032265 CN200810032265A CN101477608A CN 101477608 A CN101477608 A CN 101477608A CN 200810032265 CN200810032265 CN 200810032265 CN 200810032265 A CN200810032265 A CN 200810032265A CN 101477608 A CN101477608 A CN 101477608A
Authority
CN
China
Prior art keywords
software
code
instruction
data
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN 200810032265
Other languages
English (en)
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.)
Individual
Original Assignee
Individual
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 Individual filed Critical Individual
Priority to CN 200810032265 priority Critical patent/CN101477608A/zh
Publication of CN101477608A publication Critical patent/CN101477608A/zh
Pending legal-status Critical Current

Links

Images

Abstract

一种防止软件中数据和代码被修改的加密方法,主要用于限制破解者传播它的破解。其原理是将要防破解的代码和数据存储在另一台安全的计算机上,在软件运行时,先对代码和数据进行变形处理,隐藏住其中的破解点后,再传给软件运行。可以广泛应用于网络软件中,防止对软件中代码和数据的修改或读取,解决软件被盗版、被使用第三方修改工具等损害开发者权益的问题。

Description

一种防止软件中数据和代码被修改的加密方法
技术领域:
属于软件加密/解密领域,是一种加密方法,用于防范对软件的破解。
背景技术:
计算机软件运行的原理
软件是用户需实现的功能的载体,其基本由两部分组成:代码和数据,代码的形式为计算机CPU能够识别的指令,指令运行过程中再使用软件中的数据。
软件一般使用高级编程语言编写,如C++,JAVA等,然后编译成CPU所能识别的指令。而其运行则由操作系统协助完成。软件的运行过程,是一个对操作系统的功能进行调用的过程。每个软件运行起来后,就是一个进程,操作系统将其能提供的系统功能,放置在进程的某地址位置,用户软件调用此位置使用系统功能。不同的计算机、不同的进程,其系统调用所处的位置是不一样的,软件需要在运行前知道这些位置。因此,一般在运行前,有一个加载的过程。此过程中,操作系统将软件拷贝到内存中,为其创建进程,并告之其系统调用的位置。不同的操作系统对此过程的实现不一样,但基本原理如此。
软件的编写一般以函数为最小的功能组织单位,一个函数表示一小块功能,调用1个函数就表示使用其功能。函数运行完后,返回到调用它的位置。在函数中可以调用其他的函数。函数调用是软件运行的基本方式,系统功能也是实现为函数的形式,供软件调用的。
在《软件加密技术内幕》中对WINDOWS环境下,软件的格式和加载过程进行了详细的描述。
软件的破解
为了维护自己的权益,软件开发者一般会在软件中施加某些限制。比如只能在一段时间内能使用,必须有License的用户才能使用等。为了保证平衡性,有时则需限制软件所提供的能力,如在游戏中,每个玩家的游戏角色所拥有的能力,根他目前的等级是相关的,不提供范围外的功能。
而破解者通过修改软件,则可以取得开发者允许范围外的权限。因为软件是由指令和数据组成的,如果明白了软件的原理。对其表示权限的数据进行修改,或者将其进行限制的指令去掉,都可以达到想要的功能。
破解软件所用的手法有两种:
静态分析,使用工具查看软件中指令和数据,了解软件的功能是如何实现的,各功能的代码位置。因为指令可以以汇编代码的方式进行查看,而且很多反汇编工具还能对整个软件的指令进行分析,汇总出软件的函数、系统调用、全局变量、字符号等信息。所以对了解软件的内部结构很有帮助。
动态分析,使用调试器跟踪软件运行的过程。由于调试器可以中断、单步软件的运行过程,查看软件运行时的寄存器、堆栈值的变化。所以对于理解软件的原理是必不可少的。
一般破解都是静态分析与动态分析相结合,具体破解的技术有很多,详细关于破解手法的详细介绍可参考《加密与解密》一书。
软件破解的传播
软件破解有一个特点:使用者不等于破解者。很多人使用破解了的软件,但会破解的人却是少数。需要破解者传播给他人,才能被大众所使用。如果不能传播,破解的软件只能自己使用,那么大部分的破解都将变得无用。
破解者传播的方式可以分为以下4种:
1.直接发布原软件的破解版,如著名网络聊天软件OICQ,就出了很多替代版本,如珊蝴虫QQ、木子QQ,它们可以去广告,显IP。
2.对于只有注册用户才能使用的软件,发布根据用户名计算注册码的工具,一般称为注册机。要写出注册机,先需分析出软件中验证密码的原理,然后写出的注册机能根据用户名算出注册码。
3.破解补丁,它会修改原软件的指令和代码,使成为破解版。这需要破解者先找出所有的需修改位置,然后将它们写在破解被丁中。
4.辅助工具,使用户能扩充原软件的功能,如网络游戏的外挂,它会伴随着网游客户端一起运行,提供给玩家原来他得不到的功能。如代替玩家游戏,提高玩家的攻击能力等。
对于特殊的加密方法,破解者会根据需要发布特殊的破解方法。但总体来说,对破解的传播就是使用软件来代替破解者本人,来对其他人的软件进行破解。
软件的加密
为了防止对软件的破解,开发者会对软件进行保护,最典型的就是加“壳”。壳是一种保护程序,软件加壳后,原来的指令和数据,会被加密存储。而运行时先启动的是壳的代码,壳先进行检查,确认没有被人在调试后,才对原软件的指令进行解密后运行。这是壳的一般原理。
除了加壳以外,还有很多其他的加密技术,比如使用加密狗,将关键的代码和数据存储在“狗”中,狗会运行其内的指令,完成要求的功能。而“狗”中的指令很难读出来,保护了关键的代码和数据。
详细的加密手法的详细介绍可参考《加密与解密》、《软件加密技术》二书。
虽然加密手法很多,但理论上讲所有的加密都是可以破解的。因为软件所有的内容都交给了用户,只要耐心的跟踪,总能找到破解所需的信息。只是时间的长短而以。
指令变形技术
软件中相同的功能,是可以使用不同的指令,或不同的指令顺序来实现的。举一个简单的例子,将数A的值赋给B,可以使用B=A这种指令,也可以使用C=A,B=C这种指令。变形是指改变实现功能所使用的指令,以对分析造成障碍。
指令变形可以分为两种:
1.对已有的指令进行变形。指对已有指令进行替换,对每条指令,换用另外一条或多条指令来实现相同的功能。
2.重新生成指令,一般需要一个类似编译器的指令生成器,内部存有代表功能的逻辑,可以反复的生成实现这些功能的指令,而且每次生成的指令都是不一样的。
指令生成器是指令变形的高级形式,因为它是根据逻辑来生成指令,可以在结构层上进行变形,可供选择的方式远比简单的替换指令为多。好的指令生成器,需要人读明白其生成的指令的内部逻辑后,才能判断两块代码实现的是相同的功能。
对指令的变形往往夹杂着往其中加入“花指令”的过程,花指令是指一些无用的指令,不实现任何功能,也不会影响原来的功能。在指令中加入花指令,可以影响对指令的反汇编和对它的分析。两种指令变形方式中都可以夹杂上花指令,以增强变形效果。
一般变形的目的是为了欺骗对指令进行分析的软件,因为如果指令是不变的,就可以通过搜索的方式找到。如杀毒软件的一个原理就是先收集病毒的代码,然后到软件中去搜索是否有此代码。如果对指令做了变形,就无法通过搜索的方式进行查找了。除非杀毒软件具备分析指令的能力,但用用软件去分析是很难的,对于第一种方式的变形,由于每种指令的替换指令不会很多,还可以进行分析,对第二种方式的变形,是无法用软件进行分析的。
要详细了解指令变形,需要了解指令系统的结构,可以阅读《intel architecture softwaredeveloper’s manual》介绍。另外还需参考其他详细介绍指令变形的资料。
参考资料:
以上介绍的背景技术是与本技术发明相关的技术,都与软件加密解密相关,因为每项技术都内容庞杂,因此只做了简单介绍。可通过阅读《加密与解密》、《软件加密技术》二书来了解详细的介绍,另外看雪认坛bbs.pediy.com是国内专业的软件加密论坛,在其中可找到所有相关技术的介绍。
《加密与解密》(第二版),ISBN7505386484,段钢编著,电子工业出版社。
《软件加密技术内幕》,ISBN9787121000980,看雪学院编著,电子工业出版社。
《intel architecture software developer’s manual》,Intel的开发手册,可网络下载。
发明内容:
软件的破解需要一个较长的分析过程,但其破解方法一般比较简单,可以归纳为3点:
1.修改某处的代码或数据。
2.读取某处数据的值。有些值是动态变化的,需要在运行的过程中进行读取。比如网络程序中,在进行加密通讯前,会先传输加密的密钥,这个密钥值就是需读取的。
3.调用原软件的函数。这种破解一般是发布辅助工具或原软件的代替品。在其中使用原软件的功能模块。如网络游戏中的外挂,就可以通过调用网游客户端的发包模块,向服务器发包。
本技术的目标是提高以上3点的强度。对于如何防范对代码的调用,是通过在原代码中加入检查运行动态特征的代码实现的。先介绍什么是检查运行动态特征。
通过背景技术介绍可知,软件的运行是一层层的函数调用,在调用一个函数前,会先在栈中压入返回位置。在函数未返回前,此位置一直存在。在一个底层函数中,通过检查上层函数的返回位置,和上层函数的代码,可以判断对自己的调用是否是可法的。这就是检查运行动态特征。具体说明如下:
在软件写好后,对于一个函数,有两个信息是可知的:
1.他的返回位置在栈中距离栈底的偏移。调用函数前,会在栈中压入返回位置,然后进入函数,函数再在栈中分配自己的局部变量空间,由于局部变量空间大小是固定的。因此返回位置距离栈底的相对偏移是可知的。
2.他会被哪些函数所调用,每个调用的返回位置是多少。
举例如函数A,它可能会被B、C、D调用,有3个返回位置B1、C1、D1。那么A检查栈中的返回位置,只能是B1、C1、D1其中之一。假设检测结果为B1,则只要保证A的代码未被修改,它在运行完后,必会返回到B1处。在本发明中,A的代码是经过变形的,它不会被修改,所以它必会返回到B1。
而函数B的返回位置的相对栈底偏移,也是可知的。则A再检查B的返回位置是否正确。假设检测结果为E1。只要B和被B调用的所有函数的代码未被修改,就可保证B运行完后,必会返回到E1。
依次向上层递推,在A中就可检查向上的每一层返回,一直到最上层的函数。检查函数代码是否被修改通过检查整个代码区是否被修改来实现,这样比较简单,不需统计每个函数所调用的其他函数。检查是否被修改可通过计算CRC校验来实现。
A保证了向上会返回到正确的函数后。如果有D想非法调用A,不论它是直接调用A,还是通过调用B、C或更上层函数来间接调用A,调用完成后,运行都不会返回到D中,软件的运行也必然会出现错误。因此无法进行非法调用。
检查栈中的函数返回位置,和检查上层函数的代码,称为检查运行动态特征。要理解它的意义需要熟悉软件运行时栈的使用原理,可参考此方面的资料。
介绍完什么是检查运行动态特征,返回到对本技术的介绍。
通过背景技术中软件破解的传播章节可知,破解分为两步:一是破解者手工破解自己手中的软件,二是破解者发布的破解软件自动破解其他用户的软件。
本技术主要针对第二步,使破解软件无法修改代码和数据,无法读取数据的值,无法调用代码。对于手工破解,则会增加它的难度。防范住了破解软件的修改,可以使软件破解无法传播,从而最大的减小破解造成的影响。
在背景技术中已提到,破解者发布的软件代替了他本人(以下简称破解软件),破解其他用户的软件。这些破解软件执行的是对软件的修改,不具备对软件进行分析的能力。本技术的核心原理是将要破解的部分做成变动的,没有固定的修改和读取方法。每次要破解它,都需要重新分析它。而破解软件因为不具备分析能力,所以无法破解。手工破解也需每运行一次就重新分析一次,增大其操作的繁杂程度。
发明内容如下:
1.将软件中要防止他人破解的代码和数据,从软件中提出出来,保存到另一台安全的计算机中。如软件A运行在网络上的一台计算机中,它可与计算机B通讯。A运行后,连接到B,下载其所需的代码H,在运行时对它进行调用。
2.代码H有两个特点:
a)在传输给A之前,H需先经过变形处理,以隐藏代码中的破解点。这是本技术的关键,因为变形后的代码需要重新分析,而破解软件很难具备分析能力。根据背景技术中的介绍,如果使用变形代码引擎,可达到软件无法分析的地步。
b)变形的代码中包括数据。并且对它们的位置和值进行了隐藏,如对它们进行加密。使破解软件无法找到这些数据,而H可以正确的使用。这样这些数据是无法被外部读取和修改的。
c)在H中会加入检查运行动态特征的代码,以保证只有A才能调用H。
软件的破解可归结为3个目标,此技术可防范此3目标:
1.修改软件的功能。通过对代码做变形处理的,使无法修改。
2.调用软件的功能。通过检查运行动态特征,使无法调用。
3.模仿软件的功能。通过变形,可防止对数据值的读取,如果这些值是在下传前新生成的。就会使功能的模仿因缺少关键数据而无法实现。
破解软件要破解本技术,必须具备分析变形代码,找出其中破解位置的能力。因此变形的强度决定了抗破解的能力。但本发明对于如何对代码做变形不做规定,只要变形能使破解者难以找到需读取和修改的代码和数据的位置,就是本发明可使用的变形技术。
本技术的实现难点为:
1.在代码中携带数据,并且使代码能正确的找到这些数据。
2.保证代码变形后,依然能在A中正常运行,比如要能正确的使用A中的数据,正确的调用A的系统功能。这需要A为H提供一些信息,如系统调用的位置。
对于目前已有的指令系统和操作系统,以上难点都是可以实现的。
代码H可以是起任意作用的代码,所以本技术的使用范围很广。如它可以是对通讯进行加密的算法,其中带有加密用的密钥,使外界无法假冒、篡改通讯。也可以是检查软件是否正在被调试,用户身份是否正确的代码。因为此块代码不会被破解,也可以将它作为整个软件安全的中心,与其他安全技术相结合。
使用本发明要求用户的计算机必须连接到另一台安全的计算机上,所以最好在网络软件中使用本发明。但随着目前网络技术的日益发展,不联网的电脑已很少了,所以有着广泛的应用范围。
附图说明:
附图是栈随软件软件运行而变化的示例图,用于帮助理解检查运行动态特征的意义。在图中软件当前运行在Current EIP位置,其栈的内容如图右边所示。
当运行到C1位置时,函数A将要返回。此时栈底将会到达P1位置,ret指令将会取出栈底值作为返回位置。然后将会转到B1位置去运行。而运行到C2时,栈底会升到P2位置,ret指令使运行转到E1位置。
此栈底位置的变化,是由函数中的代码控制的。只要代码未被修改,栈底就会必会如此变化。
具体实施方式:
由于本技术最好是在网络软件中使用。所以举例在网络游戏中如何使用本技术,以防范外挂。
网络游戏的外挂是一种游戏辅助工具,它会增强游戏用户的发包能力,使能发出不符合正常游戏逻辑的包。
根据外挂发送数据包的方法,可以将其为分3类:
1.调用客户端的发包模块发包
2.自行使用客户端的SOCKET发包
3.脱机挂,不需要客户端,完全自己与服务器交互
要防止外挂,就需要对客户端发往服务器的数据包进行加密,使外挂无法发包。为了保证加密的算法无法被破解,对此加密算法使用SessionSafe加密技术。实施过程如下:
1.在网络游戏服务器上构建一个指令生成器,其中存有很多的加密逻辑。
2.每个客户端连接到服务器以后,服务器要求指令生成器选择出一个加密算法,生成表示此算法的指令,并且生成一个密钥,携带在指令中一起发给客户端。服务器上存有此连接所使用的加密算法和密钥。下传的代码称为代码H。
3.客户端在发送数据前,调用代码H,对数据进行加密。再发送。
4.服务器知道每个连接所用的加密算法和密钥,可以解密数据包。
5.代码H在对数据加密的同时,会检查客户端的运行动态特征,确认代码是在客户端使用。
如此实施,可防范所有的3类外挂:
1.对运行动态特征的检查,防范外挂使用代码H。
2.加密的算法每个连接不同,外挂难以知道此算法。密钥也每次由服务器生成,外挂无法分析得到。所以外挂不能自行发包。

Claims (2)

1.一种防止软件中数据和代码被修改的加密方法是一项提高软件会被破解部分抗破解强度的加密技术,其特征是:将要防止破解的代码和数据存储在另外一台安全的计算机上,在软件运行时,先对代码和数据进行变形处理,隐藏住其中的破解点,再传给软件运行。
2.根据权利要求1所述的变形后再传输的代码,其特征是:在其中加入了检查软件运行动态特征的代码。
CN 200810032265 2008-01-04 2008-01-04 一种防止软件中数据和代码被修改的加密方法 Pending CN101477608A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 200810032265 CN101477608A (zh) 2008-01-04 2008-01-04 一种防止软件中数据和代码被修改的加密方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 200810032265 CN101477608A (zh) 2008-01-04 2008-01-04 一种防止软件中数据和代码被修改的加密方法

Publications (1)

Publication Number Publication Date
CN101477608A true CN101477608A (zh) 2009-07-08

Family

ID=40838319

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 200810032265 Pending CN101477608A (zh) 2008-01-04 2008-01-04 一种防止软件中数据和代码被修改的加密方法

Country Status (1)

Country Link
CN (1) CN101477608A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104063635A (zh) * 2014-07-02 2014-09-24 北京深思数盾科技有限公司 目标文件的保护方法及保护系统
CN105677318A (zh) * 2015-12-28 2016-06-15 心动网络股份有限公司 一种防止游戏被内存修改器修改的方法
CN107368713A (zh) * 2017-07-28 2017-11-21 北京深思数盾科技股份有限公司 保护软件的方法和安全组件

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104063635A (zh) * 2014-07-02 2014-09-24 北京深思数盾科技有限公司 目标文件的保护方法及保护系统
CN104063635B (zh) * 2014-07-02 2017-09-29 北京深思数盾科技股份有限公司 目标文件的保护方法及保护系统
CN105677318A (zh) * 2015-12-28 2016-06-15 心动网络股份有限公司 一种防止游戏被内存修改器修改的方法
CN107368713A (zh) * 2017-07-28 2017-11-21 北京深思数盾科技股份有限公司 保护软件的方法和安全组件
CN107368713B (zh) * 2017-07-28 2019-07-19 北京深思数盾科技股份有限公司 保护软件的方法和安全组件

Similar Documents

Publication Publication Date Title
EP2398182B1 (en) A device and a method for generating software code
Egele et al. An empirical study of cryptographic misuse in android applications
US20170116410A1 (en) Software protection
CN100342296C (zh) 基于可信计算模块芯片实现计算机软件防盗版的方法
US20090249492A1 (en) Fabrication of computer executable program files from source code
CN104318135B (zh) 一种基于可信执行环境的Java代码安全动态载入方法
TWI420339B (zh) 軟體授權系統及方法
CN101305333A (zh) 防篡改可信任虚拟机
EP2064648A1 (en) Fabrication of computer executable program files from source code
CN102576391A (zh) 嵌入在shell代码中的软件许可
Falcarin et al. Exploiting code mobility for dynamic binary obfuscation
CN103198239A (zh) 经由在线服务器的内容保护和安全操作系统中的代码执行
Cappaert Code obfuscation techniques for software protection
Schlögl et al. eNNclave: Offline inference with model confidentiality
CN101477608A (zh) 一种防止软件中数据和代码被修改的加密方法
US20120278883A1 (en) Method and System for Protecting a Computing System
Li et al. Trusting computing as a service for blockchain applications
EP2674891A1 (en) A method, a device and a computer program support for execution of encrypted computer code
Yuan et al. Secure integrated circuit design via hybrid cloud
Islam et al. Trojan bio-hacking of DNA-sequencing pipeline
Nolan Bulletproof Android: practical advice for building secure apps
US20240104194A1 (en) Method for associating an executable software program with a computing platform
JP2005266887A (ja) プログラム難読化装置、プログラム配布システム、コンピュータプログラム
EP3937449A1 (en) Method for remotely programming a programmable device
WO2017016087A1 (zh) 一种生成随机布局程序的方法及装置

Legal Events

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

Open date: 20090708