CN110569644A - 调用请求的处理、功能函数的调用方法、装置及设备 - Google Patents
调用请求的处理、功能函数的调用方法、装置及设备 Download PDFInfo
- Publication number
- CN110569644A CN110569644A CN201810575681.2A CN201810575681A CN110569644A CN 110569644 A CN110569644 A CN 110569644A CN 201810575681 A CN201810575681 A CN 201810575681A CN 110569644 A CN110569644 A CN 110569644A
- Authority
- CN
- China
- Prior art keywords
- function
- calling
- address
- pointer
- call
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本申请公开了一种调用请求的处理方法,包括:接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;向所述调用方提供所述预设类的指针。以降低非授权调用方可能非法调用功能函数的风险。
Description
技术领域
本申请涉及应用安全领域,具体涉及一种调用请求的处理方法、装置、电子设备及存储设备。本申请还涉及一种功能函数的调用方法、装置、电子设备及存储设备。本申请还涉及一种功能函数的调用方法、装置、电子设备及存储设备。
背景技术
应用程序的执行往往依赖动态链接库(Dynamic Link Library,或DLL),DLL向运行于操作系统上的应用程序提供功能函数或数据。例如,运行于操作系统上的应用程序的可执行文件,往往包含一个或多个相对独立的DLL文件,当应用程序被执行时,调用相应的DLL文件;DLL文件中的功能函数(包括实现某功能的函数或类)可能需要被外部调用方调用。这些DLL提供的功能函数在被导出后,才能被外部调用方调用。
DLL提供的功能函数存在被非授权调用方(例如非授权进程或恶意程序)非法调用的风险,这可能引起调用功能函数的授权调用方(例如授权进程或可信进程)的业务数据泄露和/或功能失效的问题。
发明内容
本申请提供一种调用请求的处理方法、功能函数的调用方法,对功能函数的调用进行合适的处理,以降低非授权调用方非法调用功能函数的风险。
本申请提供一种调用请求的处理方法,包括:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
可选的,所述接收调用方调用预设类的请求,包括:
通过查询接口接收调用方调用预设类的请求,所述查询接口,是用于调用方调用预设类的导出接口函数。
可选的,所述调用预设类的请求,包括:所述预设类的标识;
相应的,所述确定所述预设类的指针,包括:
根据所述预设类的标识确定所述预设类的指针。
可选的,所述调用请求的处理方法,还包括:
根据调用方调用预设类的请求,创建所述预设类的类对象;
相应的,所述确定所述预设类的指针,包括:确定所述类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述向所述调用方提供所述预设类的指针,包括:向所述调用方提供所述类对象的指针。
可选的,所述调用预设类的请求,还包括:用于存放所述预设类的指针的参数。
可选的,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
本申请还提供一种功能函数的调用方法,包括:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
可选的,所述接收所述预设类的指针,包括:接收所述预设类的类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述根据所述预设类的指针调用所述预设类封装的所述功能函数,包括:根据所述类对象的指针调用所述预设类封装的所述功能函数。
可选的,所述发送调用预设类的请求,包括:
通过查询接口发送调用预设类的请求,所述查询接口,是用于调用预设类的导出接口函数。
可选的,所述调用预设类的请求,包括:所述预设类的标识,和/或,用于存放所述预设类的指针的参数。
可选的,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
本申请还提供一种功能函数的调用方法,包括:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
可选的,所述根据所述调用指令的地址,确定是否允许调用所述功能函数,包括:
根据所述调用指令的地址,判断所述调用指令是否合法;
若判断所述调用指令合法,则允许调用所述功能函数;
若判断所述调用指令非法,则不允许调用所述功能函数。
可选的,所述调用栈存储的调用指令的地址,是调用所述功能函数的调用函数的调用指令在内存中的地址;所述确定所述调用栈存储的调用指令的地址,包括:
遍历所述调用栈,获取调用所述功能函数的调用函数的扩展基址指针;
根据所述扩展基址指针,得到所述功能函数的调用函数的调用指令在内存中的地址。
可选的,所述功能函数的调用方法,还包括:
获取调用所述功能函数的调用方加载的模块的信息,所述模块信息,包括:所述模块加载到内存中的起始地址和所述模块占用的内存空间的大小;
相应的,所述根据所述调用指令的地址,确定是否允许调用所述功能函数,包括:
根据所述模块的信息,判断所述调用指令在内存中的地址是否合法;
若判断所述调用指令在内存中的地址合法,则允许调用所述功能函数;
若判断所述调用指令在内存中的地址非法,则不允许调用所述功能函数。
可选的,所述根据所述模块的信息,判断所述调用指令在内存中的地址是否合法,包括:
根据所述模块的加载到内存中的起始地址和占用的内存空间的大小,确定所述调用指令在内存中的地址是否属于所述模块;
若否,则判断所述调用指令在内存中的地址非法;
若是,则判断所述调用指令在内存中的地址合法。
可选的,所述功能函数的调用方法,还包括:
根据所述功能函数的调用函数的调用指令在内存中的地址,确定所述功能函数的调用函数所属的模块;
判断所述模块对应的模块文件的签名是否可信;
若判断所述模块对应的模块文件的签名可信,则允许调用所述功能函数;
若判断所述模块对应的模块文件的签名不可信,则终止调用所述功能函数。
可选的,所述调用栈,包括:所述功能函数的栈帧,和/或直接调用所述功能函数的第一调用函数的栈帧,和/或调用所述第一调用函数的第二调用函数的栈帧;
所述功能函数的栈帧,存储了直接调用所述功能函数的第一调用函数的扩展基址指针、所述功能函数的临时变量、所述功能函数的返回地址;
所述第一调用函数的栈帧,存储了调用所述第一调用函数的第二调用函数的扩展基址指针、所述第一调用函数的临时变量、所述第一调用函数的返回地址;
所述第二调用函数的栈帧,存储了调用所述第二调用函数的调用函数的扩展基址指针、所述第二调用函数的临时变量、所述第二调用函数的返回地址。
本申请还提供一种调用请求的处理装置,包括:
调用请求接收单元,用于接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
指针确定单元,用于确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
指针返回单元,用于向所述调用方提供所述预设类的指针。
本申请还提供一种功能函数的调用装置,包括:
调用请求发送单元,用于发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
指针接收单元,用于接收所述预设类的指针,所述指针用于指示所述预设类的地址;
功能函数调用单元,用于根据所述预设类的指针调用所述预设类封装的所述功能函数。
本申请还提供一种功能函数的调用装置,包括:
功能函数调用请求接收单元,用于接收调用功能函数的请求;
调用栈确定单元,用于确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
调用指令地址确定单元,用于确定所述调用栈存储的调用指令的地址;
功能函数调用判断单元,用于根据所述调用指令的地址,确定是否允许调用所述功能函数。
本申请还提供一种电子设备,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
本申请还提供一种电子设备,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
本申请还提供一种电子设备,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
本申请还提供一种存储设备,存储有指令,所述指令能够被处理器加载并执行以下步骤:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
本申请还提供一种存储设备,存储有指令,所述指令能够被处理器加载并执行以下步骤:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
本申请还提供一种存储设备,存储有指令,所述指令能够被处理器加载并执行以下步骤:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
与现有技术相比,本申请具有以下优点:
本申请提供的调用请求的处理方法,向需要调用功能函数的调用方提供调用预设类的指针,所述预设类封装有要调用的功能函数,而不是直接向调用方提供调用的功能函数,从而降低了非授权调用方非法调用所述功能函数的风险;另外,对于拥有所述预设类的定义信息的授权调用方,向其提供预设类的指针,可以使得所述授权调用方通过所述预设类的指针调用所述功能函数,不影响所述授权调用方对所述功能函数的合法调用。
本申请提供的功能函数的调用方法,通过存储有功能函数的调用指令的调用栈上调用指令的地址,确定是否允许调用所述功能函数,从而可以对功能函数的调用进行验证,降低非授权调用方非法调用所述功能函数的风险。
附图说明
图1是本申请第一实施例提供的调用请求的处理方法的处理流程图;
图2是本申请第一实施例提供的调用请求的处理方法包含的一个实施方式的预设类的示意图;
图3是本申请第一实施例提供的调用请求的处理方法包含的一个实施方式的调用时序图;
图4是本申请第二实施例提供的功能函数的调用方法的处理流程图;
图5是本申请第三实施例提供的功能函数的调用方法的处理流程图;
图6是本申请第三实施例提供的功能函数的调用方法包含的函数调用栈示意图;
图7是本申请第三实施例提供的功能函数的调用方法包含的一个实施方式的功能函数的调用验证流程图;
图8是本申请第四实施例提供的调用请求的处理装置的示意图;
图9是本申请第五实施例提供的功能函数的调用装置的示意图;
图10是本申请第六实施例提供的功能函数的调用装置的示意图;
图11是本申请提供的电子设备的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
本申请提供一种调用请求的处理方法、装置、电子设备及存储设备。本申请还涉及一种功能函数的调用方法、装置、电子设备及存储设备。本申请还涉及一种功能函数的调用方法、装置、电子设备及存储设备。在下面的实施例中逐一进行详细说明。
本申请第一实施例提供一种调用请求的处理方法。
以下结合图1至图3对本申请第一实施例提供的调用请求的处理方法进行说明。
图1所示的调用请求的处理方法,包括:步骤S101至步骤S103。
步骤S101,接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数。
所述功能函数,是实现某功能的函数或类,可以是基于DLL(Dynamic LinkLibrary,或动态链接库)提供的功能函数。
所谓DLL是以动态链接提供函数的方式,如果DLL文件中的函数需要被外部的调用方调用,则需要将这些函数进行导出。被所述外部的调用方使用的导出的函数称为导出接口函数。所谓动态链接是一种使得应用程序可以调用不属于所述应用程序的可执行代码的函数的方法。例如,设备驱动程序以DLL方式提供,应用程序(即所述DLL外部的调用方)可以调用位于所述DLL文件中的函数的可执行代码,打开、启用、查询、禁用和关闭设备驱动程序。
本申请实施例提供的所述调用请求的处理方法中,所述功能函数的可执行代码位于DLL文件中,所述DLL包含一个或多个已被编译、链接并与使用它们的调用方分开存储的功能函数;相应的,封装有所述功能函数的预设类,是用于将基于DLL提供的功能函数导出的接口类。
本申请实施例中,DLL的导出接口函数不直接对应调用方需要调用的DLL提供的功能函数,而是将所述功能函数封装在预设类中,对调用方隐藏所述功能函数,可以使得非授权调用方无法正确推导出所述功能函数的真正形式,从而无法调用所述功能函数。
本步骤是,接收调用方调用预设类的请求。
本申请实施例中,通过查询接口接收调用方调用预设类的请求,所述查询接口,是用于调用方调用预设类的导出接口函数。
优选的,所述调用预设类的请求,包括:所述预设类的标识。即,调用所述查询接口的调用方通过预设类的标识指定所需要调用的预设类,传递到DLL内部。
优选的,所述调用预设类的请求,还包括:用于存放所述预设类的指针的参数,即,使用所述参数作为所述查询接口的输出参数,将通过所述查询接口得到的所述预设类的指针传递到调用所述查询接口的调用方。需要说明的是,实际实现中,也可以通过所述查询接口的返回值返回所述预设类的指针,而不需要所述查询接口的输出参数。
举例如下:以授权调用方客户端程序A的进程保护功能为例。某授权调用方客户端程序A,调用以DLL方式提供的接口模块SafeProxy.dll中的功能函数Afun1(),为防止非授权调用方B恶意终止所述客户端程序A,SafeProxy.dll提供外部调用方可以使用的唯一查询接口,所述唯一查询接口为导出接口函数QueryInterface(SIZE_T iid,LPVOID*lpObject)。函数QueryInterface有两个形式参数,SIZE_T iid表示为SIZE_T类型的形式参数iid,通过所述形式参数iid传入预设类的标识,LPVOID*lpObject表示为LPVOID*的指针类型的形式参数lpObject,通过所述形式参数lpObject向外部调用方传递SafeProxy.dll提供的封装有功能函数的类对象的地址。
图2示出了SafeProxy.dll通过QueryInterface向外部调用方提供的预设类,包括:
SafeProxy.dll 201通过QueryInterface(SIZE_T iid,LPVOID*lpObject)向SafeProxy.dll外部的调用方提供预设类ClassA 202、ClassB 203、……、ClassX;
ClassA202提供功能函数Afun1()和Afun2();
ClassB 203提供功能函数Bfuna()和Bfunb();
QueryInterface(SIZE_T iid,LPVOID*lpObject)的函数内部代码包含switch语句204,用于根据预设类的标识声明对应的预设类对象;
客户端程序A如果需要调用SafeProxy.dll 201的功能函数Afun1(),则调用QueryInterface,传入对应接口类的A::IID。
步骤S102,确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址。
本步骤是DLL内部确定所述预设类的指针。
本申请实施例中,所述调用预设类的请求,包括:所述预设类的标识;相应的,所述确定所述预设类的指针,包括:根据所述预设类的标识确定所述预设类的指针。具体实现中可以包括下述处理:
根据调用方调用预设类的请求,创建所述预设类的类对象;
相应的,所述确定所述预设类的指针,包括:确定所述类对象的指针,所述指针用于指示所述类对象的地址。
将所述类对象的指针返回给调用方。
沿用授权调用方客户端程序A的进程保护功能的例子。
SafeProxy.dll接收到客户端程序A的调用预设类的标识为A::IID的请求,创建ClassA的类对象(也称为实例对象),将所述类对象的地址通过QueryInterface的参数LPVOID*lpObject传递给客户端程序A。
步骤S103,向所述调用方提供所述预设类的指针。
本步骤是将预设类的指针提供给调用所述预设类的调用方。
本申请实施例中,具体包括:
根据调用方调用预设类的请求,创建所述预设类的类对象;
向所述调用方提供所述类对象的指针。
对于调用预设类的请求,DLL返回的内容是所述DLL内部创建的预设类的类对象的指针,不包含所述预设类的任何定义信息。对于授权调用方由于拥有所述预设类的正确定义,可以进一步通过返回的指针调用所述预设类封装的功能函数。但是,对于非授权调用方,由于不清楚所述预设类的具体定义,即使能通过第三方工具查看到DLL外部的调用方对所述DLL提供的查询接口的调用,并模仿授权调用方传入预设类的标识获取到所述预设类的类对象指针,也无法正确通过所述类对象的指针调用所述预设类内部封装的功能函数。从而降低了非授权调用方非法调用功能函数的风险。
沿用授权调用方客户端程序A的进程保护功能的例子。
SafeProxy.dll接收到客户端程序A的调用预设类的标识为A::IID的请求,创建ClassA的类对象(也称为实例对象),将所述类对象的地址通过QueryInterface的参数LPVOID*lpObject传递给客户端程序A,使得客户端程序A能够通过所述类对象的地址调用功能函数Afun1()。
图3示出了客户端程序A调用SafeProxy.dll提供的功能函数Afun1()的调用时序图,包括:
客户端程序A调用QueryInterface(SIZE_T iid,LPVOID*lpObject),通过函数QueryInterface的参数iid向SafeProxy.dll传入A::IID;
SafeProxy.dll创建ClassA的实例对象ObjectA;
SafeProxy.dll通过QueryInterface向客户端程序A返回ObjectA的地址;
客户端程序A通过ObjectA的地址调用封装在ClassA内部的功能函数Afun1()。
本申请实施例提供的授权调用方客户端程序A的进程保护功能的例子中,查询接口QueryInterface返回的内容只是SafeProxy.dll内部创建的ClassA的类对象ObjectA的指针,不包含ClassA的任何定义信息。非授权调用方,即使能获取到对QueryInterface函数的调用,模仿授权调用方传入A::IID,获取到Class A的类对象指针,也无法正确通过该指针调用Class A的内部函数。而授权调用方拥有Class A的正确定义,可以进一步通过返回的指针调用Class A中的函数Afun1或者Afun2。
以本申请提供的一种调用请求的处理方法的实施例为基础,本申请第二实施例提供了一种功能函数的调用方法。
以下结合图4对本申请第二实施例提供的功能函数的调用方法进行说明。由于本实施例以上述实施例为基础,所以描述得比较简单,相关的部分请参见上述实施例的对应说明即可。
图4所示的功能函数的调用方法,包括:步骤S401至步骤S403。
步骤S401,发送调用预设类的请求,所述预设类封装有需要调用的功能函数。
所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
本步骤是发送调用预设类的请求。
本申请实施例中,当DLL外部的调用方需要调用DLL内部提供的功能函数时,将调用封装有需要调用的功能函数的预设类的请求发送给所述DLL,具体的,通过查询接口发送调用预设类的请求,所述查询接口,是用于调用预设类的导出接口函数。
优选的,所述调用预设类的请求,包括:所述预设类的标识,和/或,用于存放所述预设类的指针的参数。例如,通过查询接口将预设类的标识传入给DLL。
步骤S402,接收所述预设类的指针,所述指针用于指示所述预设类的地址。
本步骤是接收所述预设类的指针。
具体到本申请实施例,所述接收所述预设类的指针,包括:接收所述预设类的类对象的指针,所述指针用于指示所述类对象的地址。
需要说明的是,DLL外部的调用方,可以通过所述查询接口的参数或返回值接收所述类对象的地址。
步骤S403,根据所述预设类的指针调用所述预设类封装的所述功能函数。
本步骤是调用所述预设类封装的所述功能函数。
本申请实施例中,所述接收所述预设类的指针,可以是指:接收所述预设类的类对象的指针,所述指针用于指示所述类对象的地址。
相应的,所述根据所述预设类的指针调用所述预设类封装的所述功能函数,包括:根据所述类对象的指针调用所述预设类封装的所述功能函数。
对于调用预设类的请求,DLL返回的内容是所述DLL内部创建的预设类的类对象的指针,不包含所述预设类的任何定义信息。对于授权调用方由于拥有所述预设类的正确定义,可以进一步通过返回的指针调用所述预设类封装的功能函数。但是,对于非授权调用方,由于不清楚所述预设类的具体定义,即使能通过第三方工具查看到DLL外部的调用方对所述DLL提供的查询接口的调用,并模仿授权调用方传入预设类的标识获取到所述预设类的类对象指针,也无法正确通过所述类对象的指针调用所述预设类内部封装的功能函数。从而降低了非授权调用方非法调用功能函数的风险。
以本申请提供的一种调用请求的处理方法的实施例为基础,本申请第三实施例提供了一种功能函数的调用方法。
以下结合图5至图7对本申请第三实施例提供的功能函数的调用方法进行说明。由于本实施例以上述实施例为基础,所以描述得比较简单,相关的部分请参见上述实施例的对应说明即可。
图5所示的功能函数的调用方法,包括:步骤S501至步骤S504。
步骤S501,接收调用功能函数的请求。
所述功能函数,是实现某功能的函数或类,可以是基于DLL(Dynamic LinkLibrary,或动态链接库)提供的功能函数。
所谓DLL是以动态链接提供函数的方式,如果DLL文件中的函数需要被所述DLL外部的调用方调用,则需要将这些函数进行导出。被所述DLL外部的调用方使用的导出的函数称为导出接口函数。所谓动态链接是一种使得应用程序可以调用不属于所述应用程序的可执行代码的函数的方法。例如,设备驱动程序以DLL方式提供,应用程序(即所述DLL外部的调用方)可以调用位于所述DLL文件中的函数的可执行代码,打开、启用、查询、禁用和关闭设备驱动程序。
本申请实施例提供的功能函数的调用方法中,所述功能函数的可执行代码位于DLL文件中,所述DLL包含一个或多个已被编译、链接并与使用它们的调用方分开存储的功能函数。在DLL的外部调用方调用所述DLL的某功能函数时,对所述功能函数的调用栈进行可信调用验证。如果发现所述功能函数的调用过程存在非授权调用方,则终止所述功能函数的调用过程,从而避免非授权调用方调用所述DLL提供的功能函数,降低非法调用的风险,防止恶意调用方的调用,降低由此导致的业务数据泄露、功能失效等问题。
本步骤是接收调用功能函数的请求。
步骤S502,确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令。
本步骤是确定调用所述功能函数的调用栈。
所述调用指令,可以是调用功能函数的调用函数中执行的指令,例如call,push等指令,在另一种实施方式中,也可以是指调用功能函数的call指令。
本申请实施例中,所述调用栈,包括:所述功能函数的栈帧,和/或直接调用所述功能函数的第一调用函数的栈帧,和/或调用所述第一调用函数的第二调用函数的栈帧;所述功能函数的栈帧,存储了直接调用所述功能函数的第一调用函数的扩展基址指针、所述功能函数的临时变量、所述功能函数的返回地址;所述第一调用函数的栈帧,存储了调用所述第一调用函数的第二调用函数的扩展基址指针、所述第一调用函数的临时变量、所述第一调用函数的返回地址;所述第二调用函数的栈帧,存储了调用所述第二调用函数的调用函数的扩展基址指针、所述第二调用函数的临时变量、所述第二调用函数的返回地址。
在功能函数的调用过程中,操作系统使用栈保存函数调用时的返回地址、局部变量、参数。操作系统给每一个函数调用单独分配的那部分栈空间称为栈帧。通过功能函数的栈帧存储的所述第一调用函数的扩展基址指针(EBP)向栈底方向获取返回地址,得到所述第一调用函数的调用指令在内存中的地址;通过所述第一函数的栈帧存储的所述第二调用函数的扩展基址指针(EBP)向栈底方向获取返回地址,得到所述第二调用函数的调用指令在内存中的地址;依次在功能函数的逐层函数调用过程中,能够递归获取所述功能函数的完整调用栈。
需要说明的是,调用方对于功能函数的调用过程,包含一层或多层的函数调用。上述对于功能函数栈的描述是以功能函数、直接调用所述功能函数的第一调用函数、调用所述第一调用函数的第二调用函数为例进行了说明。实际中函数调用的层次不仅限于这一具体实施方式的描述,而适于通用栈帧的含义。
图6示出了一个功能函数的调用栈的示意图,包括:
EBP(Extended Base Pointer,或扩展基址指针)指向当前栈帧的栈底,ESP(Extended Stack Pointer,或扩展栈指针)指向当前栈帧的栈顶;
每个栈帧入栈的数据依次为上一个栈帧的EBP、函数变量、下一次函数调用参数、返回地址;
在每个栈帧中,都能通过当时的EBP值向栈底方向获取返回地址,根据返回地址,得到所述栈帧中调用被调函数的指令在内存中的地址;
通过逐层遍历所述功能函数的调用栈上的栈帧中保存的EBP,递归获取所述功能函数的完整调用栈。
步骤S503,确定所述调用栈存储的调用指令的地址。
本步骤是根据功能函数的调用栈上存储的调用信息,确定功能函数调用指令的地址。
本申请实施例中,所述调用栈存储的调用指令的地址,可以是调用所述功能函数的调用函数的调用指令在内存中的地址;
相应的,所述确定所述调用栈存储的调用指令的地址,包括:
遍历所述调用栈,获取调用所述功能函数的调用函数的扩展基址指针;
根据所述扩展基址指针,得到所述功能函数的调用函数的调用指令在内存中的地址。
例如,根据所述功能函数的栈帧存储的直接调用所述功能函数的第一调用函数的扩展基址指针(EBP),向栈底方向获取返回地址,得到所述第一调用函数的调用指令在内存中的地址;根据所述第一函数的栈帧存储的调用所述第一函数的第二调用函数的扩展基址指针(EBP),向栈底方向获取返回地址,得到所述第二调用函数的调用指令在内存中的地址。
步骤S504,根据所述调用指令的地址,确定是否允许调用所述功能函数。
本步骤是确定是否允许调用所述功能函数。
本申请实施例中,具体根据下述处理确定是否允许调用所述功能函数,包括:
根据所述调用指令的地址,判断所述调用指令是否合法;
若判断所述调用指令合法,则允许调用所述功能函数;
若判断所述调用指令非法,则不允许调用所述功能函数。
优选的,采用下述处理确定所述调用指令是否合法,包括:
获取调用所述功能函数的调用方加载的模块的信息,所述模块信息,包括:所述模块加载到内存中的起始地址和所述模块占用的内存空间的大小;
根据所述模块的信息,判断所述调用指令在内存中的地址是否合法。
相应的,还包括进行下述处理:
若判断所述调用指令在内存中的地址合法,则允许调用所述功能函数;
若判断所述调用指令在内存中的地址非法,则不允许调用所述功能函数。
本申请实施例中,模块是指加载到正在运行的进程的附加资源,可以是DLL,例如,Windows操作系统下,可以通过解析可执行文件的导入表从中获取加载的DLL的模块的信息;也可以通过操作系统提供的接口函数获取调用方加载的模块;还可以是查询调用方的进程地址空间中的模块,得到调用方加载的所有模块信息。本申请实例中,具体根据下述处理判断所述调用指令在内存中的地址是否合法,包括:
根据所述模块的加载到内存中的起始地址和占用的内存空间的大小,确定所述调用指令在内存中的地址是否属于所述模块;
若否,则判断所述调用指令在内存中的地址非法;
若是,则判断所述调用指令在内存中的地址合法。
例如,逐个确定调用栈上的调用指令所属的模块,若某调用指令的地址不落在任何模块内则认为是幽灵地址,从而可判断此次调用为非授权调用方的非授权调用,直接返回错误,不予调用所述功能函数。
本申请实施例中,进一步对所述调用栈上的调用指令对应的调用函数所属的模块进行可信调用验证,具体包括:
根据所述功能函数的调用函数的调用指令在内存中的地址,确定所述功能函数的调用函数所属的模块;
判断所述模块对应的模块文件的签名是否可信;
若判断所述模块对应的模块文件的签名可信,则允许调用所述功能函数;
若判断所述模块对应的模块文件的签名不可信,则终止调用所述功能函数。
由于遍历是查找到所述功能函数的调用所涉及到的所有模块进行可信调用验证,因此无论非授权调用方通过何种途径调用所述DLL的功能函数,如直接调用或是注入到可信进程环境中调用,都可以有效的发现非授权调用方的调用行为,阻止非法调用。
图7给出了一个功能函数的调用过程的验证流程,包括:
接收调用方调用DLL的功能函数;提供所述功能函数的DLL也称功能DLL;
功能DLL枚举所述调用方的进程内所有模块的信息,包括模块的模块加载到内存中的起始地址(也称为模块基地址)和所述模块占用的内存空间的大小(也称为模块大小);
功能DLL获取所述功能函数的完整调用栈;
逐个计算所述调用栈上的每个函数地址所属模块;其中,根据每个函数栈帧的EBP(扩展基址指针)的值,向栈底返回即可以得到所述栈帧对应的函数地址;
判断所述函数地址是否属于所述模块中的任一个模块;
若判断结果为否,则认为所述函数地址是幽灵地址,终止调用所述功能函数,返回错误;
若判断结果为是,则逐个验证每个函数地址所属模块的模块文件签名是否可信;若判断所述模块文件签名可信,则正常完成功能函数的调用;若判断任一个模块文件签名不可信,则终止调用所述功能函数,返回错误。
与本申请提供的一种调用请求的处理方法的实施例相对应,本申请第四实施例还提供了一种调用请求的处理装置。
参照图8,其示出了本申请第四实施例提供的调用请求的处理装置的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见方法实施例的对应说明即可。
图8所示的调用请求的处理装置,包括:
调用请求接收单元801,用于接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
指针确定单元802,用于确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
指针返回单元803,用于向所述调用方提供所述预设类的指针。
可选的,所述调用请求接收单元801,具体用于:
通过查询接口接收调用方调用预设类的请求,所述查询接口,是用于调用方调用预设类的导出接口函数。
可选的,所述调用预设类的请求,包括:所述预设类的标识;
相应的,所述确定所述预设类的指针,包括:
根据所述预设类的标识确定所述预设类的指针。
可选的,所述调用请求的处理装置,还包括类对象单元,用于:
根据调用方调用预设类的请求,创建所述预设类的类对象;
相应的,所述确定所述预设类的指针,包括:确定所述类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述向所述调用方提供所述预设类的指针,包括:向所述调用方提供所述类对象的指针。
可选的,所述调用预设类的请求,还包括:用于存放所述预设类的指针的参数。
可选的,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
与本申请第二实施例提供的一种功能函数的调用方法的实施例相对应,本申请第五实施例还提供了一种功能函数的调用装置。
参照图9,其示出了本申请第五实施例提供的功能函数的调用装置的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见方法实施例的对应说明即可。
图9所示的功能函数的调用装置,包括:
调用请求发送单元901,用于发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
指针接收单元902,用于接收所述预设类的指针,所述指针用于指示所述预设类的地址;
功能函数调用单元903,用于根据所述预设类的指针调用所述预设类封装的所述功能函数。可选的,所述指针接收单元902,具体用于:
接收所述预设类的类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述根据所述预设类的指针调用所述预设类封装的所述功能函数,包括:根据所述类对象的指针调用所述预设类封装的所述功能函数。
可选的,所述调用请求发送单元901,具体用于:
通过查询接口发送调用预设类的请求,所述查询接口,是用于调用预设类的导出接口函数。
可选的,所述调用预设类的请求,包括:所述预设类的标识,和/或,用于存放所述预设类的指针的参数。
可选的,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
与本申请第三实施例提供的一种功能函数的调用方法的实施例相对应,本申请第六实施例还提供了一种功能函数的调用装置。
参照图10,其示出了本申请第六实施例提供的功能函数的调用装置的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见方法实施例的对应说明即可。
图10所示的功能函数的调用装置,包括:
功能函数调用请求接收单元1001,用于接收调用功能函数的请求;
调用栈确定单元1002,用于确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
调用指令地址确定单元1003,用于确定所述调用栈存储的调用指令的地址;
功能函数调用判断单元1004,用于根据所述调用指令的地址,确定是否允许调用所述功能函数。
可选的,所述功能函数调用判断单元1004,具体用于:
根据所述调用指令的地址,判断所述调用指令是否合法;
若判断所述调用指令合法,则允许调用所述功能函数;
若判断所述调用指令非法,则不允许调用所述功能函数。
可选的,所述调用栈存储的调用指令的地址,是调用所述功能函数的调用函数的调用指令在内存中的地址;所述确定所述调用栈存储的调用指令的地址,包括:
遍历所述调用栈,获取调用所述功能函数的调用函数的扩展基址指针;
根据所述扩展基址指针,得到所述功能函数的调用函数的调用指令在内存中的地址。
可选的,所述功能函数的调用装置,还包括模块信息获取单元,用于:
获取调用所述功能函数的调用方加载的模块的信息,所述模块信息,包括:所述模块加载到内存中的起始地址和所述模块占用的内存空间的大小;
相应的,所述功能函数调用判断单元1004,具体用于:
根据所述模块的信息,判断所述调用指令在内存中的地址是否合法;
若判断所述调用指令在内存中的地址合法,则允许调用所述功能函数;
若判断所述调用指令在内存中的地址非法,则不允许调用所述功能函数。
可选的,所述功能函数调用判断单元1004,包括指令地址合法性验证子单元,所述指令地址合法性验证子单元,具体用于:
根据所述模块的加载到内存中的起始地址和占用的内存空间的大小,确定所述调用指令在内存中的地址是否属于所述模块;
若否,则判断所述调用指令在内存中的地址非法;
若是,则判断所述调用指令在内存中的地址合法。
可选的,所述功能函数的调用装置,还包括模块可信性验证单元,用于:
根据所述功能函数的调用函数的调用指令在内存中的地址,确定所述功能函数的调用函数所属的模块;
判断所述模块对应的模块文件的签名是否可信;
若判断所述模块对应的模块文件的签名可信,则允许调用所述功能函数;
若判断所述模块对应的模块文件的签名不可信,则终止调用所述功能函数。
可选的,所述调用栈,包括:所述功能函数的栈帧,和/或直接调用所述功能函数的第一调用函数的栈帧,和/或调用所述第一调用函数的第二调用函数的栈帧;
所述功能函数的栈帧,存储了直接调用所述功能函数的第一调用函数的扩展基址指针、所述功能函数的临时变量、所述功能函数的返回地址;
所述第一调用函数的栈帧,存储了调用所述第一调用函数的第二调用函数的扩展基址指针、所述第一调用函数的临时变量、所述第一调用函数的返回地址;
所述第二调用函数的栈帧,存储了调用所述第二调用函数的调用函数的扩展基址指针、所述第二调用函数的临时变量、所述第二调用函数的返回地址。
本申请第七实施例提供了一种电子设备,用于实现所述调用请求的处理方法,参照图11,其示出了本实施例提供的一种电子设备的示意图。
本申请提供的所述电子设备实施例描述得比较简单,相关的部分请参见上述提供的所述调用请求的处理方法的实施例的对应说明即可。
本申请第七实施例提供一种电子设备,包括:
存储器1101,以及处理器1102;
所述存储器1101用于存储计算机可执行指令,所述处理器1102用于执行所述计算机可执行指令:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
可选的,所述处理器1102还用于执行下述计算机可执行指令,包括:
通过查询接口接收调用方调用预设类的请求,所述查询接口,是用于调用方调用预设类的导出接口函数。
可选的,所述调用预设类的请求,包括:所述预设类的标识;
相应的,所述确定所述预设类的指针,包括:
根据所述预设类的标识确定所述预设类的指针。
可选的,所述处理器1102还用于执行下述计算机可执行指令,包括:
根据调用方调用预设类的请求,创建所述预设类的类对象;
相应的,所述确定所述预设类的指针,包括:确定所述类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述向所述调用方提供所述预设类的指针,包括:向所述调用方提供所述类对象的指针。
可选的,所述调用预设类的请求,还包括:用于存放所述预设类的指针的参数。
可选的,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
本申请第八实施例提供了一种电子设备,用于实现本申请提二实施例提供的功能函数的调用方法。本实施例提供的一种电子设备的示意图类似于图11。
本申请提供的所述电子设备实施例描述得比较简单,相关的部分请参见本申请提二实施例的对应说明即可。
本申请第八实施例提供一种电子设备,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
可选的,所述处理器还用于执行下述计算机可执行指令:接收所述预设类的类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述根据所述预设类的指针调用所述预设类封装的所述功能函数,包括:根据所述类对象的指针调用所述预设类封装的所述功能函数。
可选的,所述处理器还用于执行下述计算机可执行指令:
通过查询接口发送调用预设类的请求,所述查询接口,是用于调用预设类的导出接口函数。
可选的,所述调用预设类的请求,包括:所述预设类的标识,和/或,用于存放所述预设类的指针的参数。
可选的,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
本申请第九实施例提供了一种电子设备,用于实现本申请第三实施例提供的功能函数的调用方法。本实施例提供的一种电子设备的示意图类似于图11。
本申请提供的所述电子设备实施例描述得比较简单,相关的部分请参见本申请第三实施例的对应说明即可。
本申请第九实施例提供一种电子设备,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
可选的,所述处理器还用于执行下述计算机可执行指令:
根据所述调用指令的地址,判断所述调用指令是否合法;
若判断所述调用指令合法,则允许调用所述功能函数;
若判断所述调用指令非法,则不允许调用所述功能函数。
可选的,所述调用栈存储的调用指令的地址,是调用所述功能函数的调用函数的调用指令在内存中的地址;相应的,所述处理器还用于执行下述计算机可执行指令:
遍历所述调用栈,获取调用所述功能函数的调用函数的扩展基址指针;
根据所述扩展基址指针,得到所述功能函数的调用函数的调用指令在内存中的地址。
可选的,所述处理器还用于执行下述计算机可执行指令:
获取调用所述功能函数的调用方加载的模块的信息,所述模块信息,包括:所述模块加载到内存中的起始地址和所述模块占用的内存空间的大小;
相应的,所述根据所述调用指令的地址,确定是否允许调用所述功能函数,包括:
根据所述模块的信息,判断所述调用指令在内存中的地址是否合法;
若判断所述调用指令在内存中的地址合法,则允许调用所述功能函数;
若判断所述调用指令在内存中的地址非法,则不允许调用所述功能函数。
可选的,所述处理器还用于执行下述计算机可执行指令:
根据所述模块的加载到内存中的起始地址和占用的内存空间的大小,确定所述调用指令在内存中的地址是否属于所述模块;
若否,则判断所述调用指令在内存中的地址非法;
若是,则判断所述调用指令在内存中的地址合法。
可选的,所述处理器还用于执行下述计算机可执行指令:
根据所述功能函数的调用函数的调用指令在内存中的地址,确定所述功能函数的调用函数所属的模块;
判断所述模块对应的模块文件的签名是否可信;
若判断所述模块对应的模块文件的签名可信,则允许调用所述功能函数;
若判断所述模块对应的模块文件的签名不可信,则终止调用所述功能函数。
可选的,所述调用栈,包括:所述功能函数的栈帧,和/或直接调用所述功能函数的第一调用函数的栈帧,和/或调用所述第一调用函数的第二调用函数的栈帧;
所述功能函数的栈帧,存储了直接调用所述功能函数的第一调用函数的扩展基址指针、所述功能函数的临时变量、所述功能函数的返回地址;
所述第一调用函数的栈帧,存储了调用所述第一调用函数的第二调用函数的扩展基址指针、所述第一调用函数的临时变量、所述第一调用函数的返回地址;
所述第二调用函数的栈帧,存储了调用所述第二调用函数的调用函数的扩展基址指针、所述第二调用函数的临时变量、所述第二调用函数的返回地址。
本申请第十实施例还提供一种用于所述调用请求的处理方法的存储设备,其描述得比较简单,相关的部分请参见本申请第一实施例的对应说明即可。
本申请提供一种存储设备,存储有指令,所述指令能够被处理器加载并执行以下步骤:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
本申请第十一实施例还提供一种用于本申请第二实施例所述功能函数的调用方法的存储设备,其描述得比较简单,相关的部分请参见本申请第二实施例的对应说明即可。
本申请提供一种存储设备,存储有指令,所述指令能够被处理器加载并执行以下步骤:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
本申请第十二实施例还提供一种用于本申请第三实施例所述功能函数的调用方法的存储设备,其描述得比较简单,相关的部分请参见本申请第三实施例的对应说明即可。
本申请提供一种存储设备,存储有指令,所述指令能够被处理器加载并执行以下步骤:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。……
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
Claims (27)
1.一种调用请求的处理方法,其特征在于,包括:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
2.根据权利要求1所述的方法,其特征在于,所述接收调用方调用预设类的请求,包括:
通过查询接口接收调用方调用预设类的请求,所述查询接口,是用于调用方调用预设类的导出接口函数。
3.根据权利要求1所述的方法,其特征在于,所述调用预设类的请求,包括:所述预设类的标识;
相应的,所述确定所述预设类的指针,包括:
根据所述预设类的标识确定所述预设类的指针。
4.根据权利要求1所述的方法,其特征在于,还包括:
根据调用方调用预设类的请求,创建所述预设类的类对象;
相应的,所述确定所述预设类的指针,包括:确定所述类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述向所述调用方提供所述预设类的指针,包括:向所述调用方提供所述类对象的指针。
5.根据权利要求1所述的方法,其特征在于,所述调用预设类的请求,还包括:用于存放所述预设类的指针的参数。
6.根据权利要求1所述的方法,其特征在于,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
7.一种功能函数的调用方法,其特征在于,包括:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
8.根据权利要求7所述的方法,其特征在于,所述接收所述预设类的指针,包括:接收所述预设类的类对象的指针,所述指针用于指示所述类对象的地址;
相应的,所述根据所述预设类的指针调用所述预设类封装的所述功能函数,包括:根据所述类对象的指针调用所述预设类封装的所述功能函数。
9.根据权利要求7所述的方法,其特征在于,所述发送调用预设类的请求,包括:
通过查询接口发送调用预设类的请求,所述查询接口,是用于调用预设类的导出接口函数。
10.根据权利要求7所述的方法,其特征在于,所述调用预设类的请求,包括:所述预设类的标识,和/或,用于存放所述预设类的指针的参数。
11.根据权利要求7所述的方法,其特征在于,所述功能函数,是基于DLL提供的功能函数;相应的,所述预设类,是用于将基于DLL提供的功能函数导出的接口类。
12.一种功能函数的调用方法,其特征在于,包括:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
13.根据权利要求12所述的方法,其特征在于,所述根据所述调用指令的地址,确定是否允许调用所述功能函数,包括:
根据所述调用指令的地址,判断所述调用指令是否合法;
若判断所述调用指令合法,则允许调用所述功能函数;
若判断所述调用指令非法,则不允许调用所述功能函数。
14.根据权利要求12所述的方法,其特征在于,所述调用栈存储的调用指令的地址,是调用所述功能函数的调用函数的调用指令在内存中的地址;所述确定所述调用栈存储的调用指令的地址,包括:
遍历所述调用栈,获取调用所述功能函数的调用函数的扩展基址指针;
根据所述扩展基址指针,得到所述功能函数的调用函数的调用指令在内存中的地址。
15.根据权利要求14所述的方法,其特征在于,还包括:
获取调用所述功能函数的调用方加载的模块的信息,所述模块信息,包括:所述模块加载到内存中的起始地址和所述模块占用的内存空间的大小;
相应的,所述根据所述调用指令的地址,确定是否允许调用所述功能函数,包括:
根据所述模块的信息,判断所述调用指令在内存中的地址是否合法;
若判断所述调用指令在内存中的地址合法,则允许调用所述功能函数;
若判断所述调用指令在内存中的地址非法,则不允许调用所述功能函数。
16.根据权利要求15所述的方法,其特征在于,所述根据所述模块的信息,判断所述调用指令在内存中的地址是否合法,包括:
根据所述模块的加载到内存中的起始地址和占用的内存空间的大小,确定所述调用指令在内存中的地址是否属于所述模块;
若否,则判断所述调用指令在内存中的地址非法;
若是,则判断所述调用指令在内存中的地址合法。
17.根据权利要求15所述的方法,其特征在于,还包括:
根据所述功能函数的调用函数的调用指令在内存中的地址,确定所述功能函数的调用函数所属的模块;
判断所述模块对应的模块文件的签名是否可信;
若判断所述模块对应的模块文件的签名可信,则允许调用所述功能函数;
若判断所述模块对应的模块文件的签名不可信,则终止调用所述功能函数。
18.根据权利要求12所述的方法,其特征在于,所述调用栈,包括:所述功能函数的栈帧,和/或直接调用所述功能函数的第一调用函数的栈帧,和/或调用所述第一调用函数的第二调用函数的栈帧;
所述功能函数的栈帧,存储了直接调用所述功能函数的第一调用函数的扩展基址指针、所述功能函数的临时变量、所述功能函数的返回地址;
所述第一调用函数的栈帧,存储了调用所述第一调用函数的第二调用函数的扩展基址指针、所述第一调用函数的临时变量、所述第一调用函数的返回地址;
所述第二调用函数的栈帧,存储了调用所述第二调用函数的调用函数的扩展基址指针、所述第二调用函数的临时变量、所述第二调用函数的返回地址。
19.一种调用请求的处理装置,其特征在于,包括:
调用请求接收单元,用于接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
指针确定单元,用于确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
指针返回单元,用于向所述调用方提供所述预设类的指针。
20.一种功能函数的调用装置,其特征在于,包括:
调用请求发送单元,用于发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
指针接收单元,用于接收所述预设类的指针,所述指针用于指示所述预设类的地址;
功能函数调用单元,用于根据所述预设类的指针调用所述预设类封装的所述功能函数。
21.一种功能函数的调用装置,其特征在于,包括:
功能函数调用请求接收单元,用于接收调用功能函数的请求;
调用栈确定单元,用于确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
调用指令地址确定单元,用于确定所述调用栈存储的调用指令的地址;
功能函数调用判断单元,用于根据所述调用指令的地址,确定是否允许调用所述功能函数。
22.一种电子设备,其特征在于,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
23.一种电子设备,其特征在于,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
24.一种电子设备,其特征在于,包括:
存储器,以及处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
25.一种存储设备,其特征在于,存储有指令,所述指令能够被处理器加载并执行以下步骤:
接收调用方调用预设类的请求,其中,所述调用方为需要调用功能函数的调用方,所述预设类封装有所述功能函数;
确定所述预设类的指针,其中,所述指针用于指示所述预设类的地址;
向所述调用方提供所述预设类的指针。
26.一种存储设备,其特征在于,存储有指令,所述指令能够被处理器加载并执行以下步骤:
发送调用预设类的请求,所述预设类封装有需要调用的功能函数;
接收所述预设类的指针,所述指针用于指示所述预设类的地址;
根据所述预设类的指针调用所述预设类封装的所述功能函数。
27.一种存储设备,其特征在于,存储有指令,所述指令能够被处理器加载并执行以下步骤:
接收调用功能函数的请求;
确定存储调用指令的地址的调用栈,所述调用指令是调用所述功能函数的指令;
确定所述调用栈存储的调用指令的地址;
根据所述调用指令的地址,确定是否允许调用所述功能函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810575681.2A CN110569644B (zh) | 2018-06-06 | 2018-06-06 | 调用请求的处理、功能函数的调用方法、装置及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810575681.2A CN110569644B (zh) | 2018-06-06 | 2018-06-06 | 调用请求的处理、功能函数的调用方法、装置及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110569644A true CN110569644A (zh) | 2019-12-13 |
CN110569644B CN110569644B (zh) | 2023-05-09 |
Family
ID=68772609
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810575681.2A Active CN110569644B (zh) | 2018-06-06 | 2018-06-06 | 调用请求的处理、功能函数的调用方法、装置及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110569644B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023165307A1 (zh) * | 2022-03-01 | 2023-09-07 | 阿里巴巴(中国)有限公司 | 函数调用方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040168078A1 (en) * | 2002-12-04 | 2004-08-26 | Brodley Carla E. | Apparatus, system and method for protecting function return address |
CN103679032A (zh) * | 2013-12-13 | 2014-03-26 | 北京奇虎科技有限公司 | 防御恶意软件的方法和装置 |
CN106464513A (zh) * | 2014-06-27 | 2017-02-22 | 迈克菲股份有限公司 | 用于抑制恶意调用的系统和方法 |
CN106502745A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种函数调用方法和装置 |
CN107291480A (zh) * | 2017-08-15 | 2017-10-24 | 中国农业银行股份有限公司 | 一种函数调用方法及装置 |
CN108037989A (zh) * | 2017-12-15 | 2018-05-15 | 北京小米移动软件有限公司 | Sdk组件识别方法及装置 |
-
2018
- 2018-06-06 CN CN201810575681.2A patent/CN110569644B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040168078A1 (en) * | 2002-12-04 | 2004-08-26 | Brodley Carla E. | Apparatus, system and method for protecting function return address |
CN103679032A (zh) * | 2013-12-13 | 2014-03-26 | 北京奇虎科技有限公司 | 防御恶意软件的方法和装置 |
CN106464513A (zh) * | 2014-06-27 | 2017-02-22 | 迈克菲股份有限公司 | 用于抑制恶意调用的系统和方法 |
CN106502745A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种函数调用方法和装置 |
CN107291480A (zh) * | 2017-08-15 | 2017-10-24 | 中国农业银行股份有限公司 | 一种函数调用方法及装置 |
CN108037989A (zh) * | 2017-12-15 | 2018-05-15 | 北京小米移动软件有限公司 | Sdk组件识别方法及装置 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023165307A1 (zh) * | 2022-03-01 | 2023-09-07 | 阿里巴巴(中国)有限公司 | 函数调用方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110569644B (zh) | 2023-05-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107426169B (zh) | 一种基于权限的业务处理方法及装置 | |
CN106446672B (zh) | 一种Android第三方类库权限隔离方法及装置 | |
US9465948B2 (en) | Trust level activation | |
CN113079200A (zh) | 一种数据处理的方法、装置及系统 | |
US10171502B2 (en) | Managed applications | |
CN106951795B (zh) | 一种应用程序数据访问隔离方法及装置 | |
JP5933938B2 (ja) | オブジェクト指向言語で記述されたアプリケーションのクラスの複数のメソッドのうち1つを選択的にプロテクトするメソッド又はデバイス | |
CN115378735B (zh) | 一种数据处理方法、装置、存储介质及电子设备 | |
CN112560022A (zh) | 一种系统接口调用的检测方法及装置 | |
CN114091099A (zh) | 一种针对业务系统的权限分级控制方法、设备及存储介质 | |
US10223526B2 (en) | Generating packages for managed applications | |
CN111309334A (zh) | 生成软件安装包的方法、装置、计算机设备及存储介质 | |
CN110245464B (zh) | 保护文件的方法和装置 | |
CN111786792A (zh) | 一种基于区块链的数据变更记录方法和装置 | |
US8010773B2 (en) | Hardware constrained software execution | |
US10339302B2 (en) | Creating multiple workspaces in a device | |
CN113127516B (zh) | 一种区块链数据的处理方法、装置及设备 | |
CN110569644A (zh) | 调用请求的处理、功能函数的调用方法、装置及设备 | |
US20100146634A1 (en) | Data protection device and method | |
CN105760164B (zh) | 一种用户空间文件系统中acl权限的实现方法 | |
CN113220314B (zh) | App资源加载及apk生成方法、装置、设备及介质 | |
CN112835677A (zh) | 一种基于沙盒的固有数据保护方法及系统 | |
WO2020015151A1 (zh) | 数据库表的参数插入方法、装置、终端设备及存储介质 | |
WO2024001642A1 (zh) | Usb设备的管控方法、云端设备、终端设备及存储介质 | |
CN115828247B (zh) | 一种小程序的异常检测方法、装置、设备及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40018697 Country of ref document: HK |
|
GR01 | Patent grant | ||
GR01 | Patent grant |