IOS中保护钥匙串数据的方法、存储介质、设备及系统与流程

文档序号:17479390发布日期:2019-04-20 06:20阅读:362来源:国知局
IOS中保护钥匙串数据的方法、存储介质、设备及系统与流程

本发明涉及ios的数据保护技术领域,具体来讲是一种ios中保护钥匙串数据的方法、存储介质、设备及系统。



背景技术:

目前,随着移动设备的日益普及,移动应用产业尤其是ios应用得到飞速的发展,同时其开发模式和代码框架也都发生了巨大的变化。对于ios平台来说,其程序又分为主程序和模块文件,而模块文件则是dylib文件(dylib文件是ios平台上的动态链接库文件,类似于windows平台上的dll文件,类似于android平台的so文件)。

通常,对于需要编写一些功能模块注入到对应的进程中时,都是编写一个dylib文件,然后将该dylib文件注入到对应的进程中运行。而对于一些想要获取另一个ios应用的数据时也都是编写一个dylib文件。同时,ios也希望能够免输入密码账号进行登录的功能,由于ios系统存储的数据都是在sandbox里面,一旦删除app,则sandbox也不存在了,为此苹果对开发者提供了一个keychain(钥匙串),其用于提供存储一些私密数据如密码、证书等方便用户免输入密码账号等进行登录。所以,ios系统的应用开发者通常会使用钥匙串来存储关键数据。但是,一旦黑客通过注入dylib文件可以读取到钥匙串中保存的关键数据,这就会给用户造成严重的损失,安全风险较大。

因此,如何有效防止黑客程序读取ios的钥匙串中的绝密数据,保护钥匙串数据的安全性是本领域技术人员亟待解决的问题。



技术实现要素:

本发明的目的是为了克服上述背景技术的不足,提供一种ios中保护钥匙串数据的方法、存储介质、设备及系统,通过对钥匙串数据的访问者进行校验,有效防止黑客程序读取钥匙串中的绝密数据,保护了钥匙串数据的安全性。

为达到以上目的,本发明采取的技术方案是:提供一种ios中保护钥匙串数据的方法,该方法包括以下步骤:

s1、在当前ios系统中创设hook功能,该hook功能用于实现:在原函数内加入新方法,并通过方法的绑定使得原函数被调用时会被拦截并执行加入的新方法;

s2、获取当前ios系统中已有的用于读取钥匙串数据的读取函数;

s3、获取当前ios系统中已有的用于获取当前函数调用堆栈信息的堆栈信息函数;

s4、使用创设的hook功能,对获取的读取函数进行hook,使得该读取函数的实现方法被替换为加入有堆栈信息函数的自定义实现方法;

s5、每当读取函数的实现方法被调用时,会被拦截并执行加入有堆栈信息函数的自定义实现方法,从而获取到当前调用读取函数的调用堆栈信息;

s6、将获取到的调用堆栈信息上报至服务器进行合法性校验。

在上述技术方案的基础上,步骤s1具体包括以下操作:在当前ios系统中创建hook功能,并对该hook功能的实现进行设置,使其完成以下操作:通过传入参数和方法名获取原函数的类方法;根据获取的类方法的方法名,获取到该类方法所对应的imp指针;在原函数中添加需要加入的新方法;通过替换原函数的类方法所对应的imp指针,将新方法与原函数进行绑定,使得原函数被调用时会被拦截并执行该新方法。

在上述技术方案的基础上,步骤s4中,使用创设的hook功能,对获取的用于读取钥匙串数据的读取函数进行hook的具体操作如下:根据读取函数的类名和该读取函数的实现方法名,获取该读取函数的实现方法;根据获取到的实现方法,获取该实现方法所对应的imp指针;在读取函数中增设一个加入有堆栈信息函数的自定义实现方法;通过替换读取函数的实现方法所对应的imp指针,将自定义实现方法与读取函数进行绑定,使得该读取函数的实现方法被替换为加入有堆栈信息函数的自定义实现方法。

在上述技术方案的基础上,服务器进行合法性校验的具体操作为:服务器接收到上报的调用堆栈信息后,将该调用堆栈信息与预设好的正确信息列表进行比对;一旦上报的调用堆栈信息不在该正确信息列表中,则说明此读取操作不合法,服务器对该读取操作进行封禁或其他阻止措施。

本发明还提供一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述ios中保护钥匙串数据的方法的步骤。

本发明还提供一种ios中保护钥匙串数据的设备,包括存储器、处理器及存储在存储器上并在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述ios中保护钥匙串数据的方法的步骤。

本发明还提供一种ios中保护钥匙串数据的系统,该系统包括hook功能创设模块、读取函数获取模块、堆栈信息函数获取模块、读取函数hook模块、堆栈信息获取模块和堆栈信息上报模块;

所述hook功能创设模块用于:在当前ios系统中创设hook功能,该hook功能用于实现:在原函数内加入新方法,并通过方法的绑定使得原函数被调用时会被拦截并执行加入的新方法;

所述读取函数获取模块用于:获取当前ios系统中已有的用于读取钥匙串数据的读取函数;

所述堆栈信息函数获取模块用于:获取当前ios系统中已有的用于获取当前函数调用堆栈信息的堆栈信息函数;

所述读取函数hook模块用于:使用创设的hook功能,对获取的读取函数进行hook,使得该读取函数的实现方法被替换为加入有堆栈信息函数的自定义实现方法;

所述堆栈信息获取模块用于:每当读取函数的实现方法被调用时,会被拦截并执行加入有堆栈信息函数的自定义实现方法,从而获取到当前调用读取函数的调用堆栈信息;

所述堆栈信息上报模块用于:将获取到的调用堆栈信息上报至服务器进行合法性校验。

在上述技术方案的基础上,所述hook功能创设模块创设hook功能的具体流程为:在当前ios系统中创建hook功能,并对该hook功能的实现进行设置,使其完成以下操作:通过传入参数和方法名获取原函数的类方法;根据获取的类方法的方法名,获取到该类方法所对应的imp指针;在原函数中添加需要加入的新方法;通过替换原函数的类方法所对应的imp指针,将新方法与原函数进行绑定,使得原函数被调用时会被拦截并执行该新方法。

在上述技术方案的基础上,所述读取函数hook模块使用创设的hook功能,对获取的用于读取钥匙串数据的读取函数进行hook的具体流程为:根据读取函数的类名和该读取函数的实现方法名,获取该读取函数的实现方法;根据获取到的实现方法,获取该实现方法所对应的imp指针;在读取函数中增设一个加入有堆栈信息函数的自定义实现方法;通过替换读取函数的实现方法所对应的imp指针,将自定义实现方法与读取函数进行绑定,使得该读取函数的实现方法被替换为加入有堆栈信息函数的自定义实现方法。

在上述技术方案的基础上,服务器进行合法性校验的具体操作为:服务器接收到上报的调用堆栈信息后,将该调用堆栈信息与预设好的正确信息列表进行比对;一旦上报的调用堆栈信息不在该正确信息列表中,则说明此读取操作不合法,服务器对该读取操作进行封禁或其他阻止措施。

本发明的有益效果在于:

本发明中,通过创设的hook功能对系统的读取钥匙串的功能进行hook,使得该读取函数的实现方法被替换为加入有用于获取当前函数调用堆栈信息的堆栈信息函数的自定义实现方法,该自定义实现方法能在实现钥匙串数据读取功能的同时实现调用堆栈信息的获取功能。每当用于读取钥匙串数据的读取函数的实现方法被调用时,会被拦截并执行加入有堆栈信息函数的自定义实现方法,从而获取到当前调用读取函数的调用堆栈信息,也就是说,知道了是哪些函数在读取钥匙串数据;再将获取到的调用堆栈信息上报至服务器进行合法性校验。

与现有技术相比,本发明能实现对钥匙串数据的访问者进行校验的目的,从而有效防止黑客通过注入一个dylib文件读取到钥匙串中保存的敏感数据,进而有效保护了钥匙串数据的安全性。

附图说明

图1为本发明实施例中ios中保护钥匙串数据的方法的流程图;

图2为selector的名字和方法实现imp映射关系的示意图;

图3为本发明实施例中ios中保护钥匙串数据的设备的结构示意图;

图4为本发明实施例中ios中保护钥匙串数据的系统的结构框图。

具体实施方式

下面结合附图及具体实施例对本发明作进一步的详细描述。

本发明的设计思路是:事先编写一个hook(钩子拦截)功能,该hook功能能在原函数内加入新的方法,并通过方法的绑定使得原函数被调用时会被拦截并执行加入的新的方法;然后,利用编写好的hook功能对系统的读取钥匙串数据的读取函数进行hook,在该读取函数内加入获取当前函数调用堆栈信息的函数,从而获取到所有读取钥匙串数据的函数调用堆栈信息;再将获取的读取钥匙串数据的函数调用堆栈信息上报给服务器进行合法性校验,对不符合合法性要求的读取操作进行封禁,从而达到有效防止黑客程序读取钥匙串中的绝密数据的目的,保护了钥匙串数据的安全性。

基于上述设计思路,参见图1所示,本发明实施例提供一种ios中保护钥匙串数据的方法,该方法包括以下步骤:

步骤s1、hook功能的创设:在当前ios系统中创设一个hook功能,该hook功能用于实现:在原函数内加入新方法,并通过方法的绑定使得原函数被调用时会被拦截并执行加入的新方法。

可以理解的是,ios的程序代码是使用objective-c编程语言来编写的。在objective-c中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector(选择器)的名字(如selectora、selectorb、selectorc等)。利用objective-c的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。而每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系,如图2所示;而其中的imp有点类似函数指针,其用于指向具体的method实现。因此,利用上述原理可实现步骤s1中hook功能的创设。

具体来说,在一种实施方式中,步骤s1具体包括以下操作:在当前ios系统中创建一个hook功能,并对该hook功能的实现进行设置,使其完成以下操作:

1、通过传入参数和方法名获取原函数的类方法。其实现代码的原型结构可如下:methodclass_getinstancemethod(classcls,selname);通过传入参数cls和方法名name来得到原函数的类方法。

2、根据获取的类方法的方法名,获取到该类方法所对应的imp指针。其实现代码的原型结构可如下:impmethod_getimplementation(methodm);通过传入方法名m获取对应的imp指针。

3、在原函数中添加需要加入的新方法。其实现代码的原型结构可如下:boolclass_addmethod(classcls,selname,impimp,constcharchar*types);通过参数cls类名,方法名name,以及方法的imp和方法类型,从而在一个原函数中添加一个方法。

4、通过替换原函数的类方法所对应的imp指针,将新方法与原函数进行绑定,即将原函数的类方法替换为加入的新方法,从而实现hook功能。其实现代码的原型结构可如下:impclass_replacemethod(classcls,selname,impimp,constcharchar*types);通过参数cls类名,方法名name,以及方法的imp和方法类型来实现替换的功能,从而对原函数的类方法进行了hook。

通过上述操作,我们就完成了hook功能事先创设;接下来,我们就只需将创设好的hook功能应用到ios系统的读取钥匙串数据的读取函数中进行hook即可。

步骤s2、读取函数的获取:获取当前ios系统中已有的用于读取钥匙串数据的读取函数。该步骤s2中需要获取当前ios系统中用于读取钥匙串数据的读取函数,是因为获取到读取函数后,就可以根据该读取函数进一步获取该读取函数的类方法、类方法的imp指针等信息,从而为后续的读取函数的hook做准备。

可以理解的是,在ios系统中提供了这样一些api函数来实现将数据存储到钥匙串和从钥匙串读取数据的功能。因此,我们获取当前ios系统中已有的用于读取钥匙串数据的读取函数时,也就是获取实现读取钥匙串数据的api函数。而目前,在ios系统中实现写入、读取钥匙串数据的实现功能通常如下:

1、写入钥匙串数据的实现功能:

通过调用苹果平台提供的类uickeychainstore中的方法keychainstorewithservice来定义一个钥匙串对象。具体代码如下:

uickeychainstore*keychain=

[uickeychainstorekeychainstorewithservice:@"应用名称"];

其中,传入一个字符串参数“应用名称”本文则取名为此应用的名称作为钥匙串的对象名称,此名称在后续读取钥匙串时也会用到,只要写入和读取达到一致即可。

然后将敏感数据写入到创建的钥匙串对象中。具体代码如下:

keychain[@"密码"]=@"01234567";

其中,钥匙串是写入键值对的形式,其中键值是“密码”,而值则是“01234567”,代表具体的密码值,为了安全起见该值可以进行加密后再写入。

2、读取钥匙串数据的实现功能:

当要从钥匙串读取数据时则首先也会定义一个钥匙串的对象,同时钥匙串的对象名称则必须使用和写入时的钥匙串的对象的名称相同,否则不会读取到之前存储的数据,对应于上文则也是“应用名称”。具体代码如下:

uickeychainstore*keychainstore=[uickeychainstorekeychainstorewithservice:@"应用名称"];

然后从钥匙串对象中获取数据,具体代码如下:

nsstring*pass=[keychainstorestringforkey:@"密码"];

此例中是从钥匙串对象中使用键值为“密码”来读取钥匙串存储的密码数据。

从上述内容可知,我们要获取的读取钥匙串数据的读取函数即为上文中的uickeychainstore类的函数,具体来说,其实现方法即为上文中的keychainstorewithservice方法。

步骤s3、堆栈信息函数的获取:获取当前ios系统中已有的用于获取当前函数调用堆栈信息的堆栈信息函数。同样,该步骤s3中需要获取当前ios系统中的堆栈信息函数,也是为后续的在读取函数中加入堆栈信息函数进行hook做准备。

可以理解的是,在ios系统中提供了获取当前函数调用堆栈的功能,用于获取当前函数的调用堆栈信息。具体则是使用ios系统已有的api函数backtrace来获取函数的调用堆栈,然后,调用api函数backtrace_symbols来获取函数的名称信息。

函数backtrace原型如下:

intbacktrace(void**buffer,intsize);

其中,参数void**buffer用于接受函数调用堆栈的所有函数的内存地址;参数intsize用于告诉此函数只取多少层的堆栈信息;返回值则是实际获取到的堆栈层数。

函数backtrace_symbols原型如下:

char**backtrace_symbols(void*const*buffer,intsize);

其中,参数void*const*buffer用来接收backtrace函数所获取到的函数调用堆栈的内存地址;参数intsize则指明函数的堆栈层数;返回值char**则会存储所有的函数调用堆栈的内存地址对应的函数名称信息,具体则是函数的名称是什么。

通过以上的2个函数的调用则可以获取到函数调用堆栈的具体名称信息。也就是说,在后续对用于读取钥匙串数据的读取函数进行hook后,通过加入的堆栈信息函数即可得到所有读取钥匙串数据的函数的具体名称信息。

步骤s4、读取函数的hook:使用步骤s1中创设的hook功能,对获取的用于读取钥匙串数据的读取函数进行hook,使得该读取函数的实现方法被替换为加入有用于获取当前函数调用堆栈信息的堆栈信息函数的自定义实现方法,该自定义实现方法能在实现钥匙串数据读取功能的同时实现调用堆栈信息的获取功能。

具体来说,在一种实施方式中,使用步骤s1中创设的hook功能,对获取的用于读取钥匙串数据的读取函数进行hook的具体操作如下:

1、根据读取函数的类名(uickeychainstore类)和该读取函数的实现方法名(keychainstorewithservice),获取该读取函数的实现方法;

2、根据获取到的实现方法,获取该实现方法所对应的imp指针;

3、在读取函数中增设一个加入有堆栈信息函数的自定义实现方法;

4、通过替换读取函数的实现方法所对应的imp指针,将自定义实现方法与读取函数进行绑定,即将读取函数的实现方法替换为加入有堆栈信息函数的自定义实现方法,从而实现hook功能。

步骤s5、调用堆栈信息的获取:每当用于读取钥匙串数据的读取函数的实现方法被调用时,会被拦截并执行加入有堆栈信息函数的自定义实现方法,从而获取到当前调用读取函数的调用堆栈信息,也就是说,知道了是哪些函数在读取钥匙串数据。

步骤s6、调用堆栈信息的上报:将获取到的调用堆栈信息上报至服务器进行合法性校验。举例来说,在实际操作中,服务器进行合法性校验的具体操作可如下:服务器接收到上报的调用堆栈信息后,将该调用堆栈信息与预设好的正确信息列表进行比对;一旦上报的调用堆栈信息不在该正确信息列表中,则说明此读取操作不合法,服务器将对该读取操作进行封禁或其他阻止措施。

利用上述方法可以实现对钥匙串数据的有效保护,通过创设的hook功能对系统的读取钥匙串的功能进行hook,从而对所有调用钥匙串的调用者进行合法性判断,有效防止黑客程序读取钥匙串中的绝密数据,保护了钥匙串数据的安全性。

对应上述的ios中保护钥匙串数据的方法,本发明实施例还提供一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时可实现上述各实施例中的ios中保护钥匙串数据的方法的步骤。需要说明的是,所述存储介质包括u盘、移动硬盘、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随机存取存储器)、磁碟或者光盘等各种可以存储程序代码的介质。

另外,参见图3所示,对应上述的ios中保护钥匙串数据的方法,本发明实施例还提供一种ios中保护钥匙串数据的设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行计算机程序时可实现上述各实施例中的ios中保护钥匙串数据的方法的步骤。

参见图4所示,本发明实施例还提供一种ios中保护钥匙串数据的系统,该系统包括hook功能创设模块、读取函数获取模块、堆栈信息函数获取模块、读取函数hook模块、堆栈信息获取模块和堆栈信息上报模块。

其中,hook功能创设模块用于:在当前ios系统中创设hook功能,该hook功能用于实现:在原函数内加入新方法,并通过方法的绑定使得原函数被调用时会被拦截并执行加入的新方法;

读取函数获取模块用于:获取当前ios系统中已有的用于读取钥匙串数据的读取函数;

堆栈信息函数获取模块用于:获取当前ios系统中已有的用于获取当前函数调用堆栈信息的堆栈信息函数;

读取函数hook模块用于:使用创设的hook功能,对获取的读取函数进行hook,使得该读取函数的实现方法被替换为加入有堆栈信息函数的自定义实现方法;

堆栈信息获取模块用于:每当读取函数的实现方法被调用时,会被拦截并执行加入有堆栈信息函数的自定义实现方法,从而获取到当前调用读取函数的调用堆栈信息;

堆栈信息上报模块用于:将获取到的调用堆栈信息上报至服务器进行合法性校验。

可以理解的是,ios中保护钥匙串数据的系统的各功能模块的具体实现流程是与上文os中保护钥匙串数据的方法的各步骤详细流程一一对应的,此处不再赘述。

需要说明的是:上述实施例提供的系统在ios系统中实现对钥匙串数据的保护时,仅以上述各功能模块的划分进行举例说明,实际应用中,可根据需要而将上述功能分配由不同的功能模块完成,即将系统的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。

本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

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