一种源代码中字符串的混淆方法和装置与流程

文档序号:15558891发布日期:2018-09-29 01:46阅读:183来源:国知局

本发明涉及软件开发技术领域,特别是涉及一种字符串的混淆方法和装置。



背景技术:

基本上在所有的项目中,源代码都会用到非常多的字符串常量,这些字符串一般都是不经过任何加密或者混淆,直接以明文的方式写在代码中,包括加解密密钥以及ui界面中展示的字符。本申请的发明人发现,这些以明文状态存在于源代码中的字符串会导致应用程序中实现的加密算法形同虚设,另外还给攻击者找到破解入口提供了极大的便利,从而导致这些应用程序在安全上存在较大的风险。



技术实现要素:

有鉴于此,本发明提供了一种源代码中字符串的混淆方法和装置,用于对项目中的字符串进行混淆,以避免字符串以明文状态存在而导致应用程序出现安全风险。

为了解决上述问题,本发明公开了一种源代码中字符串的混淆方法,应用于软件开发工具中,所述混淆方法包括步骤:

利用clang工具对待混淆源代码进行编译,得到语法树;

对所述语法树进行遍历,得到所述源代码中字符串的字符串常量列表和字符串引用列表;

根据所述字符串常量列表中指示的位置读出字符串常量并加密处理,并以加密后的加密字符串替换原有的字符串常量;

根据所述字符串引用列表查找所述加密字符串,并在所述加密字符串所在所述源代码中的位置插入解密代码。

可选的,所述对所述语法树进行遍历,得到所述源代码中字符串的字符串常量列表和字符串引用列表,包括:

遍历所述语法树中的token;

记录所有类型为字符串常量的token以及在所述源代码中的位置,形成所述字符串常量列表;

记录所有用于对字符串进行引用的token以及在所述源代码中的位置,形成所述字符串引用列表。

可选的,所述根据所述字符串常量列表中指示的位置读出字符串常量并加密处理,并以加密后的加密字符串替换原有的字符串常量,包括:

遍历所述字符串常量列表,根据所述字符串常量列表中的位置从所述源代码的所述位置中读出字符串常量;

利用预设的加密混淆算法对所述字符串常量进行加密混淆处理,得到加密混淆后的加密字符串;

以所述加密字符串常量替换所述位置处的字符串常量。

相应的,为了保证上述方法的实施,本发明还提供了一种源代码中字符串的混淆装置,应用于软件开发工具中,所述混淆装置包括:

代码编译模块,用于利用clang工具对待混淆源代码进行编译,得到语法树;

列表生成模块,用于对所述语法树进行遍历,得到所述源代码中字符串的字符串常量列表和字符串引用列表;

加密处理模块,用于根据所述字符串常量列表中指示的位置读出字符串常量并加密处理,并以加密后的加密字符串替换原有的字符串常量;

代码插入模块,用于根据所述字符串引用列表查找所述加密字符串,并在所述加密字符串所在所述源代码中的位置插入解密代码。

可选的,所述列表生成模块包括:

语法树遍历单元,用于遍历所述语法树中的token;

第一记录单元,用于记录所有类型为字符串常量的token以及在所述源代码中的位置,形成所述字符串常量列表;

第二记录单元,用于记录所有用于对字符串进行引用的token以及在所述源代码中的位置,形成所述字符串引用列表。

可选的,所述加密处理模块包括:

字符串读取单元,用于遍历所述字符串常量列表,根据所述字符串常量列表中的位置从所述源代码的所述位置中读出字符串常量;

加密计算单元,用于利用预设的加密混淆算法对所述字符串常量进行加密混淆处理,得到加密混淆后的加密字符串;

字符串替换单元,用于以所述加密字符串常量替换所述位置处的字符串常量。

从上述技术方案可以看出,本发明提供了一种源代码中字符串的混淆方法和装置,该方法和装置应用于软件开发工具中,具体为利用clang工具对待混淆源代码进行编译,得到语法树;对语法树进行遍历,得到源代码中字符串的字符串常量列表和字符串引用列表;根据字符串常量列表中指示的位置读出字符串常量并加密处理,并以加密后的加密字符串替换原有的字符串常量;根据字符串引用列表查找加密字符串,并在加密字符串所在源代码中的位置插入解密代码。通过替换处理,使源代码中所有的字符串常量转换为加密后的加密字符串,而不再是可能会造成泄密的明文信息,从而避免了相应的安全风险。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种源代码中字符串的混淆方法的步骤流程图;

图2为本发明实施例提供的一种语法树的示例图;

图3为本发明实施例提供的一种源代码中字符串的混淆装置的结构框图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

图1为本发明实施例提供的一种源代码中字符串的混淆方法的步骤流程图。

参照图1所示,本实施例提供的混淆方法应用于软件开发工具中,用于对应用程序项目的源代码中的字符串进行混淆处理,以便避免其中出现容易被人破解的明文字符串,该混淆方法具体包括步骤:

s101:利用clang工具对带混淆源代码进行编译。

这里的源代码是指开发人员提前开发好的源代码,其中会包括许多的字符串,例如定义的变量、用于解密密钥和需要在ui界面中展示的字符等。在开发人员开发好源代码后,利用clang工具对该源代码进行编译处理,从而得到源代码的语法树。

lowlevelvirtualmachine(llvm)是一个开源的编译器架构,它已经被成功应用到多个应用领域。其中,clang工具是llvm的一个编译器前端,它目前支持c,c++,objective-c以及objective-c++等编程语言。clang对源程序进行词法分析和语义分析,并将分析结果转换为abstractsyntaxtree语法树,最后使用llvm作为后端代码的生成器。

clang的开发目标是提供一个可以替代gcc的前端编译器。与gcc相比,clang是一个重新设计的编译器前端,具有一系列优点,例如模块化,代码简单易懂,占用内存小以及容易扩展和重用等。由于clang在设计上的优异性,使得clang非常适合用于设计源代码级别的分析和转化工具。clang也已经被应用到一些重要的开发领域,如staticanalysis是一个基于clang的静态代码分析工具。

上述的语法树又称为抽象语法树ast(abstractsyntaxtree),例如,下面的语句可以将相应字符串序列处理为许多个token:

并形成相应的语法树,语法树如图2所示,其中的各分支所表示的含义如下:

functionded:方法定义或者叫函数定义;

compoundstmt:复合语句;

dedstmt:定义语句;

vardecl:str1:变量定义:变量名为str1;

objcstringliteral:hello:objc字符串常量:常量值“hello”;

objcmessageexpr:stringbyappendingstring:变量引用:表示引用名为str1的变量。

s102:通过遍历语法树得到字符串常量列表和字符串引用列表。

在对源代码进行编译得到语法树后,遍历该语法树,通过遍历查找其中的字符串常量并记录,从而得到上述字符串常量列表和字符串引用列表。具体来说过程如下:

首先,遍历上述语法树中的所有token;当查找到相应token的类型为字符串类型时,记录相应token以及其在源代码中的位置,通过对所有类型为字符类型的token和位置的记录,形成该字符串常量列表;相应的,当查找到用于对字符串进行引用的token时,记录该token及其在源代码中的位置,通过对所有这些token和位置的记录,从而形成该字符串引用列表。

token本意为标记,是词法分析的术语,词法分析是计算机科学中将字符序列转换为token的过程,并在此过程中对token进行分类。

s103:根据字符串常量列表对字符串常量进行加密处理。

具体来说是通过字符串常量列表所记录的token,以及相应token在源代码中的位置查找相应的字符串常量,并对该字符串常量进行加密处理,具体过程如下:

首先,通过遍历字符串常量列表依次查找相应的字符串常量的位置,并从该位置读出该字符串常量;然后,利用预设的加密混淆算法对读出的字符串常量进行加密处理,得到与相应字符串常量对应的加密字符串;最后,将该加密得到的加密字符串替换掉源代码中相应位置的字符串常量。从而使源代码中所有的字符串常量转换为加密后的加密字符串。

s104:将相应的解密代码插入到源代码中。

在将所有字符串常量变换为加密字符串后,遍历该字符串引用列表,根据字符串引用列表中查找相应的加密字符串,这里的加密字符串是指对相应字符串常量进行加密处理后得到的字符,在确定该加密字符串的位置后,在该位置插入相应的解密代码。该解密代码是指能够以此为信息对加密字符串进行解密从而得到原来的字符串常量的密码,一般来说其来源于上述加密混淆算法在进行加密处理时所需要的加密代码。

从上述技术方案可以看出,本实施例提供了一种源代码中字符串的混淆方法,该方法应用于软件开发工具中,具体为利用clang工具对待混淆源代码进行编译,得到语法树;对语法树进行遍历,得到源代码中字符串的字符串常量列表和字符串引用列表;根据字符串常量列表中指示的位置读出字符串常量并加密处理,并以加密后的加密字符串替换原有的字符串常量;根据字符串引用列表查找加密字符串,并在加密字符串所在源代码中的位置插入解密代码。通过替换处理,使源代码中所有的字符串常量转换为加密后的加密字符串,而不再是可能会造成泄密的明文信息,从而避免了相应的安全风险。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。

实施例二

图3为本发明实施例提供的一种源代码中字符串的混淆装置的结构框图。

参照图3所示,本实施例提供的混淆装置应用于软件开发工具中,用于对应用程序项目的源代码中的字符串进行混淆处理,以便避免其中出现容易被人破解的明文字符串,该混淆装置具体包括代码编译模块10、列表生成模块20、加密处理模块30和代码插入模块40。

代码编译模块用于利用clang工具对带混淆源代码进行编译。

这里的源代码是指开发人员提前开发好的源代码,其中会包括许多的字符串,例如定义的变量、用于解密密钥和需要在ui界面中展示的字符等。在开发人员开发好源代码后,利用clang工具对该源代码进行编译处理,从而得到源代码的语法树。

列表生成模块用于通过遍历语法树得到字符串常量列表和字符串引用列表。

在对源代码进行编译得到语法树后,遍历该语法树,通过遍历查找其中的字符串常量并记录,从而得到上述字符串常量列表和字符串引用列表。该模块具体包括语法树遍历单元、第一记录单元和第二记录单元。

语法树遍历单元用于遍历上述语法树中的所有token;第一记录单元用于当查找到相应token的类型为字符串类型时,记录相应token以及其在源代码中的位置,通过对所有类型为字符类型的token和位置的记录,形成该字符串常量列表;第二记录单元用于当查找到用于对字符串进行引用的token时,记录该token及其在源代码中的位置,通过对所有这些token的标识和位置的记录,从而形成该字符串引用列表。

加密处理模块用于根据字符串常量列表对字符串常量进行加密处理。

具体来说是通过字符串常量列表所记录的标识,以及该token在源代码中的位置查找相应的字符串常量,并对该字符串常量进行加密处理,该模块包括字符串读取单元、加密计算单元和字符串替换单元。

字符串读取单元通过遍历字符串常量列表依次查找相应的字符串常量的位置,并从该位置读出该字符串常量;加密计算单元用于利用预设的加密混淆算法对读出的字符串常量进行加密处理,得到与相应字符串常量对应的加密字符串;字符串替换单元将该加密得到的加密字符串替换掉源代码中相应位置的字符串常量。从而使源代码中所有的字符串常量转换为加密后的加密字符串。

代码插入模块用于将相应的解密代码插入到源代码中。

在将所有字符串常量变换为加密字符串后,遍历该字符串引用列表,根据字符串引用列表中查找相应的加密字符串,这里的加密字符串是指对相应字符串常量进行加密处理后得到的字符,在确定该加密字符串的位置后,在该位置插入相应的解密代码。该解密代码是指能够以此为信息对加密字符串进行解密从而得到原来的字符串常量的密码,一般来说其来源于上述加密混淆算法在进行加密处理时所需要的加密代码。

从上述技术方案可以看出,本实施例提供了一种源代码中字符串的混淆装置,该装置应用于软件开发工具中,具体为利用clang工具对待混淆源代码进行编译,得到语法树;对语法树进行遍历,得到源代码中字符串的字符串常量列表和字符串引用列表;根据字符串常量列表中指示的位置读出字符串常量并加密处理,并以加密后的加密字符串替换原有的字符串常量;根据字符串引用列表查找加密字符串,并在加密字符串所在源代码中的位置插入解密代码。通过替换处理,使源代码中所有的字符串常量转换为加密后的加密字符串,而不再是可能会造成泄密的明文信息,从而避免了相应的安全风险。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本发明所提供的技术方案进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

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