一种基于中间语言的字符串加密方法与流程

文档序号:14175739阅读:696来源:国知局
一种基于中间语言的字符串加密方法与流程

本发明涉及计算机软件技术领域,尤其涉及一种基于中间语言的字符串加密方法。



背景技术:

程序代码在被编译为可执行文件之后,在目标文件中会存在一个字符串。常量区,这个区域保存了应用程序中所使用到的所有字符串。这些字符串往往具有一定的语义性,如用于显示在软件界面上的文本,用于调试的日志信息、网络请求的url地址等。攻击者在破解软件时,一般会使用反编译工具,将这些字符串导出,从字符串的语义中试图理解程序逻辑,并通过地址偏移找到引用这些字符串的代码片段,为后续的逆向分析提供便利。基于此,可以将程序中的字符串进行加密,在运行时动态进行解密,以防止此种从字符串明文切入的逆向分析行为,进而保护应用程序不被轻易破解。目前类似的方案主要有两种:

1)源代码预处理:手动计算加密后的字符串,在源代码中替换原字符串,并在密文字符串外面套上解密函数,用于返回解密后的原始字符串,然后在源代码中适当的位置插入解密函数。这一系列操作也可以通过自动化脚本完成,最后编译修改后的源代码。

2)二进制处理,将源代码编译成二进制文件后,修改常量区的字符串内容,然后修改代码区中引用字符串的代码,插入解密的指令,完成字符串的解密还原。

源代码预处理的方式,因为需要修改源代码,具有较强的侵入性,影响了代码的可读性,并且需要针对不同的程序开发语言开发不同的混淆脚本。

二进制处理的方式,由于不同的目标平台架构指令集各不相同,因此针对不同的架构需要预编译出不同的解密指令。并且,直接修改二进制代码,需要进行地址重定位等大量繁琐的修复工作,否则程序将无法正常执行。



技术实现要素:

有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是提供一种基于中间语言的字符串加密方法,以解决现有技术的不足。

为实现上述目的,本发明提供了一种基于中间语言的字符串加密方法,包括以下步骤:

步骤1、利用不同语言的前端编译器将源代码文件编译为中间代码文件;

步骤2、解析中间代码文件,遍历中间代码文件中的所有常量,提取所述常量的字符串常量;

步骤3、对步骤2提取的字符串常量加密,写入中间代码;

步骤4、为步骤2中提取出的每一个字符串常量生成解密函数;

步骤5、针对步骤2中提取出的每一个字符串常量,遍历他们在代码区的所有字符串引用,在字符串引用之前增加对其解密函数的调用;

步骤6、替换字符串引用,完成字符串加密操作;

步骤7、将以上处理后的中间代码文件编译为目标二进制文件,完成编译。

进一步地,所述步骤2提取所述常量的字符串常量包括c语言风格和objective-c语言风格两种不同格式的字符串,区分提取,具体为:

a)c语言风格字符串为字符数组格式,直接提取字符串本身;

b)如果是objective-c语言风格字符串,该字符串只是一个包含字符数组的结构体,根据结构体中的引用符号提取对应的字符数组。

进一步地,所述步骤3具体包括:

a)提取字符串常量的值;

b)从预设的多种加密算法中,随机提取一种加密算法,用符号c表示,并随机生成密钥,对字符串常量的值进行加密,获得字符串常量值经过加密后的密文;

c)将密文和密钥保存在常量区,并删除原字符串常量。

进一步地,所述步骤4具体包括:

a)创建与原字符串常量相同空间大小的全局变量,用符号buffer表示,和一个1字节的全局变量,用于标识字符串常量是否已经解密,用符号flag表示,初始值置0;

b)将预编译为中间语言的c算法解密函数,插入代码区;

c)生成字符串常量解密函数,在函数体中先判断flag,若为0则开始解密:读取密文和密钥,调用c算法对应的解密函数,对字符串常量进行解密,并将解密后的明文写入buffer,然后将flag置1,避免多次解密。

进一步地,所述步骤6具体包括:

a)对于c语言风格字符串,遍历原字符串的所有引用,全部替换为引用buffer;

b)对于objective-c语言风格字符串,将其结构体中的字符数组引用替换为buffer。

本发明的有益效果是:

本发明基于中间语言对字符串进行加密处理,屏蔽了前端不同开发语言、后端不同处理器架构的差异性,对源代码文件无侵入性,也不需要进行平台相关的二进制文件修复工作。并且可以支持不同语言风格的字符串,实现了跨语言、跨平台的特性。运行时按需动态解密,避免运行时内存转储把字符串明文全部导出。并且通过设置标志位避免同一个字符串被多次引用时重复解密造成的性能损耗。

以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。

附图说明

图1是本发明的软件架构图。

图2是本发明的软件流程图。

具体实施方式

在计算机科学中,中间语言是指一种应用于抽象机器(abstractmachine)的编程语言,它设计的目的,是用来帮助我们分析计算机程序。这个术语源自于编译器,在编译器将源代码编译为目的码的过程中,会先将源代码转换为一个或多个的中间表述,以方便编译器进行最佳化,并产生出目的机器的机器语言。

中间文件指源代码经过编译器前端初步编译后产生的文件,包含用中间语言表示的代码,可通过编译器进一步编译为机器码表示的目标二进制文件。

本发明在源代码被编译为中间语言之后,在中间语言这一层,进行字符串的加密处理,最后将混淆处理后的中间文件编译为目标二进制文件,如图1、2所示,具体步骤如下:

1)利用不同语言的前端编译器(如clang)将源代码文件(如main.c)编译为ir文件,即中间文件(如main.bc)。

2)解析中间文件,遍历中间文件中的所有常量,提取其中的字符串常量,其中会包括c语言风格和objective-c语言风格两种不同格式的字符串,需要区分对待:

a)c语言风格字符串为字符数组格式,直接提取字符串本身;

b)如果是objective-c语言风格字符串,该字符串只是一个包含字符数组的结构体,根据结构体中的引用符号提取对应的字符数组。

3)对步骤2)中提取出的字符串常量分别进行加密:

a)提取字符串常量的值;

b)从预设的多种加密算法中,随机提取一种加密算法,用符号c表示,并随机生成密钥,对字符串的值进行加密,获得字符串值经过加密后的密文;

c)将密文和密钥保存在常量区,并删除原字符串。

4)为步骤2)中提取出的每一个字符串常量生成解密函数:

a)创建与原字符串常量相同空间大小的全局变量,用符号buffer表示,和一个1字节的全局变量,用于标识字符串是否已经解密,用符号flag表示,初始值置0;

b)将预编译为中间语言的c算法解密函数,插入代码区;

c)生成字符串解密函数,在函数体中先判断flag,若为0则开始解密:读取密文,和密钥,调用c算法对应的解密函数,对字符串进行解密,并将解密后的明文写入buffer,然后将flag置1,避免多次解密。

5)针对步骤2)中提取出的每一个字符串常量,遍历他们在代码区的所有字符串引用,在字符串引用之前增加对其解密函数的调用。

6)替换字符串引用,完成字符串加密操作:

a)对于c语言风格字符串,遍历原字符串的所有引用,全部替换为引用buffer;

b)对于objective-c语言风格字符串,将其结构体中的字符数组引用替换为buffer。

7)将处理后的中间文件编译为目标二进制文件,完成编译。

本发明基于中间语言对字符串进行加密处理,屏蔽了前端不同开发语言、后端不同处理器架构的差异性,对源代码文件无侵入性,也不需要进行平台相关的二进制文件修复工作。并且可以支持不同语言风格的字符串,实现了跨语言、跨平台的特性。运行时按需动态解密,避免运行时内存转储把字符串明文全部导出。并且通过设置标志位避免同一个字符串被多次引用时重复解密造成的性能损耗。

以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术人员无需创造性劳动就可以根据本发明的构思做出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1