符号混淆方法及装置与流程

文档序号:15216889发布日期:2018-08-21 16:57阅读:176来源:国知局

本发明涉及计算机安全领域,具体而言,涉及一种符号混淆方法及装置。



背景技术:

objective-c是一种面向对象的高级动态语言,开发者在编写oc程序时,会在代码中定义一些类(class),方法(selector),属性(property)等,这些符号往往具有极强的语义性,而经过编译之后这些符号并不会被消除,而是转化为一定格式的结构化数据,保存在二进制文件中,最终在运行该程序的时候,由oc运行时环境进行解析。由于这些符号具有语义性(如loginview一般代表登录界面)结合常见的反编译工具(如class-dump,ida-pro,hopperdisassembler),攻击者可以轻易地根据符号的含义分析出代码的逻辑,有针对性地对关键逻辑进行分析、破解,使应用面临外挂、盗版、渗透等安全问题。因此,为了提升应用被逆向破解的难度,需要对这些符号进行隐藏或、混淆、或者加密处理。由于oc运行时环境必须依赖这些符号,如果隐藏将导致程序无法执行,如果进行加密,则需要在运行时加载之前对其进行解密,但并不存在这样一种时机,因此唯一可行的方式就是对这些符号进行混淆处理,将其变为杂乱无意义的字符串,消除其语义性。

然而,现有技术基于源代码进行预处理,需要先手动整理符号列表,并修改源代码,对源代码和开发编译的过程有一定的侵入性。如果代码中新增了符号,需要手动添加进符号列表中。同时,由于是显式替换,对于代码中没有显式编写,而编译器自动生成并添加的符号将无法处理。



技术实现要素:

鉴于此,本发明实施例的目的在于提供一符号混淆方法及装置,用于将解决上述弊端。

第一方面,本发明实施例提供一种符号混淆方法,用于objective-c语言,所述方法包括:基于源代码文件对源代码进行编译,获取中间文件;获取所述中间文件的类型构造信息;基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号。

进一步地,所述基于源代码文件对源代码进行编译,获取中间文件,包括:基于至少一个源代码文件对源代码进行编译,获取至少一个第一中间文件;将所述至少一个第一中间文件进行合并,获取第二中间文件;将所述第二中间文件中赋值相同的全局变量进行合并,获取中间文件。

进一步地,所述基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号,包括:将所述类型构造信息中类的第一名称替换为第二名称;判断所述类型构造信息中类的方法列表中的第一方法名称是否满足第二预设替换原则,获取第一判断结果;在所述第一判断结果为否时,将所述第一方法名称替换为第二方法名称。

进一步地,所述基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号,还包括:将所述类型构造信息中类的属性列表中的第一属性名称替换为第二属性名称;判断所述类型构造信息中类的属列表中的第一ivar的类型名称是否与所述类型构造信息中类的第一名称相同,在为是时,将所述第一ivar的类型名称替换为所述第二名称;判断所述类型构造信息中类的属性列表中的getter方法的第三方法名称是否与所述第一方法名称相同,在为是时,将所述第三方法名称替换为所述第二方法名称;判断所述类型构造信息中类的属性列表中的setter方法的第四方法名称是否与所述第一方法名称相同,在为是时,将所述第四方法名称替换为所述第二方法名称。

进一步地,所述基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号,还包括:将所述所述类型构造信息中类的ivar列表中的第二ivar的第三名称直接替换为第四名称;判断所述所述类型构造信息中所述第二ivar的第三类型名称是否与所述第一名称相同,在为是时,将所述第三类型名称替换为所述第二名称。

第二方面,本发明实施例提供一种符号混淆装置,用于objective-c语言,所述装置包括:中间文件获取单元,用于基于源代码文件对源代码进行编译,获取中间文件;类型构造信息获取单元,用于获取所述中间文件的类型构造信息;符号替换单元,用于基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号。

进一步地,所述中间文件获取单元包括:第一获取单元,用于基于至少一个源代码文件对源代码进行编译,获取至少一个第一中间文件;第二获取单元,用于将所述至少一个第一中间文件进行合并,获取第二中间文件;第三获取单元,用于将所述第二中间文件中赋值相同的全局变量进行合并,获取中间文件。

进一步地,所述符号替换单元,包括:第一符号替换子单元,用于将所述类型构造信息中类的第一名称替换为第二名称;第一判断单元,用于判断所述类型构造信息中类的方法列表中的第一方法名称是否满足第二预设替换原则,获取第一判断结果;第二符号替换子单元,用于在所述第一判断结果为否时,将所述第一方法名称替换为第二方法名称。

进一步地,所述符号替换单元还包括:第三符号替换子单元,用于将所述类型构造信息中类的属性列表中的第一属性名称替换为第二属性名称;第四符号替换子单元,用于判断所述类型构造信息中类的属列表中的第一ivar的类型名称是否与所述类型构造信息中类的第一名称相同,在为是时,将所述第一ivar的类型名称替换为所述第二名称;第五符号替换子单元,用于判断所述类型构造信息中类的属性列表中的getter方法的第三方法名称是否与所述第一方法名称相同,在为是时,将所述第三方法名称替换为所述第二方法名称;第六符号替换子单元,用于判断所述类型构造信息中类的属性列表中的setter方法的第四方法名称是否与所述第一方法名称相同,在为是时,将所述第四方法名称替换为所述第二方法名称。

进一步地,所述符号替换单元,还包括:第七符号替换子单元,用于将所述所述类型构造信息中类的ivar列表中的第二ivar的第三名称直接替换为第四名称;第八符号替换子单元,用于判断所述所述类型构造信息中所述第二ivar的第三类型名称是否与所述第一名称相同,在为是时,将所述第三类型名称替换为所述第二名称。

本发明实施例提供了符号混淆方法及装置,所述方法包括:基于源代码文件对源代码进行编译,获取中间文件;获取所述中间文件的类型构造信息;基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号。本发明实施例通过对中间文件中的符号进行混淆处理,避免直接对源代码文件中的符号进行混淆理,无需人工提取符号,也无需修改源代码,对源代码文件无侵入性,支持对编译阶段自动添加的符号的混淆。

本发明的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明实施例了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本发明实施例提供的一种符号混淆方法流程图;

图2为本发明实施例提供的一种符号混淆装置的单元示意图;

图3为本发明实施例提供的一种中间文件获取单元的单元示意图;

图4为本发明实施例提供的一种实现符号混淆装置的结构示意图。

图标:210-中间文件获取单元;220-类型构造信息获取单元;230-符号替换单元;221-第一获取单元;222-第二获取单元;223-第三获取单元;401-处理器;402-存储器;403-通信接口。

具体实施方式

下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

请参照图1,图1为本发明实施例提供的一种符号混淆方法的流程图,用于objective-c语言,所述符号混淆方法具体包括如下步骤:

步骤s100:基于源代码文件对源代码进行编译,获取中间文件。

利用编译器对源代码文件中的源代码进行编译,经过编译器前端初步编译后产生的文件为中间文件,所述中间文件经过编译器的进一步编译,最终会生成目标机器的二进制文件,若直接对源代码中的符号进行符号混淆处理,需要先手动整理符号列表,并修改源代码,对源代码和开发编译的过程有一定的侵入性,如果代码中新增了符号,需要手动添加进符号列表中。同时,由于是显式替换,对于代码中没有显式编写,而编译器自动生成并添加的符号将无法处理,为了解决上述弊端,本发明实施例对中间文件进行符号混淆处理。

步骤s200:获取所述中间文件的类型构造信息。

从中间文件中解析出objective-c语言运行时的类型构造信息,其中,在本实施例中,所述类型构造信息包括:至少一个类中每个类(class)的父类、协议列表、方法列表、属性列表及ivar(类的成员变量)列表,以及每个分类(category)的协议列表、方法列表等,在其他实施中,所述类型构造信息也可以为其他。

步骤s300:基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号。

基于所述类型构造信息,判断所述中间文件的第一符号是否满足第一预设替换原则,在为是时,将所述第一符号自动替换为第二符号,在为否时,所述第一符号保持不变。

作为一种实施方式,所述基于源代码文件对源代码进行编译,获取中间文件,包括:

基于至少一个源代码文件对源代码进行编译,获取至少一个第一中间文件。

其中,对一个源代码文件中的源代码进行编译,产生一个第一中间文件,对多个源代码中的源代码进行编译,产生对个第一中间文件,一个源代码文件对应一个第一中间文件。

将所述至少一个第一中间文件进行合并,获取第二中间文件。

在本实施中,所述至少一个第一中间文件数大于等于2,需要使用编译器工具链中提供的链接工具将所述至少一个第一中间文件合并为一个第二中间文件,并且编译器工具链中提供的链接工具会自动解析所述至少一个第一中间文件中的符号引用关系,在其他实施例中,所述至少一个第一中间文件数也可以为其他值。

将所述第二中间文件中赋值相同的全局变量进行合并,获取中间文件。

由于第二中间文件是由至少一个第一中间文件合并后产生的,因此存在全局变量的赋值相同的情况,因此需要遍历所述第二中间文件中用于标识oc运行时信息的的全局变量,并将赋值相同的不同全局变量进行合并,例如全局变量a=3,全局变量b=3,因此,需要对全局变量a和b进行合并,因此,可以将全局变量b=3修改为a=3,并且在第二中间文件中的所有符号b替换为符号a,同理,也可以将全局变量a=3修改为b=3,并且将第二中间文件中的所有符号a替换为符号b,完成第二中间文件中的符号更新,最终获取中间文件。

作为一种实施方式,所述基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号,包括:

将所述类型构造信息中类的第一名称替换为第二名称。

将所述类型构造信息中类的第一名称替换为第二名称,完成类名的混淆。

判断所述类型构造信息中类的方法列表中的第一方法名称是否满足第二预设替换原则,获取第一判断结果。

在所述第一判断结果为否时,将所述第一方法名称替换为第二方法名称。

具体地,对于类中的方法列表,在将第一方法名称替换为第二方法名称之前,需要考虑如下情况:

a)如果该类继承自外部定义的类(nsobject除外),在第一方法的定义覆写了由外部定义的父类中的方法时,为了不破坏继承和覆写关系,因此不会对所述第一方法的名称进行符号混淆处理,即不会将所述第一方法名称替换为第二方法名称。

b)如果所述第一方法的名称与其实现的某个协议中的方法的名称相同,则说明所述第一方法是实现了协议中定义的接口,用于被外部代码调用,实现委托回调,不会对所述第一方法的名称进行符号混淆处理,即不会将所述第一方法名称替换为第二方法名称。

c)如果所述第一方法为覆写nsobject基类中的方法,不会对所述第一方法的名称进行符号混淆处理,即不会将所述第一方法名称替换为第二方法名称。

d)对于不满足以上三个条件的方法,可以直接混淆其名称。

作为一种实施方式,所述基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号,还包括:

将所述类型构造信息中类的属性列表中的第一属性名称替换为第二属性名称。

将所述类型构造信息中类的属性列表中的第一属性名称替换为第二属性名称,完成属性的名称混淆。

判断所述类型构造信息中类的属列表中的第一ivar的类型名称是否与所述类型构造信息中类的第一名称相同,在为是时,将所述第一ivar的类型名称替换为所述第二名称。

由于属性是对某一个ivar的封装,在属性的定义中指明了该ivar的类型以及getter(读取)/setter(赋值)方法的名称,由于在之前的步骤中已经将类的第一名称进行符号混淆处理,因此,在属性的定义中需要做相应的符号更新替换,即判断所述类型构造信息中类的属列表中的第一ivar的类型名称是否与所述类型构造信息中类的第一名称相同,在为是时,将所述第一ivar的类型名称替换为所述第二名称,在为否时,不会对所述第一ivar的类型名称作混淆处理。

判断所述类型构造信息中类的属性列表中的getter方法的第三方法名称是否与所述第一方法名称相同,在为是时,将所述第三方法名称替换为所述第二方法名称,在为否时,不会对所述第三方法名称作混淆处理。

判断所述类型构造信息中类的属性列表中的setter方法的第四方法名称是否与所述第一方法名称相同,在为是时,将所述第四方法名称替换为所述第二方法名称,在为否时,不会对所述第四方法名称作混淆处理。

作为一种实施方式,所述基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号,还包括:

将所述所述类型构造信息中类的ivar列表中的第二ivar的第三名称直接替换为第四名称。

将所述所述类型构造信息中类的ivar列表中的成员变量的名称直接替换为新的名称,完成符号混淆处理。

判断所述所述类型构造信息中所述第二ivar的第三类型名称是否与所述第一名称相同,在为是时,将所述第三类型名称替换为所述第二名称。

由于在之前的步骤中已经将类的第一名称进行符号混淆处理,同时由于ivar的定义中包含了成员变量的类型的定义,因此,在ivar的定义中需要做相应的符号更新替换,即判断所述所述类型构造信息中所述第二ivar的第三类型名称是否与所述第一名称相同,在为是时,将所述第三类型名称替换为所述第二名称,在为否时,不会对所述第三类型名称作符号混淆处理。

作为一种实施方式,所述所述类型构造信息中还包括每个分类的协议列表、方法列表等信息。

针对所述类型构造信息中的每个分类的名称,直接将每个分类的名称中的字符替换为随机字符,因此实现分类名称的符号混淆处理。

针对所述类型构造信息中每个分类中的协议列表中的协议名称,直接将协议列表中协议名称中的字符替换为随机字符,因此实现分类名称的符号混淆处理。

针对所述类型构造信息中每个分类中的方法列表中的方法名称与其实现的某个协议中的方法名称相同,则说明该方法是实现了协议中定义的接口,用于被外部代码调用,实现委托回调,因此对该方法名称不进行混淆处理,相反,则将该方法名称中的符号替换为随机字符。

经过以上步骤处理后,中间文件中的oc符号均已被自动替换为随机字符,实现混淆效果。同时,由于处理后的中间文件被编译为二进制文件之后,二进制文件中的符号依然是由混淆之后的随机字符组成,若通过反编译工具查看,将无法再看到具有语义性的符号名称。

为实现上述符号混淆方法,本发明实施例提供一种符号混淆装置,用于objective-c语言,请参照图2,图2为本发明实施例提供的一种符号混淆装置的单元示意图,所述符号混淆装置包括:中间文件获取单元210,类型构造信息获取单元220,符号替换单元230。

中间文件获取单元210,用于基于源代码文件对源代码进行编译,获取中间文件。

类型构造信息获取单元220,用于获取所述中间文件的类型构造信息。

符号替换单元230,用于基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号。

请参照图3,作为一种实施方式,所述中间文件获取单元210包括:第一获取单元221,第二获取单元222,第三获取单元223。

第一获取单元221,用于基于至少一个源代码文件对源代码进行编译,获取至少一个第一中间文件。

第二获取单元222,用于将所述至少一个第一中间文件进行合并,获取第二中间文件。

第三获取单元223,用于将所述第二中间文件中赋值相同的全局变量进行合并,获取中间文件。

作为一种实施方式,所述符号替换单元230,包括:第一符号替换子单元,第一判断判断单元,第二符号替换子单元。

第一符号替换子单元,用于将所述类型构造信息中类的第一名称替换为第二名称。

第一判断判断单元,用于判断所述类型构造信息中类的方法列表中的第一方法名称是否满足第二预设替换原则,获取第一判断结果。

第二符号替换子单元,用于在所述第一判断结果为否时,将所述第一方法名称替换为第二方法名称。

作为一种实施方式,所述符号替换单元230还包括:第三符号替换子单元,第四符号替换子单元,第五符号替换子单元,第六符号替换子单元。

第三符号替换子单元,用于将所述类型构造信息中类的属性列表中的第一属性名称替换为第二属性名称。

第四符号替换子单元,用于判断所述类型构造信息中类的属列表中的第一ivar的类型名称是否与所述类型构造信息中类的第一名称相同,在为是时,将所述第一ivar的类型名称替换为所述第二名称。

第五符号替换子单元,用于判断所述类型构造信息中类的属性列表中的getter方法的第三方法名称是否与所述第一方法名称相同,在为是时,将所述第三方法名称替换为所述第二方法名称。

第六符号替换子单元,用于判断所述类型构造信息中类的属性列表中的setter方法的第四方法名称是否与所述第一方法名称相同,在为是时,将所述第四方法名称替换为所述第二方法名称。

作为一种实施方式,所述符号替换单元230,还包括:第七符号替换子单元和第八符号替换子单元。

第七符号替换子单元,用于将所述所述类型构造信息中类的ivar列表中的第二ivar的第三名称直接替换为第四名称。

第八符号替换子单元,用于判断所述所述类型构造信息中所述第二ivar的第三类型名称是否与所述第一名称相同,在为是时,将所述第三类型名称替换为所述第二名称。

请参照图4,图4为本发明实施例还提供一种实现符号混淆装置的结构示意图,其采用通用计算机系统结构,包括总线、处理器401、存储器402和通信接口403,执行本发明方案的程序代码保存在存储器402中,并由处理器401来控制执行。

总线可包括一通路,在计算机各个部件之间传送信息。

存储器402可以存储各种软件程序以及单元,如本申请实施例提供的符号混淆方法及装置对应的程序指令/单元。处理器401通过运行存储在存储器402中的软件程序以及单元,从而执行各种功能应用以及数据处理,即实现本申请实施例中的竞拍交易方法。存储器402可以包括但不限于随机存取存储器(randomaccessmemory,ram),只读存储器(readonlymemory,rom),可编程只读存储器(programmableread-onlymemory,prom),可擦除只读存储器(erasableprogrammableread-onlymemory,eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,eeprom)等。

处理器401可以是一种集成电路芯片,具有信号处理能力。上述处理器401可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)、微处理器、特定应用集成电路(application-specificintegratedcircuit,asic)、或一个或多个用于控制本发明方案程序执行的集成电路。计算机系统中包括的一个或多个存储器402,可以是只读存储器(read-onlymemory,rom)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(randomaccessmemory,ram)或者可存储信息和指令的其他类型的动态存储设备,也可以是磁盘存储器。这些存储器402通过总线与处理器401相连接。

通信接口403,可以使用任何收发器一类的装置,以便与其他设备或通信网络,如以太网、无线接入网(ran)、无线局域网(wlan)等。

本发明实施例还提供了一种计算机可读取存储介质,用于存储实现符号混淆装置所用的计算机软件指令,其包括用于执行上述方法实施例所涉及的程序。通过执行存储程序,避免直接对源代码文件中的符号进行混淆理,无需人工提取符号,也无需修改源代码,对源代码文件无侵入性,支持对编译阶段自动添加的符号的混淆。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的符号混淆装置的具体工作过程,可以参考前述符号混淆方法中的对应过程,在此不再过多赘述。

综上所述,本发明实施例提供了符号混淆方法及装置,所述方法包括:基于源代码文件对源代码进行编译,获取中间文件;获取所述中间文件的类型构造信息;基于所述类型构造信息和第一预设替换原则,将所述中间文件中的第一符号自动替换为第二符号。本发明实施例通过对中间文件中的符号进行混淆处理,避免直接对源代码文件中的符号进行混淆理,无需人工提取符号,也无需修改源代码,对源代码文件无侵入性,支持对编译阶段自动添加的符号的混淆。

在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

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

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