CN103198240A - 一种用于保护代码安全的方法和装置 - Google Patents
一种用于保护代码安全的方法和装置 Download PDFInfo
- Publication number
- CN103198240A CN103198240A CN2012103764959A CN201210376495A CN103198240A CN 103198240 A CN103198240 A CN 103198240A CN 2012103764959 A CN2012103764959 A CN 2012103764959A CN 201210376495 A CN201210376495 A CN 201210376495A CN 103198240 A CN103198240 A CN 103198240A
- Authority
- CN
- China
- Prior art keywords
- code
- code function
- function
- local
- precompile
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Storage Device Security (AREA)
Abstract
本发明的实施方式提供了一种用于保护代码安全的方法。该方法包括:将一个或多个IL代码函数预编译为本地代码;在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;将经过预编译的所述一个或多个IL代码函数删除;在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。通过将以特定字符为标志的汇编代码段删除,本发明的方法使得本地代码能够在Windows操作系统下运行,进而使利用本地代码保护代码安全得到广泛应用。此外,本发明的实施方式提供了一种用于保护代码安全的装置。
Description
技术领域
本发明的实施方式涉及软件开发领域,更具体地,本发明的实施方式涉及一种适用于保护代码安全的方法和装置。
背景技术
本部分旨在为权利要求书中陈述的本发明的实施方式提供背景或上下文。此处的描述可包括可以探究的概念,但不一定是之前已经想到或者已经探究的概念。因此,除非在此指出,否则在本部分中描述的内容对于本申请的说明书和权利要求书而言不是现有技术,并且并不因为包括在本部分中就承认是现有技术。
在软件开发领域,如何保护程序代码的安全一直是人们所关注的问题。如果不对程序代码进行必要的保护措施,借助于一些第三方工具,就能轻而易举的获取程序代码,容易被破解和外挂,甚至被别的无良的人直接拿去改造重新发行。
在现有技术中,已经出现一些保护代码安全的方法,例如《QQ乐团》使用了代码混淆的方式对其游戏客户端进行加密保护。所谓代码混淆就是将原本人类能直接读懂的代码,用机器的方式转换为人类读写都非常晦涩的源代码,然后进行编译使用,比如将class Catclass Dog转换成class l0l1 class ll01等人类难以理解的代码,从而提高了源代码的安全性。
虽然代码混淆的方式在一定程度上可以避免源代码的泄漏。但是对于稍有基础的技术人员来说,通过已经被混淆的代码还原出编程者的原始意图也并非难事,因为经过混淆的代码依然有比较清晰的脉络,借助人力的翻译,将局部的代码反编译出来,就能破解软件的关键部分。
发明内容
但是,对于中间语言(IL)代码来说,其经过预编译生成的本地代码无法在Windows操作系统上运行使得无法广泛利用本地代码来保护代码安全。
因此在现有技术中,保护代码安全是非常令人烦恼的问题。
为此,非常需要一种改进的保护代码安全的方法,以使IL代码经过预编译生成的本地代码能够在Windows操作系统上运行,进而使利用本地代码保护代码安全得到广泛应用。
在本上下文中,本发明的实施方式期望提供一种用于保护代码安全的方法和装置。
在本发明实施方式的第一方面中,提供了一种用于保护代码安全的方法,例如可以包括:
将一个或多个IL代码函数预编译为本地代码;
在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;
将经过预编译的所述一个或多个IL代码函数删除;
在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。
优选地,其中所述以特定字符为标志的汇编代码段例如具体可以为以.local、.type.、和.size为标志的汇编代码。
在本发明的一个实施例中,该方法例如还可以包括:
在IL代码函数被运行时,判断所述IL代码函数是否执行过所述预编译;
如果是,以所述IL代码函数在所述预编译后生成的本地代码代替所述代码函数运行;
如果否,利用JIT编译所述IL代码函数。
在本发明的另一实施例中,该方法例如还可以包括:
在利用JIT编译所述IL代码函数时,判断内联inline优化操作展开的IL代码函数是否执行过所述预编译;
如果是,放弃inline优化操作。
优选地,其中所述判断IL代码函数是否执行过所述预编译,例如具体可以通过判断所述IL代码函数中首字节位置是否包含预设的固定标识符来确认是否执行过所述预编译,所述预设的固定标识符具体为非IL代码使用的字符。
优选地,该方法所述将经过预编译的所述一个或多个IL代码函数删除例如具体可以包括:
在所述预编译之后,生成所述IL代码函数的列表;
根据所述IL代码函数的列表,确定所述IL代码函数名和所述IL代码函数所在DLL文件;
在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,所述预设的固定标识符具体为非IL代码使用的字符;
将所述DLL文件中所述IL代码函数替换为乱码。
在本发明的又一个实施例中,该方法例如还可以包括:
从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
优选地,其中所述从内存加载本地代码和/或未经编译的IL代码函数例如具体可以通过修改载入代码函数实现。
优选地,其中所述本地代码和/或未经编译的IL代码函数例如具体可以在客户端启动时,自动从服务器获取至内存。
优选地,例如还可以包括:在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。
在本发明的再一个实施例中,以上所述的方法由Mono执行。
优选地,例如还可以包括:
编译所述Mono,生成更新的Mono.dll文件;
将Unity3D引擎自带的Mono.dll文件替换为所述更新的Mono.dll文件。
在本发明实施方式的第二方面中,提供了一种用于保护代码安全的装置,例如可以包括:
预编译单元:配置用于将一个或多个IL代码函数预编译为本地代码,在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;
删除单元:配置用于将经过预编译的所述一个或多个IL代码函数删除;
执行单元:配置用于在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。
优选地,该装置例如还可以包括:
第一判断单元:配置用于在IL代码函数被运行时,判断所述IL代码函数是否执行过所述预编译;如果是,以所述IL代码函数在所述预编译后生成的本地代码代替所述代码函数运行;如果否,利用JIT编译所述IL代码函数。
优选地,该装置例如还可以包括:
第二判断单元:配置用于在利用JIT编译所述IL代码函数时,判断内联inline优化操作展开的IL代码函数是否执行过所述预编译;如果是,放弃inline优化操作。
优选地,所述第一判断单元或第二判断单元通过判断所述IL代码函数中首字节位置是否包含预设的固定标识符来确认是否执行过所述预编译,所述预设的固定标识符具体为非IL代码使用的字符。
优选地,所述删除单元例如具体可以包括:
列表生成单元:配置用于在所述预编译单元执行之后,生成所述IL代码函数的列表;
查询单元:配置用于根据所述IL代码函数的列表,确定所述IL代码函数名和所述IL代码函数所在DLL文件;
标记单元:配置用于在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,所述预设的固定标识符具体为非IL代码使用的字符;
替换单元:配置用于将所述DLL文件中所述IL代码函数替换为乱码。
优选地,该装置例如还可以包括:
加载单元:配置用于从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
优选地,该装置中所述加载单元具体通过修改载入代码函数实现例如可以从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
优选地,该装置例如还可以包括:
获取单元:配置用于在客户端启动时,自动从服务器获取所述本地代码和/或未经编译的IL代码函数至内存。
优选地,该装置例如还可以包括:
解密单元:配置用于在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。
优选地,该装置集成在Mono中。
优选地,该装置例如还可以包括将集成了所述装置的Mono进行编译,生成更新的Mono.dll文件,将Unity3D引擎自带的Mono.dll文件替换为所述更新的Mono.dll文件。
通过对上述技术方案的描述,容易得知,本发明具有如下有益效果:
由于在本发明预编译过程中,将以特定字符为标志的汇编代码段删除,使得本地代码能够在Windows操作系统下运行,进而使利用本地代码保护代码安全得到广泛应用;而且,将经过预编译的一个或多个IL代码函数删除,在经过预编译的一个或多个IL代码函数被运行时,以本地代码代替一个或多个IL代码函数运行,从而避免了IL代码的暴露,保护了代码的安全;其次,由于在客户端启动时,自动从服务器获取本地代码和/或未经编译的IL代码函数至内存、从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存,进一步避免了IL代码的暴露,保护了代码的安全。
附图说明
通过参考附图阅读下文的详细描述,本发明示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本发明的若干实施方式,其中:
图1示意性地示出了适于实现本发明实施方式的示例性计算系统100的框图;
图2示意性地示出了根据本发明一实施例的方法;
图3示意性地示出了根据本发明又一实施例的装置;
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施方式来描述本发明的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本发明,而并非以任何方式限制本发明的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
图1示出了适于实现本发明实施方式的示例性计算系统100的框图。如图1所示,计算系统100可以包括:中央处理单元(CPU)101、随机存取存储器(RAM)102、只读存储器(ROM)103、系统总线104、硬盘控制器105、键盘控制器106、串行接口控制器107、并行接口控制器108、显示控制器109、硬盘110、键盘111、串行外部设备112、并行外部设备113和显示器114。这些设备中,与系统总线104耦合的有CPU 101、RAM 102、ROM 103、硬盘控制器105、键盘控制器106、串行控制器107、并行控制器108和显示控制器109。硬盘110与硬盘控制器105耦合,键盘111与键盘控制器106耦合,串行外部设备112与串行接口控制器107耦合,并行外部设备113与并行接口控制器108耦合,以及显示器114与显示控制器109耦合。应当理解,图1所述的结构框图仅仅是为了示例的目的,而不是对本发明范围的限制。在某些情况下,可以根据具体情况增加或减少某些设备。
本领域技术技术人员知道,本发明的实施方式可以实现为一种系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是,但不限于,电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举示例)例如可以包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言-诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言-诸如”C ”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络(包括局域网(LAN)或广域网(WAN))连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
下面将参照本发明实施例的方法的流程图和设备(或系统)的框图描述本发明的实施方式。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。
也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置的产品。
也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。
根据本发明的实施方式,提出了一种用于保护代码安全的方法和装置。
在本文中,需要理解的是,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
下面参考本发明的若干代表性实施方式,详细阐释本发明的原理和精神。
发明概述
本发明人发现,将IL代码转换成本地代码是一种防止反向工程的有效方法,因为本地代码往往难以被反向工程。如果能将以IL代码形式存在于客户端设备上的客户端程序预编译为本地代码的形式,则可以大幅度提高保护代码的力度。
本发明人还发现,现有技术中,可以将IL代码预编译为能够在Linux上执行的本地代码,但是不能在Windows操作系统上运行。然而,很多客户端程序都是需要在Windows上运行的。为了能够将IL代码预编译为能够在Windows上执行的本地代码以保护代码的安全,本发明人提出在预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行,而且将经过预编译的IL代码函数删除,在经过预编译的IL代码函数被运行时,以所述本地代码代替经过预编译的IL代码函数运行达到保护代码安全的目的。
在介绍了本发明的基本原理之后,下面具体介绍本发明的各种非限制性实施方式。
应用场景总览
例如:基于Unity3D引擎制作的游戏客户端IL代码程序,用Mono作为程序的运行时库,在该应用场景下,本发明的实施方式可以保护基于Unity3D引擎制作的游戏客户端IL代码程序。
但是,本领域技术人员可以理解,此处的场景仅是示例,本发明的思想在此方面并不受到限制。相反,本发明的实施方式可以用于保护由其他引擎制作的任何软件客户端代码。
示例性方法
下面结合上述应用场景,参考图2来描述根据本发明示例性实施方式的用于该应用场景的方法。需要注意的是,上述应用场景仅是为了便于理解本发明的精神和原理而示出,本发明的实施方式在此方面不受任何限制。相反,本发明的实施方式可以应用于适用的任何场景。
参见图2,该示例性方法例如可以包括:
S201.将一个或多个IL代码函数预编译为本地代码;
S202.在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;
S203.将经过预编译的所述一个或多个IL代码函数删除;
S204.在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。
其中,所述以特定字符为标志的汇编代码段例如具体可以为以.local、.type.、和.size为标志的汇编代码。
由于本发明方法包括将经过预编译的所述一个或多个IL代码函数删除,在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行,因此,为了解决客户端程序运行阶段IL代码函数的正常调用,在本发明的一个实施例中,该方法例如还可以包括:
在IL代码函数被运行时,判断所述IL代码函数是否执行过所述预编译;
如果是,以所述IL代码函数在所述预编译后生成的本地代码代替所述代码函数运行;
如果否,利用JIT编译所述IL代码函数。
需要说明的是,由于本地代码不能进行内联inline操作,如果执行了inline操作,则会出错,因此,在本发明的另一实施例中,该方法例如还可以包括:
在利用JIT编译所述IL代码函数时,判断内联(inline)优化操作展开的IL代码函数是否执行过所述预编译;如果是,放弃inline优化操作。
需要说明的是,在该方法中,虽然将经过预编译的IL代码函数删除,但是可以通过在该IL代码函数所在的DLL文件中该IL代码函数首字节位置插入预设的固定标识符来标记该IL代码函数被预编译处理过,使得后续在调用该IL代码函数时,能够判断所述IL代码函数是否执行过所述预编译,进行后续处理。因此,其中判断IL代码函数是否执行过所述预编译,例如具体可以通过判断所述IL代码函数中首字节位置是否包含预设的固定标识符来确认是否执行过所述预编译,所述预设的固定标识符具体为非IL代码使用的字符。
下面对步骤S103.将经过预编译的所述一个或多个IL代码函数删除进行详细介绍,在本发明的一个实施例中,该步骤例如具体可以包括:
在所述预编译之后,生成所述IL代码函数的列表;
根据所述IL代码函数的列表,确定所述IL代码函数名和所述IL代码函数所在DLL文件;
在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,所述预设的固定标识符具体为非IL代码使用的字符;
将所述DLL文件中所述IL代码函数替换为乱码。
需要说明的是,在该实施例中,给出了将经过预编译的所述一个或多个IL代码函数删除的具体办法,虽然将经过预编译的IL代码函数删除,也仍然保留IL代码函数所在的DLL文件,因为该IL代码函数的DLL文件里包含了用于调用该IL代码函数的入口,虽然保留该DLL文件,但是该文件中不存在实质的IL代码函数,这些实质性IL代码函数已经被替换为乱码,并且通过在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,使得执行程序能够通过所述固定标识符确定以存储在别的DLL文件中的本地代码代替经过预编译的IL代码函数运行。
在以上实施例中所述的固定标识符例如可以取如0xEE这样非IL代码使用的字符。本领域技术人员可以理解,此处的0xEE仅是非IL代码使用的字符的示例,并不用于限制本发明的思想。
需要说明的是,为了进一步增加保护代码安全的力度,使第三方无法直接通过磁盘文件获取本地代码和/或未经编译的IL代码,因此,在本发明的又一个实施例中,例如还可以包括:
从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
其中所述从内存加载本地代码和/或未经编译的IL代码函数例如具体可以通过修改载入代码函数实现。
其中所述本地代码和/或未经编译的IL代码函数例如具体可以在客户端启动时,自动从服务器获取至内存。
而且,游戏客户端产品还可以自己选择一种合适的流行加密手段,例如rc4,对代码进行加密进一步增加保护代码安全的力度,因此该方法还可以包括:在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。需要注意的是,此处的加密手段rc4仅是可用的加密手段的一个示例,本发明在此方面不受任何限制。
在本发明的该实际应用场景中,一个优选的实施例是以上所述的方法由Mono执行,也就是说,在以上所述方法中涉及到的步骤由Mono执行,也就是将以上所述方法执行动作集成到Mono中,相当于对Mono的改造,使Mono在作为客户端程序的运行时库时,执行以上所述方法中涉及的步骤。
在具体到Unity3D引擎制作的游戏客户端IL代码程序这一实际应用中,以Mono执行环境,因此,该方法还可以包括:编译所述改造的Mono,生成更新的Mono.dll文件;将Unity3D引擎自带的Mono.dll文件替换为所述更新的Mono.dll文件,解决保护基于Unity3D引擎制作的游戏客户端IL代码程序这一实际问题。
示例性装置
在介绍了本发明示例性实施方式的方法之后,接下来,参考图3对本发明示例性实施方式的装置进行描述,该装置例如可以包括:
预编译单元301:配置用于将一个或多个IL代码函数预编译为本地代码,在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;
删除单元302:配置用于将经过预编译的所述一个或多个IL代码函数删除;
执行单元303:配置用于在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。
在本发明该装置的一个优选实施例中,例如还可以包括:
第一判断单元304:配置用于在IL代码函数被运行时,判断所述IL代码函数是否执行过所述预编译;如果是,以所述IL代码函数在所述预编译后生成的本地代码代替所述代码函数运行;如果否,利用JIT编译所述IL代码函数。
第二判断单元305:配置用于在利用JIT编译所述IL代码函数时,判断内联inline优化操作展开的IL代码函数是否执行过所述预编译;如果是,放弃inline优化操作。
优选地,所述删除单元302例如具体可以包括:
列表生成单元302A:配置用于在所述预编译单元执行之后,生成所述IL代码函数的列表;
查询单元302B:配置用于根据所述IL代码函数的列表,确定所述IL代码函数名和所述IL代码函数所在DLL文件;
标记单元302C:配置用于在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,所述预设的固定标识符具体为非IL代码使用的字符;
替换单元302D:配置用于将所述DLL文件中所述IL代码函数替换为乱码。
在本发明该装置的另一个优选实施例中,例如还可以包括:
加载单元306:配置用于从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
获取单元307:配置用于在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。
解密单元308:配置用于在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。
在本发明该装置的又一个优选实施例中,例如还可以包括:
该装置集成在Mono309中。
应当注意,尽管在上文详细描述中提及了装置的若干单元或子单元,但是这种划分仅仅并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多装置的特征和功能可以在一个装置中具体化。反之,上文描述的一个装置的特征和功能可以进一步划分为由多个装置来具体化。
此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。相反,流程图中描绘的步骤可以改变执行顺序。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
申请文件中提及的动词“包括”、“包含”及其词形变化的使用不排除除了申请文件中记载的那些元素或步骤之外的元素或步骤的存在。元素前的冠词“一”或“一个”不排除多个这种元素的存在。
虽然已经参考若干具体实施方式描述了本发明的精神和原理,但是应该理解,本发明并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本发明旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。所附权利要求的范围符合最宽泛的解释,从而包含所有这样的修改及等同结构和功能。
Claims (24)
1.一种用于保护代码安全的方法,包括:
将一个或多个IL代码函数预编译为本地代码;
在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;
将经过预编译的所述一个或多个IL代码函数删除;
在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。
2.根据权利要求1所述的方法,其中,所述以特定字符为标志的汇编代码段具体为以.local、.type.、和.size为标志的汇编代码。
3.根据权利要求1所述的方法,还包括:
在IL代码函数被运行时,判断所述IL代码函数是否执行过所述预编译;
如果是,以所述IL代码函数在所述预编译后生成的本地代码代替所述代码函数运行;
如果否,利用JIT编译所述IL代码函数。
4.根据权利要求3所述的方法,还包括:
在利用JIT编译所述IL代码函数时,判断内联inline优化操作展开的IL代码函数是否执行过所述预编译;
如果是,放弃inline优化操作。
5.根据权利要求3或4任意一项所述的方法,其中,
所述判断IL代码函数是否执行过所述预编译,具体通过判断所述IL代码函数中首字节位置是否包含预设的固定标识符来确认是否执行过所述预编译,所述预设的固定标识符具体为非IL代码使用的字符。
6.根据权利要求1所述的方法,其中,所述将经过预编译的所述一个或多个IL代码函数删除具体包括:
在所述预编译之后,生成所述IL代码函数的列表;
根据所述IL代码函数的列表,确定所述IL代码函数名和所述IL代码函数所在DLL文件;
在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,所述预设的固定标识符具体为非IL代码使用的字符;
将所述DLL文件中所述IL代码函数替换为乱码。
7.根据权利要求1所述的方法,还包括:
从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
8.根据权利要求7所述的方法,其中,所述从内存加载本地代码和/或未经编译的IL代码函数具体通过修改载入代码函数实现。
9.根据权利要求1所述的方法,其中,所述本地代码和/或未经编译的IL代码函数具体在客户端启动时,自动从服务器获取至内存。
10.根据权利要求7或9任意一项所述的方法,还包括:
在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。
11.根据权利要求1-4、6-9任意一项所述的方法,其中,所述方法由Mono执行。
12.根据权利要求11所述的方法,还包括:
编译所述Mono,生成更新的Mono.dll文件;
将Unity3D引擎自带的Mono.dll文件替换为所述更新的Mono.dll文件。
13.一种用于保护代码安全的装置,包括:
预编译单元:配置用于将一个或多个IL代码函数预编译为本地代码,在所述预编译过程中,将以特定字符为标志的汇编代码段删除以使所述本地代码能够在Windows操作系统下运行;
删除单元:配置用于将经过预编译的所述一个或多个IL代码函数删除;
执行单元:配置用于在所述经过预编译的一个或多个IL代码函数被运行时,以所述本地代码代替所述一个或多个IL代码函数运行。
14.根据权利要求13所述的装置,其中,所述预编译单元中所述以特定字符为标志的汇编代码段具体为以.local、.type.、和.size为标志的汇编代码。
15.根据权利要求13所述的装置,还包括:
第一判断单元:配置用于在IL代码函数被运行时,判断所述IL代码函数是否执行过所述预编译;如果是,以所述IL代码函数在所述预编译后生成的本地代码代替所述代码函数运行;如果否,利用JIT编译所述IL代码函数。
16.根据权利要求15所述的装置,还包括:
第二判断单元:配置用于在利用JIT编译所述IL代码函数时,判断内联inline优化操作展开的IL代码函数是否执行过所述预编译;如果是,放弃inline优化操作。
17.根据权利要求15或16任意一项所述的装置,其中,
所述第一判断单元或第二判断单元通过判断所述IL代码函数中首字节位置是否包含预设的固定标识符来确认是否执行过所述预编译,所述预设的固定标识符具体为非IL代码使用的字符。
18.根据权利要求13所述的装置,其中,所述删除单元具体包括:
列表生成单元:配置用于在所述预编译单元执行之后,生成所述IL代码函数的列表;
查询单元:配置用于根据所述IL代码函数的列表,确定所述IL代码函数名和所述IL代码函数所在DLL文件;
标记单元:配置用于在所述DLL文件中所述IL代码函数所在的首字节位置加入固定标识符,所述预设的固定标识符具体为非IL代码使用的字符;
替换单元:配置用于将所述DLL文件中所述IL代码函数替换为乱码。
19.根据权利要求13所述的装置,还包括:
加载单元:配置用于从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
20.根据权利要求19所述的装置,其中,所述加载单元具体通过修改载入代码函数实现从内存加载所述本地代码和/或未经编译的IL代码函数至执行程序用的内存。
21.根据权利要求13所述的装置,还包括:
获取单元:配置用于在客户端启动时,自动从服务器获取所述本地代码和/或未经编译的IL代码函数至内存。
22.根据权利要求19或21任意一项所述的装置,还包括:
解密单元:配置用于在所述本地代码和/或未经编译的IL代码函数进入内存时,若所述本地代码和/或未经编译的IL代码函数为加密状态,对其进行解密。
23.根据权利要求13-16、18-21任意一项所述的装置,其中,所述装置集成在Mono中。
24.根据权利要求23所述的装置,还包括:将集成了所述装置的Mono进行编译,生成更新的Mono.dll文件,将Unity3D引擎自带的Mono.dll文件替换为所述更新的Mono.dll文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210376495.9A CN103198240B (zh) | 2012-09-29 | 2012-09-29 | 一种用于保护代码安全的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210376495.9A CN103198240B (zh) | 2012-09-29 | 2012-09-29 | 一种用于保护代码安全的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103198240A true CN103198240A (zh) | 2013-07-10 |
CN103198240B CN103198240B (zh) | 2016-03-16 |
Family
ID=48720792
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210376495.9A Active CN103198240B (zh) | 2012-09-29 | 2012-09-29 | 一种用于保护代码安全的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103198240B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103955635A (zh) * | 2014-04-04 | 2014-07-30 | 北京深思数盾科技有限公司 | 一种对.net可执行程序进行保护的方法和系统 |
CN104318162A (zh) * | 2014-09-27 | 2015-01-28 | 深信服网络科技(深圳)有限公司 | 源代码泄露检测方法及装置 |
CN104978528A (zh) * | 2014-04-01 | 2015-10-14 | 四零四科技股份有限公司 | 操作系统核心加密及其解密方法 |
CN107657154A (zh) * | 2017-09-18 | 2018-02-02 | 北京深思数盾科技股份有限公司 | 一种目标程序的保护方法、装置、设备及存储介质 |
CN108427559A (zh) * | 2018-03-14 | 2018-08-21 | 新华三技术有限公司 | 一种脚本文件生成和调用方法以及装置 |
CN109409033A (zh) * | 2018-09-11 | 2019-03-01 | 平安科技(深圳)有限公司 | 代码加密方法、装置、计算机装置及存储介质 |
CN116383827A (zh) * | 2023-03-17 | 2023-07-04 | 中广核智能科技(深圳)有限责任公司 | 一种安全卸载可信功能机制方法、系统和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1580994A (zh) * | 2003-08-01 | 2005-02-16 | Kw-软件有限公司 | 用于工业自动化的cil代码程序的在线修改 |
US20080010649A1 (en) * | 2004-06-15 | 2008-01-10 | Gilles Grimaud | Method Of Loading Software With An Intermediate Object Oriented Language In A Portable Device |
CN101158911A (zh) * | 2007-11-22 | 2008-04-09 | 北京飞天诚信科技有限公司 | .Net程序保护方法及装置 |
CN101925879A (zh) * | 2008-01-29 | 2010-12-22 | 微软公司 | 动态中间语言修改及替换 |
-
2012
- 2012-09-29 CN CN201210376495.9A patent/CN103198240B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1580994A (zh) * | 2003-08-01 | 2005-02-16 | Kw-软件有限公司 | 用于工业自动化的cil代码程序的在线修改 |
US20080010649A1 (en) * | 2004-06-15 | 2008-01-10 | Gilles Grimaud | Method Of Loading Software With An Intermediate Object Oriented Language In A Portable Device |
CN101158911A (zh) * | 2007-11-22 | 2008-04-09 | 北京飞天诚信科技有限公司 | .Net程序保护方法及装置 |
CN101925879A (zh) * | 2008-01-29 | 2010-12-22 | 微软公司 | 动态中间语言修改及替换 |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104978528A (zh) * | 2014-04-01 | 2015-10-14 | 四零四科技股份有限公司 | 操作系统核心加密及其解密方法 |
CN103955635A (zh) * | 2014-04-04 | 2014-07-30 | 北京深思数盾科技有限公司 | 一种对.net可执行程序进行保护的方法和系统 |
CN103955635B (zh) * | 2014-04-04 | 2017-02-15 | 北京深思数盾科技股份有限公司 | 一种对.net可执行程序进行保护的方法和系统 |
CN104318162A (zh) * | 2014-09-27 | 2015-01-28 | 深信服网络科技(深圳)有限公司 | 源代码泄露检测方法及装置 |
CN107657154A (zh) * | 2017-09-18 | 2018-02-02 | 北京深思数盾科技股份有限公司 | 一种目标程序的保护方法、装置、设备及存储介质 |
CN107657154B (zh) * | 2017-09-18 | 2018-08-17 | 北京深思数盾科技股份有限公司 | 一种目标程序的保护方法、装置、设备及存储介质 |
CN108427559A (zh) * | 2018-03-14 | 2018-08-21 | 新华三技术有限公司 | 一种脚本文件生成和调用方法以及装置 |
CN109409033A (zh) * | 2018-09-11 | 2019-03-01 | 平安科技(深圳)有限公司 | 代码加密方法、装置、计算机装置及存储介质 |
CN116383827A (zh) * | 2023-03-17 | 2023-07-04 | 中广核智能科技(深圳)有限责任公司 | 一种安全卸载可信功能机制方法、系统和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103198240B (zh) | 2016-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103198240B (zh) | 一种用于保护代码安全的方法和装置 | |
Kim et al. | ScanDal: Static analyzer for detecting privacy leaks in android applications | |
CN105683990B (zh) | 用于保护动态库的方法和装置 | |
US9443064B2 (en) | Protecting method and system of java source code | |
US9607160B2 (en) | Method and apparatus for providing string encryption and decryption in program files | |
EP2897074A1 (en) | Application code obfuscation device based on self-conversion and method therefor | |
CN104463002A (zh) | 一种加固apk的方法和装置以及apk加固客户端和服务器 | |
CN112597454A (zh) | 代码混淆方法、代码运行方法、装置、介质与设备 | |
CN111159662A (zh) | 一种数据的处理方法和装置 | |
CN110414261A (zh) | 一种数据脱敏方法、装置、设备及可读存储介质 | |
CN107292135A (zh) | 一种程序代码保护方法和装置 | |
CN110309631B (zh) | 一种编程语言结构混淆处理方法、智能终端及存储介质 | |
CN112256275B (zh) | 代码混淆方法、装置、电子设备及介质 | |
CN113626773B (zh) | 一种基于中间语言的代码保护方法 | |
CN114154123B (zh) | 应用于Python项目的加密保护方法 | |
CN110135131B (zh) | 一种应用程序的加密方法、存储介质及终端设备 | |
CN113449330B (zh) | 对Javascript加密文件进行传输的方法 | |
CN109885991A (zh) | 一种基于移动应用数据流体的加密方法、电子设备和介质 | |
CN113849781B (zh) | Go语言源代码混淆方法、系统、终端及存储介质 | |
CN104751026A (zh) | 安卓系统的软件保护方法、软件应用方法及相关装置 | |
CN114968206A (zh) | 一种编程语言代码动态混淆方法及系统 | |
WO2017063323A1 (zh) | 基于重构技术实现敏感数据云端锁定的方法 | |
CN113420313A (zh) | 程序安全运行、加密方法及其装置、设备、介质 | |
CN111460464B (zh) | 数据加解密方法、装置、电子设备及计算机存储介质 | |
CN105095698A (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 | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |