一种保护函数调用的方法及装置与流程

文档序号:11156103阅读:299来源:国知局
一种保护函数调用的方法及装置与制造工艺

本发明涉及通信技术领域,尤其涉及一种保护函数调用的方法及装置。



背景技术:

目前,对于Android应用程序开发,大多数Android应用开发者会将比较重要的功能使用C语言或者C++语言来编写,这样可以显著的提高程序的安全性。

而对于HACK来说,是可以通过逆向的方法分析到Android应用程序通过调用的动态库SO文件中的函数对加密数据进行解密的,一旦分析清楚了解密函数的调用后,HACK也可以模拟正常的Android程序一样,通过调用解密函数来获取到明文数据,降低了安全性。



技术实现要素:

针对现有技术存在的问题,本发明实施例提供了一种保护函数调用的方法及装置,用于解决现有技术中在调用函数时,调用方法容易被破解,导致数据安全性降低的技术问题。

本发明提供一种保护函数调用的方法,所述方法包括:

检测所述函数的调用者信息;

基于所述调用者信息判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用。

上述方案中,所述检测所述函数的调用者信息,判断所述调用者是否为正常用户,包括:

建立第一全局变量及第二全局变量;

在调用所述函数之前,利用哈希算法计算所述第一全局变量的第一哈希值;

在调用所述函数时,利用所述哈希算法计算所述第二全局变量的第二哈希值;

判断所述第一哈希值与所述第二哈希值是否一致,若不一致,则确定所述调用者不是正常用户。

上述方案中,所述建立第一全局变量及第二全局变量之前,所述方法还包括:

构造数据结构;

将所述数据结构设置为所述函数的调用参数类型。

上述方案中,所述第一全局变量的初始值与所述第二全局变量的初始值相同。

上述方案中,所述检测所述函数的调用者信息,判断所述调用者是否为正常用户,还包括:

获取所述函数的调用链信息;

判断所述调用链信息与预设的调用链信息是否一致;

若所述调用链信息与所述预设的调用链信息不一致,则确定所述调用者不是正常用户。

上述方案中,所述获取所述函数的调用链信息,包括:

获取用于存储所述调用链信息内存地址的参数buffer;

利用转化函数将所述内存地址转化为函数名称信息;

基于所述函数名称信息获取所述函数调用链的函数名称信息;

基于所述函数调用链的函数名称信息获取所述函数的调用链信息。

本发明还提供一种保护函数调用的装置,所述装置包括:

检测单元,用于检测所述函数的调用者信息;

判断单元,用于基于所述调用者信息判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用。

上述方案中,所述检测单元用于:

建立第一全局变量及第二全局变量;

在调用所述函数之前,利用哈希算法计算所述第一全局变量的第一哈希值;

在调用所述函数时,利用所述哈希算法计算所述第二全局变量的第二哈希值;

所述判断单元用于:判断所述第一哈希值与所述第二哈希值是否一致,若不一致,则确定所述调用者不是正常用户。

上述方案中,所述装置还包括:

构造单元,用于构造数据结构;

设置单元,用于将所述数据结构设置为所述函数的调用参数类型。

上述方案中,所述检测单元还用于:获取所述函数的调用链信息;

所述判断单元还用于:判断所述调用链信息与预设的调用链信息是否一致;

若所述调用链信息与所述预设的调用链信息不一致,则确定所述调用者不是正常用户。

本发明提供了一种保护函数调用的方法及装置,所述方法包括:检测所述函数的调用者信息;基于所述调用者信息判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用;如此,在调用函数之前首先根据调用者信息判断调用者是否为正常用户,若不是正常用户,则断开此次调用过程,这样就避免出现非法调用函数的情况,从而提高了数据的安全性。

附图说明

图1为本发明实施例一提供的保护函数调用的方法流程示意图;

图2为本发明实施例二提供的保护函数调用的装置结构示意图。

具体实施方式

为了在调用函数时,解决调用方法容易被破解,导致数据安全性降低的技术问题,本发明提供了一种保护函数调用的方法及装置,所述方法包括:检测所述函数的调用者信息;基于所述调用者信息判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用。

下面通过附图及具体实施例对本发明的技术方案做进一步的详细说明。

实施例一

本实施例提供一种保护函数调用的方法,如图1所示,所述方法包括:

S101,检测所述函数的调用者信息。

本步骤中,所述函数一般为重点函数,比如数据解密函数等,在检测所述函数的调用者信息时,可以通过两种方法来检测,第一种是通过设置全局变量的方法来检测所述函数的调用者信息;第二种是通过检测函数的调用堆栈信息,获取调用链信息来检测所述函数的调用者信息。

具体地,当通过设置全局变量的方法来检测所述函数的调用者信息时,具体包括:在动态库SO文件中建立第一全局变量variable1及第二全局变量variable2;所述第一全局变量variable1及第二全局变量variable2的初始值相同,本实施例中,将所述第一全局变量variable1及第二全局变量variable2的初始值赋值为0。

在调用所述函数之前,利用哈希HASH算法计算所述第一全局变量vable1的第一哈希值;具体地,利用函数variable1=HASH(variable1)计算所述第一哈希值。

在调用所述函数时,利用所述哈希HASH算法计算所述第二全局变量的第二哈希值;具体地,利用函数variable2=HASH(variable2)计算所述第二哈希值。这里,所述哈希HASH算法可以包括:MD5函数算法、MD4函数算法或SHA-1函数算法。

这里,为了使得函数本身的逻辑更为复杂,避免轻易被破解,在建立第一全局变量及第二全局变量之前,所述方法还包括:构造数据结构;并将所述数据结构设置为所述函数的参数类型,所述数据结构可以为较为复杂的数据结构,比如:类结构、STL的数据结构或list数据结构。

以解密函数来说,解密函数的参数包括:传递密文信息的参数及传送明文信息的参数;那么就可以将这两个参数构造成一个数据结构,比如C++的类结构,因为类结构会比简单的数据类型传递参数要复杂些。当然,也可以使用STL的数据结构,比如利用MAP来存储需要解密的字符串,或者是list这种结构来存储解密后的明文信息的传出参数等。其中,所述MAP是一种关联容器,存是储相结合形成的一个关键值和映射值的元素。

这样,就可以把函数的调用参数变得更为复杂。

而通过检测函数的调用堆栈信息,获取调用链信息来检测所述函数的调用者信息时,具体包括:

通过系统函数int backtrace(void**buffer,int size)获取用于存储所述调用链信息内存地址的参数buffer;所述buffer中存储的是上层函数的调用地址,是一个内存地址;

然后利用转化函数char**backtrace_symbols(void*const*buffer,int size)将所述内存地址转化为函数名称信息;基于所述函数名称信息获取所述函数调用链的函数名称信息;将所述函数名称信息上传至服务器中,所述服务器就可以基于所述函数调用链的函数名称信息获取所述函数的调用链信息。

为了更清楚地阐述调用链信息,这里举例说明:函数调用链是指当前的函数是从上层函数调用过来的,这个调用过程就是函数调用链;比如:函数A调用函数B再调用函数C,那么在函数C中可以获取到的调用链新就是函数C、B、A,由此可以知道当前的函数最起始调用点是函数A。

S102,判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用。

本步骤中,有两种方法来判断所述调用者是否为正常用户;第一种方法是:根据第一哈希值及第二哈希值来判断所述调用者是否为正常用户;第二种方法是根据函数调用链信息来判断所述调用者是否为正常用户。

具体地,当根据第一哈希值及第二哈希值来判断所述调用者是否为正常用户时,具体包括:判断所述第一哈希值与所述第二哈希值是否一致,若所述第一哈希值与所述第二哈希值不一致,则确定所述调用者不是正常用户。这里是因为在正常的调用程序下,由于两个全局变量的初始化的值一样,并且变量计算HASH的次数也一样,所以两个变量的值总是相等的。因此,一旦所述第一哈希值与所述第二哈希不一致时,即可确定调用者不是正常用户,此时,断开此次调用过程,并将所述第一哈希值与所述第二哈希值通过加密算法加密后发送到服务器,服务器接收到该信息后,将所述调用者标记为异常用户。

当根据函数调用链信息来判断所述调用者是否为正常用户时,具体包括:获取所述函数的调用链信息;判断所述调用链信息与预设的调用链信息是否一致;若所述调用链信息与所述预设的调用链信息不一致,则确定所述调用者不是正常用户。

这里,如上述步骤所述,当获取到函数名称信息后,服务器可以通过正常的客户端基于所述函数名称信息获取到正常的函数调用链信息,如果服务器确定当前的调用链信息与预设的调用链信息(正常的调用链信息)不同时,即可则可以确定调用者不是正常用户,此时,断开此次调用过程,并将所述调用者标记为异常用户。

比如,现在有三个函数FuncA、FuncB、FuncC;调用关系是:FuncA中会调用FuncB,FuncB中会调用FuncC那么在函数C中获取到的函数调用链信息是FuncB->FuncA。

而对于非法用户来说,可能也会调用FuncC,那么他的函数可能是FuncX,那么在函数C中获取到的函数调用链信息是FuncX。显然这两种种函数调用链信息是不一致的,则服务器获取到两种调用链信息后,可以确定第二种是一个非法调用,将所述调用者标记为异常用户。

实施例二

相应于实施例一,本实施例还提供一种保护函数调用的装置,参见图2,所述装置包括:检测单元21及判断单元22;其中,

所述检测单元21用于检测所述函数的调用者信息;

所述判断单元22用于基于所述调用者信息判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用。

在检测所述函数的调用者信息时,所述检测单元21可以通过两种方法来检测,第一种是通过设置全局变量的方法来检测所述函数的调用者信息;第二种是通过检测函数的调用堆栈信息,获取调用链信息来检测所述函数的调用者信息。

具体地,所述检测单元21当通过设置全局变量的方法来检测所述函数的调用者信息时,具体包括:在动态库SO文件中建立第一全局变量variable1及第二全局变量variable2;所述第一全局变量variable1及第二全局变量variable2的初始值相同,本实施例中,将所述第一全局变量variable1及第二全局变量variable2的初始值赋值为0。

在调用所述函数之前,所述检测单元21利用哈希HASH算法计算所述第一全局变量vable1的第一哈希值;具体地,利用函数variable1=HASH(variable1)计算所述第一哈希值。

在调用所述函数时,利用所述哈希HASH算法计算所述第二全局变量的第二哈希值;具体地,利用函数variable2=HASH(variable2)计算所述第二哈希值。这里,所述哈希HASH算法可以包括:MD5函数算法、MD4函数算法或SHA-1函数算法。

这里,为了使得函数本身的逻辑更为复杂,避免轻易被破解,所述装置还包括:构造单元23及设置单元24;

在建立第一全局变量及第二全局变量之前,所述构造单元23用于构造数据结构;所述设置单元24用于将所述数据结构设置为所述函数的参数类型,所述数据结构可以为较为复杂的数据结构,比如:类结构、STL的数据结构或list数据结构。

以解密函数来说,解密函数的参数包括:传递密文信息的参数及传送明文信息的参数;那么所述构造单元23就可以将这两个参数构造成一个数据结构,比如C++的类结构,因为类结构会比简单的数据类型传递参数要复杂些。当然,也可以使用STL的数据结构,比如利用MAP来存储需要解密的字符串,或者是list这种结构来存储解密后的明文信息的传出参数等。其中,所述MAP是一种关联容器,存是储相结合形成的一个关键值和映射值的元素。

这样,就可以把函数的调用参数变得更为复杂。

而通过检测函数的调用堆栈信息,获取调用链信息来检测所述函数的调用者信息时,具体包括:

所述检测单元21通过系统函数int backtrace(void**buffer,int size)获取用于存储所述调用链信息内存地址的参数buffer;所述buffer中存储的是上层函数的调用地址,是一个内存地址;

然后利用转化函数char**backtrace_symbols(void*const*buffer,int size)将所述内存地址转化为函数名称信息;基于所述函数名称信息获取所述函数调用链的函数名称信息;将所述函数名称信息上传至服务器中,所述服务器就可以基于所述函数调用链的函数名称信息获取所述函数的调用链信息。

为了更清楚地阐述调用链信息,这里举例说明:函数调用链是指当前的函数是从上层函数调用过来的,这个调用过程就是函数调用链;比如:函数A调用函数B再调用函数C,那么在函数C中可以获取到的调用链新就是函数C、B、A,由此可以知道当前的函数最起始调用点是函数A。

当所述检测单元21获取到第一哈希值及第二哈希值、函数调用链信息后,所述判断单元22有两种方法来判断所述调用者是否为正常用户;第一种方法是:根据第一哈希值及第二哈希值来判断所述调用者是否为正常用户;第二种方法是根据函数调用链信息来判断所述调用者是否为正常用户。

具体地,当所述判断单元22根据第一哈希值及第二哈希值来判断所述调用者是否为正常用户时,具体包括:判断所述第一哈希值与所述第二哈希值是否一致,若所述第一哈希值与所述第二哈希值不一致,则确定所述调用者不是正常用户。这里是因为在正常的调用程序下,由于两个全局变量的初始化的值一样,并且变量计算HASH的次数也一样,所以两个变量的值总是相等的。因此,一旦所述第一哈希值与所述第二哈希不一致时,即可确定调用者不是正常用户,此时,断开此次调用过程,并将所述第一哈希值与所述第二哈希值通过加密算法加密后发送到服务器,服务器接收到该信息后,将所述调用者标记为异常用户。

当所述判断单元22根据函数调用链信息来判断所述调用者是否为正常用户时,具体包括:获取所述函数的调用链信息;判断所述调用链信息与预设的调用链信息是否一致;若所述调用链信息与所述预设的调用链信息不一致,则确定所述调用者不是正常用户。

这里,如上述所述,当获取到函数名称信息后,服务器可以通过正常的客户端基于所述函数名称信息获取到正常的函数调用链信息,如果服务器确定当前的调用链信息与预设的调用链信息(正常的调用链信息)不同时,即可则可以确定调用者不是正常用户,此时,断开此次调用过程,并将所述调用者标记为异常用户。

比如,现在有三个函数FuncA、FuncB、FuncC;调用关系是:FuncA中会调用FuncB,FuncB中会调用FuncC那么在函数C中获取到的函数调用链信息是FuncB->FuncA。

而对于非法用户来说,可能也会调用FuncC,那么他的函数可能是FuncX,那么在函数C中获取到的函数调用链信息是FuncX。显然这两种种函数调用链信息是不一致的,则服务器获取到两种调用链信息后,可以确定第二种是一个非法调用,将所述调用者标记为异常用户。

本发明提供的一个或多个实施例带来的有益效果是:

本发明提供了一种保护函数调用的方法及装置,所述方法包括:检测所述函数的调用者信息;基于所述调用者信息判断所述调用者是否为正常用户,若不是正常用户,则断开此次调用;如此,在调用函数之前首先根据调用者信息判断调用者是否为正常用户,若不是正常用户,则断开此次调用过程;并且在判断调用者是否为正常用户时,可以通过两种方法来检测,第一种是通过设置全局变量的方法来检测所述函数的调用者信息;第二种是通过检测函数的调用堆栈信息,获取调用链信息来检测所述函数的调用者信息;可以进行双重检测避免出现非法调用函数的情况,从而提高了数据的安全性,并且,本发明还增加了函数本身的复杂度,进一步提高了破译的难度。

以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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