CN108446149B - 一种第三方动态库接口拦截方法及系统 - Google Patents

一种第三方动态库接口拦截方法及系统 Download PDF

Info

Publication number
CN108446149B
CN108446149B CN201810168813.XA CN201810168813A CN108446149B CN 108446149 B CN108446149 B CN 108446149B CN 201810168813 A CN201810168813 A CN 201810168813A CN 108446149 B CN108446149 B CN 108446149B
Authority
CN
China
Prior art keywords
pointer
dynamic library
virtual function
interface class
party
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.)
Active
Application number
CN201810168813.XA
Other languages
English (en)
Other versions
CN108446149A (zh
Inventor
冉瑞元
张佳宁
张道宁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Jialan Innovation Technology Co ltd
Original Assignee
Nolo Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nolo Co ltd filed Critical Nolo Co ltd
Priority to CN201810168813.XA priority Critical patent/CN108446149B/zh
Publication of CN108446149A publication Critical patent/CN108446149A/zh
Application granted granted Critical
Publication of CN108446149B publication Critical patent/CN108446149B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

本发明公开了一种第三方动态库接口拦截方法及系统。该方法包括如下步骤:获取第三方动态库接口接入的指针接口类,创建该指针接口类的子类;对该子类进行实例化创建子类实例化对象,得到虚函数表指针;获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置;当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。该方法可以实现任意第三方动态库接口的拦截,不会因为第三方产品的规格和型号不同,或者其光学系统以及通信方式不同而产生遗漏。

Description

一种第三方动态库接口拦截方法及系统
技术领域
本发明涉及一种第三方动态库接口拦截方法,同时涉及相应的第三方动态库接口拦截系统。
背景技术
动态库又称动态链接库(Dynamic Link Library),缩写为DLL。DLL是一个包含可由多个程序同时使用的代码和数据的库。它使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL副本的内容。
随着动态库的迅速发展以及广泛应用,通过第三方动态库接口可以进行诸多操作,以达到系统本身对信息的需求。例如,在申请号为201410083145.2的中国专利申请中,提供了一种基于动态库API拦截的数据采集方法,通过编写与被替换动态库同名的新的替换动态库,将被替换动态库更改为其它名字;应用程序调用替换动态库的API,替换动态库获取目标信息系统处理或传输过程中的数据,以此来实现通过拦截动态链接库的API获取目标信息系统传输过程中的中间数据,从而获得系统运行的关键信息。
另外,在专利号为ZL 201210187455.X的中国发明专利中,提供了一种用于拦截电子设备的操作系统中应用程序对服务调用的方法和装置。通过将拦截动态库加载到服务所在的进程;将进程中的输入输出控制函数的地址替换为拦截动态库的第一地址;在应用程序对服务进行调用时,基于第一地址执行拦截动态库,获得应用程序的名称和信息和调用的信息,并将调用的信息中包括的要被调用的服务的地址替换为拦截动态库的第二地址;基于第二地址,根据应用程序的名称和/或信息来执行处理,以提高电子设备操作系统的安全性。
发明内容
针对现有技术的不足,本发明所要解决的首要技术问题在于提供一种第三方动态库接口拦截方法。
本发明所要解决的另一技术问题在于提供一种第三方动态库接口拦截系统。
为实现上述发明目的,本发明采用下述的技术方案:
根据本发明实施例的第一方面,提供一种第三方动态库接口拦截方法,包括如下步骤:
获取第三方动态库接口接入的指针接口类,创建所述指针接口类的子类;
对所述子类进行实例化创建子类实例化对象,得到虚函数表指针;
获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置;
当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。
其中较优地,获取指针接口类的虚函数表指针的内容之后,将所述指针接口类的虚函数表指针的内容进行保存,通过访问所述指针接口类的虚函数表指针的内容,子类的实例化对象可以访问所述指针接口类。
其中较优地,用于虚拟现实场景时,第三方设备动态库接入steam平台;包括如下步骤:
第三方设备动态库和定位设备动态库分别获取steam平台中OpenVr的捕捉姿态设备接口类,创建该捕捉姿态设备接口类的子类,对所述子类进行实例化,并得实例化对象指针;
获取第三方设备动态库接口接入的设备接入接口类,创建所述设备接入接口类的子类;
对所述设备接入接口类的子类进行实例化创建子类实例化对象,得到虚函数表指针;
当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;
第三方设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的子类的虚函数表的第一个内存地址,实现拦截。
其中较优地,在第三方设备动态库和定位设备动态库分别获取OpenVr的捕捉姿态设备接口类之前,定位设备动态库获取第三方设备动态库的配置文件,并进行改写,使Steam不能加载到第三方设备的库文件。
其中较优地,当定位设备动态库通过实例化对象指针调用第三方设备动态库中的函数时,将第三方设备动态库加载到定位设备的驱动程序中。
其中较优地,定位设备动态库通过第三方设备动态库的捕捉姿态设备接口类的子类实例化对象指针调用第三方设备动态库。
其中较优地,采用虚函数指针还原函数,将设备接入接口类的虚函数表指针的内容还原为原始的虚函数表指针位置;定位设备动态库通过原始的虚函数表指针位置访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据。
其中较优地,当定位设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据完成之后,还包括如下步骤:
继续调用虚函数指针替换函数将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;供第三方设备动态库访问OpenVr时对第三方设备动态库接口进行拦截。
根据本发明实施例的第二方面,提供一种第三方动态库接口拦截系统,包括处理器和存储器;所述存储器上存储有可用在所述处理器上运行的计算机程序,当所述计算机程序被所述处理器执行时实现如下步骤:
获取第三方动态库接口接入的指针接口类,创建所述指针接口类的子类;
对所述子类进行实例化创建子类实例化对象,得到虚函数表指针;
获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置;
当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。
其中较优地,用于虚拟现实场景时,第三方设备动态库接入steam平台;包括处理器和存储器;所述存储器上存储有可用在所述处理器上运行的计算机程序,当所述计算机程序被所述处理器执行时实现如下步骤:
第三方设备动态库和定位设备动态库分别获取steam平台中OpenVr的捕捉姿态设备接口类,创建该捕捉姿态设备接口类的子类,对所述子类进行实例化,并得实例化对象指针;
获取第三方设备动态库接口接入的设备接入接口类,创建所述设备接入接口类的子类;
对所述设备接入接口类的子类进行实例化创建子类实例化对象,得到虚函数表指针;
当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;
第三方设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的子类的虚函数表的第一个内存地址,实现拦截。
本发明所提供的第三方动态库接口拦截方法,通过获取第三方动态库接口接入的指针接口类,创建该指针接口类的子类,对该子类进行实例化创建子类实例化对象,得到虚函数表指针。然后,获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置。当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。该方法可以实现任意第三方动态库接口的拦截,不会因为第三方产品的规格和型号不同,或者其光学系统以及通信方式不同而产生遗漏。而且通过对第三方动态库接口的拦截,可以获取第三方的相关信息,包括设备序列号,Steam分配的设备ID,以及视口信息等,使我们的定位设备更好地适配于第三方产品。
附图说明
图1为本发明所提供的第三方动态库接口拦截方法的流程图;
图2为本发明所提供的第三方动态库接口拦截系统的结构示意图。
具体实施方式
下面结合附图和具体实施例对本发明的技术内容进行详细具体的说明。
通常情况下,软件会提供一些SDK(Software Development Kit,即软件开发工具包)供其他开发者使用,一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。在本发明所提供的实施例中,主要提供的是:C++的头文件(.h)和相应的动态库文件(.dll),以及相应的lib库文件(.lib)。头文件中会暴露一些接口类、导出函数、结构体、宏定义等内容。本发明所提供的第三方动态库接口拦截方法,主要针对暴露出来的接口类,进行拦截。在暴露出来的导出函数中,SDK会返回一些接口指针。当获取该接口指针后,开发者就可以调用接口类中的一些方法。然而获得这个接口指针后完全可以做其他事情,比如拦截其他想要接入该指针接口类的第三方动态库。
如图1所示,本发明所提供的第三方动态库接口拦截方法,包括如下步骤:首先,获取第三方动态库接口接入的指针接口类,创建该指针接口类的子类,该子类继承该指针接口类。其次,对该子类进行实例化创建子类实例化对象,得到虚函数表指针。然后,获取该指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置。最后,当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。下面对这一过程做详细具体的说明。
S11,获取第三方动态库接口接入的指针接口类,创建该指针接口类的子类,该子类继承该指针接口类。
假设获取的第三方动态库接口想要接入的指针接口类为IFACE*m_S。其中,m_S为IFACE的一个实例化对象。从IFACE类继承一个子类CFACE*m_My,这个子类实现了IFACE类中的所有方法。
其中,创建该指针接口类的子类,可以采用如下继承方法:
classCFACE:public IFace{}。
S12,对该子类进行实例化创建子类实例化对象,得到虚函数表指针。
在面向对象的编程中,通常把用类创建对象的过程称为实例化。格式化有:类名对象名=new类名(参数1,参数2...参数n)。如:Date date=new Date();就是用日期类创建了一个日期的对象。在本发明所提供的实施例中,对该子类进行实例化创建子类的实例化对象。
多数语言中,实例化一个对象就是为对象开辟内存空间,或者是不用声明,直接使用new构造函数名,建立一个临时对象。
例如:Java语言采用如下方式对一个类进行实例化:
Figure GDA0002996176270000061
例如:c#语言采用如下方式对一个类进行实例化:
Figure GDA0002996176270000062
在本发明所提供的实施例中,对创建的子类CFACE进行实例化,构建一个实例化对象m_My。在创建实例化对象的同时,自动为该子类分配一个对应的虚函数表。类的虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址。
虚函数(Virtual Function)是通过一张虚函数表来实现的。在这个虚函数表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其真实反应实际的函数。这样,在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。
在创建实例化对象之后,编译器自动创建该子类对应的虚函数表指针,保证虚函数表指针存在于对象实例中最前面的位置,这意味着可以通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数,或访问其对应的地址。
S13,获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置。
获取指针接口类的虚函数表指针的内容,即获取指针接口类对应的实例化对象m_S的内存第一个位置,前已述及,通过实例化对象m_S的内存第一个位置可以得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数或访问其对应的地址。
获取指针接口类的虚函数表指针的内容之后,将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置。即将m_S的内存第一个位置(既虚函数表指针)的内容替换为m_My的第一个内存地址。这样,通过访问m_S的内存第一个位置(既虚函数表指针)的内容获取的是子类对应的函数或者地址,可以有效的拦截第三方动态库接口送入IFACE的内容了,可以修改其值,或者直接拦截掉。
在本发明所提供的实施例中,获取指针接口类的虚函数表指针的内容之后,将其保存下来,通过该指针接口类的虚函数表指针的内容,子类的实例化对象可以访问该指针接口类。
S14,当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。
当第三方动态库接口访问指针接口类时,会通过指针接口类的虚函数表指针的内容进行访问,此时,指针接口类的虚函数表指针的内容已经替换为子类的虚函数表的第一个内存地址(即子类的虚函数表的第一个内存位置),第三方接口会通过虚函数表指针的内容访问子类的虚函数表的第一个内存地址,进而实现对第三方动态库接口对指针接口类访问的有效拦截。
下面以一个具体的实施例,对上述第三方动态库接口拦截方法进行详细的说明。
虚拟现实(VR)是指采用计算机技术为核心,利用现代高科技手段生成一种虚拟环境,用户借助特殊的输入/输出设备,通过视觉、听觉和触觉等获得与真实世界相同的感受。虚拟现实技术是一种综合应用计算机图形学、人机接口技术、传感器技术以及人工智能等技术,制造逼真的人工模拟环境,并能有效地模拟人在自然环境中的各种感知的高级的人机交互技术。
在本发明所提供的实施例中,针对的一个场景是,各个第三方设备(VR头盔)厂商为了让自己的头盔能够玩Steam平台(即Steam)上的VR游戏,都实现了Steam平台上OpenVr提供的一些接口,OpenVr是VR设备通用API。其中OpenVr最主要的接口是:ITrackedDeviceServerDriver、IServerTrackedDeviceProvider和IVRServerDriverHost。
其中,ITrackedDeviceServerDriver是捕捉姿态设备的接口类,如定位设备(包括但不限于手柄、头盔定位器)、头盔等的实现,都会通过这个接口实现。实现的主要功能有激活设备,获取位置等。IServerTrackedDeviceProvider是提供给OpenVr的一个设备上下文功能的接口,主要实现了环境初始化,帧调用,是否进入等待状态。IVRServerDriverHost(即设备接入接口类)是OpenVr提供给开发者的接口,主要是实现定位设备、头盔设备的添加,以及事件处理等功能,在本发明所提供的实施例中,我们的定位设备需要拦截的第三方设备动态库想要接入的接口就是这个IVRServerDriverHost接口。
因为所有的VR头盔厂商都会使用或者实现这三个接口。所以当我们的定位设备进行使用时,需要做的就是拦截IVRServerDriverHost这个接口所指向的内容。先让Steam加载定位设备提供的Driver动态库。当定位设备的Driver动态库接入后,就对IVRServerDriverHost接口的接收内容进行拦截。使第三方设备动态库接口无法获取到Steam的指向内容,而是获取到了定位设备改写后的内容,从而达到拦截第三方接口的效果。具体包括如下步骤:
S21,第三方设备动态库和定位设备动态库分别获取OpenVr的ITrackedDeviceServerDriver接口类(即捕捉姿态设备接口类),创建该捕捉姿态设备接口类的子类,对该子类进行实例化,并得实例化对象指针。
第三方设备动态库和定位设备动态库分别获取OpenVr的ITrackedDeviceServerDriver接口类之前,定位设备动态库获取第三方设备动态库的配置文件,并进行改写,使Steam不能加载到第三方设备的库文件。防止后期定位设备动态库未对OpenVr的IVRServerDriverHost接口类的虚函数表指针的内容进行修改前,第三方设备动态库优先请求加载,而导致OpenVr加载第三方设备动态库的情况。
第三方设备动态库和定位设备动态库分别获取OpenVr的ITrackedDeviceServerDriver接口类之前,定位设备动态库获取第三方设备动态库的配置文件,并进行改写,具体修改步骤是,手动改写第三方厂商提供给openvr的驱动配置文件driver.vrdrivermanifest,这是一个json格式的文件,将其中的name的值后面可以添加一个或多个字母,这样就可以使Steam不能够加载到第三方头盔库的Dll文件。其中,对第三方设备动态库的配置文件进行改写,还可以采用其他软件方法实现,只要将将其中的name的值进行变更即可。
第三方设备动态库和定位设备动态库分别获取OpenVr的ITrackedDeviceServerDriver接口类(即捕捉姿态设备接口类),创建该捕捉姿态设备接口类的子类,并对该子类进行实例化,并得实例化对象指针。
其中,在本发明所提供的实施例中,第三方设备动态库采用void*HmdDriverFactory(参数)实现捕捉姿态设备接口类的子类的实例化对象指针。void*HmdDriverFactory(参数)是OpenVr让所有第三方设备需要实现的接口函数。这个接口函数返回一个实例化对象指针。通过该指针,可以调用第三方设备动态库中的函数。
当定位设备动态库通过实例化对象指针调用第三方设备动态库中的函数时,将第三方设备动态库加载到定位设备的驱动程序中。
S22,获取第三方设备动态库接口接入的IVRServerDriverHost接口类(即设备接入接口类),创建该设备接入接口类的子类。
获取第三方设备动态库接口接入的IVRServerDriverHost接口类(即设备接入接口类),创建该设备接入接口类的子类VRHostInjector,这个类派生于vr::IVRServerDriverHost,它实现了所有的vr::IVRServerDriverHost中的接口。
S23,对该设备接入接口类的子类进行实例化创建子类实例化对象,得到虚函数表指针。
对该设备接入接口类的子类进行实例化创建子类实例化对象,当定位设备动态库通过new方法创建一个子类实例化对象VRHostInjector的时候,这个设备接入接口类的子类包含了一个虚函数表指针,指向子类实例化对象VRHostInjector的虚函数表。这个得到虚函数表指针的步骤由编译器自动完成。
S24,当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置。
采用OpenVr提供的IServerTrackedDeviceProvider::Init(参数)在定位设备中初始化OpenVr环境。当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置。因为还需要使用到原始的虚函数表指针位置(即虚函数指针替换函数获取的设备接入接口类的虚函数表指针的内容),所以应该将原始的虚函数表指针保存下来,以备后用。
其中,虚函数指针替换函数为inject(),用于将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置。在本发明所提供的实施例中,虚函数指针替换函数采用如下代码实现:
Figure GDA0002996176270000111
S25,第三方设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的子类的虚函数表的第一个内存地址,实现拦截。
当第三方设备动态库请求接入OpenVr时,OpenVr加载定位设备的动态库,通过设备接入接口类的虚函数表指针的内容,获取设备接入接口类的子类的虚函数表的第一个内存位置,进而实现对第三方设备动态库接口的拦截。这样,当第三方设备动态库将关键信息传递过来时,我们的定位设备动态库就可以获取其内容:包括设备序列号,Steam分配的设备ID,以及视口信息等。然后调用Steam的相应接口,使驱动正常的运转起来,实现定位设备与第三方设备的数据互动,使用户在虚拟环境下,实现观看视频和互动的双重功能的效果。
在本发明所提供的实施例中,当实现对第三方设备动态库对OpenVr的拦截之后,还包括如下步骤:
S26,定位设备动态库通过第三方设备动态库的捕捉姿态设备接口类的子类实例化对象指针调用第三方设备动态库。也可以获取第三方设备动态库准备传入到OpenVr的数据。
在本发明所提供的实施例中,实现对第三方设备动态库接口的拦截,主要是为了实现通过定位设备动态库实现第三方设备动态库对OpenVr的连接,进而实现定位设备与第三方设备的数据互动,使用户在虚拟环境下,实现观看视频和互动的双重功能,还包括如下步骤:
S27,采用虚函数指针还原函数,将设备接入接口类的虚函数表指针的内容还原为该虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容(原始的虚函数表指针位置);定位设备通过原始的虚函数表指针位置访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据。
因为当虚函数替换后,this指针指向的内容是错误的,即this指针指向的内容是定位设备中设备接入接口类的子类的虚函数表的第一个内存位置,定位设备动态库也无法实现对OpenVr的连接。所以在所有的接口内,需要先进行虚函数指针还原操作,调用原始的steam接口。其中,虚函数指针还原函数为unInject(),用于将设备接入接口类的虚函数表指针的内容还原为起初虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容。在本发明所提供的实施例中,虚函数指针还原函数采用如下代码实现:
Figure GDA0002996176270000121
定位设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的函数,通过定位设备实现对保存在定位设备中的第三方设备的数据进行调用。
在本发明所提供的实施例中,并不只有一个第三方设备动态库需要连接到OpenVr,所以当定位设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据完成之后,还包括如下步骤:
S28,继续调用虚函数指针替换函数将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;供第三方设备动态库访问OpenVr时对第三方设备动态库接口进行拦截。
调用完成后,继续调用虚函数指针替换函数inject()将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置。
因为在实现IVRServerDriverHost的接口时,需要先进行虚函数指针还原操作,再调用原始的接口函数,最后再继续拦截,所以在本发明所提供的实施例中,通过定义一个宏来进行实现。这个宏只适合于返回值为空的接口函数。
#define INJECT(Pre){unInject();{Pre}inject();}
采用宏实现上述操作为本领域常用方法,在此便不在赘述了。
除了上述实施例以外,本发明所提供的第三方动态库接口拦截方法还可以用于任何第三方动态库接口访问动态库进行拦截情形。在此便不在赘述了。
本发明还提供了一种第三方动态库接口拦截系统,用以实现上述的第三方动态库接口拦截方法。如图2所示,该系统包括处理器22以及存储有处理器22可执行指令的存储器21;
其中,处理器22可以是通用处理器,例如中央处理器(CPU),还可以是数字信号处理器(DSP)、专用集成电路(ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路。
其中,存储器21,用于存储程序代码,并将该程序代码传输给CPU。存储器21可以包括易失性存储器,例如随机存取存储器(RAM);存储器21也可以包括非易失性存储器,例如只读存储器、快闪存储器、硬盘或固态硬盘;存储器21还可以包括上述种类的存储器的组合。
具体地,本发明实施例所提供的第三方动态库接口拦截系统,包括处理器22和存储器21;存储器21上存储有可用在处理器22上运行的计算机程序,当计算机程序被处理器32执行时实现如下步骤:
获取第三方动态库接口接入的指针接口类,创建该指针接口类的子类,该子类继承该指针接口类;
对该子类进行实例化创建子类实例化对象,得到虚函数表指针;
获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置;
当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。
其中,当计算机程序被处理器22执行时实现如下步骤;
获取动态库的指针接口类的虚函数表指针的内容之后,将所述动态库的指针接口类的虚函数表指针的内容进行保存,通过访问所述动态库的指针接口类的虚函数表指针的内容,子类的实例化对象可以访问动态库。
其中,当计算机程序被处理器22执行时实现如下步骤;
当定位设备动态库通过实例化对象指针调用第三方设备动态库中的函数时,将第三方设备动态库加载到定位设备的驱动程序中。
其中,获取指针接口类的虚函数表指针的内容之后;当计算机程序被处理器22执行时实现如下步骤;
将该指针接口类的虚函数表指针的内容进行保存,通过访问该指针接口类的虚函数表指针的内容,子类的实例化对象可以访问该指针接口类。
其中,第三方动态库接口拦截方法用于虚拟现实场景,第三方设备动态库接入steam平台;当计算机程序被处理器22执行时实现如下步骤;
第三方设备动态库和定位设备动态库分别获取OpenVr的捕捉姿态设备接口类,创建该捕捉姿态设备接口类的子类,对该子类进行实例化,并得实例化对象指针;
获取第三方设备动态库接口接入的设备接入接口类,创建该设备接入接口类的子类;
对该设备接入接口类的子类进行实例化创建子类实例化对象,得到虚函数表指针;
当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;
第三方设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的子类的虚函数表的第一个内存地址,实现拦截。
其中,当计算机程序被处理器22执行时实现如下步骤;
在第三方设备动态库和定位设备动态库分别获取OpenVr的捕捉姿态设备接口类之前,定位设备动态库获取第三方设备动态库的配置文件,并进行改写,使Steam不能加载到第三方设备的库文件。
其中,当实现对第三方设备动态库对OpenVr的拦截之后,当计算机程序被处理器22执行时实现如下步骤;
定位设备动态库通过第三方设备动态库的捕捉姿态设备接口类的子类实例化对象指针调用第三方设备动态库。
其中,当计算机程序被处理器22执行时实现如下步骤;
采用虚函数指针还原函数,将设备接入接口类的虚函数表指针的内容还原为该虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容(原始的虚函数表指针位置);定位设备通过原始的虚函数表指针位置访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据。
其中,当定位设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据完成之后,当计算机程序被处理器22执行时实现如下步骤;
继续调用虚函数指针替换函数将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;供第三方设备动态库访问OpenVr时对第三方设备动态库接口进行拦截。
上面对本发明所提供的第三方动态库接口拦截方法及系统进行了详细的说明。对本领域的一般技术人员而言,在不背离本发明实质精神的前提下对它所做的任何显而易见的改动,都将构成对本发明专利权的侵犯,将承担相应的法律责任。

Claims (10)

1.一种第三方动态库接口拦截方法,其特征在于包括如下步骤:
获取第三方动态库接口接入的指针接口类,创建所述指针接口类的子类;
对所述子类进行实例化创建子类实例化对象,得到虚函数表指针;
获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置;
当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。
2.如权利要求1所述的第三方动态库接口拦截方法,其特征在于:
获取指针接口类的虚函数表指针的内容之后,将所述指针接口类的虚函数表指针的内容进行保存,通过访问所述指针接口类的虚函数表指针的内容,子类的实例化对象访问所述指针接口类。
3.如权利要求1所述的第三方动态库接口拦截方法,用于虚拟现实场景,第三方设备动态库接入steam平台;其特征在于包括如下步骤:
第三方设备动态库和定位设备动态库分别获取steam平台中OpenVr的捕捉姿态设备接口类,创建该捕捉姿态设备接口类的子类,对所述子类进行实例化,并得实例化对象指针;
获取第三方设备动态库接口接入的设备接入接口类,创建所述设备接入接口类的子类;
对所述设备接入接口类的子类进行实例化创建子类实例化对象,得到虚函数表指针;
当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;
第三方设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的子类的虚函数表的第一个内存地址,实现拦截。
4.如权利要求3所述的第三方动态库接口拦截方法,其特征在于:
在第三方设备动态库和定位设备动态库分别获取OpenVr的捕捉姿态设备接口类之前,定位设备动态库获取第三方设备动态库的配置文件,并进行改写,使Steam不能加载到第三方设备的库文件。
5.如权利要求3所述的第三方动态库接口拦截方法,其特征在于:
当定位设备动态库通过实例化对象指针调用第三方设备动态库中的函数时,将第三方设备动态库加载到定位设备的驱动程序中。
6.如权利要求3所述的第三方动态库接口拦截方法,其特征在于:
定位设备动态库通过第三方设备动态库的捕捉姿态设备接口类的子类实例化对象指针调用第三方设备动态库。
7.如权利要求3所述的第三方动态库接口拦截方法,其特征在于:
采用虚函数指针还原函数,将设备接入接口类的虚函数表指针的内容还原为原始的虚函数表指针位置;定位设备动态库通过原始的虚函数表指针位置访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据;其中,所述原始的虚函数表指针位置是虚函数指针替换函数获取的设备接入接口类的虚函数表指针的内容。
8.如权利要求7所述的第三方动态库接口拦截方法,其特征在于当定位设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的函数,通过定位设备动态库调用第三方设备动态库的数据完成之后,还包括如下步骤:
继续调用虚函数指针替换函数将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;供第三方设备动态库访问OpenVr时对第三方设备动态库接口进行拦截。
9.一种第三方动态库接口拦截系统,其特征在于包括处理器和存储器;所述存储器上存储有可用在所述处理器上运行的计算机程序,当所述计算机程序被所述处理器执行时实现如下步骤:
获取第三方动态库接口接入的指针接口类,创建所述指针接口类的子类;
对所述子类进行实例化创建子类实例化对象,得到虚函数表指针;
获取指针接口类的虚函数表指针的内容,并将指针接口类的虚函数表指针的内容替换为子类的虚函数表的第一个内存位置;
当第三方动态库接口访问指针接口类时,通过指针接口类的虚函数表指针的内容访问子类的虚函数表的第一个内存地址,实现拦截。
10.如权利要求9所述的第三方动态库接口拦截系统,用于虚拟现实场景,第三方设备动态库接入steam平台,其特征在于还包括如下步骤:
第三方设备动态库和定位设备动态库分别获取steam平台中OpenVr的捕捉姿态设备接口类,创建该捕捉姿态设备接口类的子类,对所述子类进行实例化,并得实例化对象指针;
获取第三方设备动态库接口接入的设备接入接口类,创建所述设备接入接口类的子类;
对所述设备接入接口类的子类进行实例化创建子类实例化对象,得到虚函数表指针;
当第三方设备动态库请求接入OpenVr时,虚函数指针替换函数获取设备接入接口类的虚函数表指针的内容,并将设备接入接口类的虚函数表指针的内容替换为设备接入接口类的子类的虚函数表的第一个内存位置;
第三方设备动态库通过设备接入接口类的虚函数表指针的内容访问设备接入接口类的子类的虚函数表的第一个内存地址,实现拦截。
CN201810168813.XA 2018-02-28 2018-02-28 一种第三方动态库接口拦截方法及系统 Active CN108446149B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810168813.XA CN108446149B (zh) 2018-02-28 2018-02-28 一种第三方动态库接口拦截方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810168813.XA CN108446149B (zh) 2018-02-28 2018-02-28 一种第三方动态库接口拦截方法及系统

Publications (2)

Publication Number Publication Date
CN108446149A CN108446149A (zh) 2018-08-24
CN108446149B true CN108446149B (zh) 2021-07-20

Family

ID=63193136

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810168813.XA Active CN108446149B (zh) 2018-02-28 2018-02-28 一种第三方动态库接口拦截方法及系统

Country Status (1)

Country Link
CN (1) CN108446149B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109947407B (zh) * 2019-03-07 2022-07-26 腾讯科技(北京)有限公司 一种数据获取方法及装置
CN112306472A (zh) * 2020-10-27 2021-02-02 深圳市元征科技股份有限公司 一种程序接口传参方法、系统及相关设备
CN112653836A (zh) * 2020-12-14 2021-04-13 珠海格力智能装备有限公司 图像采集方法和装置、存储介质、处理器
CN113672308B (zh) * 2021-08-13 2023-10-20 深圳市瑞立视多媒体科技有限公司 一种vr空间定位系统适配方法、装置和计算机设备
CN113900729B (zh) * 2021-09-23 2024-04-12 深圳市瑞立视多媒体科技有限公司 一种SteamVR系统的追踪设备参数配置方法及装置
CN113904879A (zh) * 2021-12-10 2022-01-07 北京指掌易科技有限公司 移动端的文件追踪方法、装置、电子设备和存储介质
CN114741131B (zh) * 2022-04-02 2023-08-15 深圳软牛科技有限公司 动态库导出符号的隐藏方法、装置、设备及存储介质
CN115952017B (zh) * 2023-03-09 2023-05-23 腾讯科技(深圳)有限公司 一种内存处理方法、装置、设备及介质
CN117707651B (zh) * 2023-12-12 2024-05-14 北京宜通华瑞科技有限公司 基于嵌入式Linux系统的接口资源操作方法及系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6199095B1 (en) * 1996-01-29 2001-03-06 Compaq Computer Corporation System and method for achieving object method transparency in a multi-code execution environment
US6874149B1 (en) * 2000-06-28 2005-03-29 Microsoft Corporation Hooking of replacement and augmented API functions
CN102693394A (zh) * 2012-06-07 2012-09-26 奇智软件(北京)有限公司 一种用于拦截应用程序对服务的调用的方法和装置
CN103164204A (zh) * 2011-12-15 2013-06-19 北京新媒传信科技有限公司 基于Symbian系统的用户界面的生成方法和系统
CN105808251A (zh) * 2016-03-03 2016-07-27 武汉斗鱼网络科技有限公司 一种基于虚函数表劫持绕过安全检测的方法与系统
CN106126981A (zh) * 2016-08-30 2016-11-16 电子科技大学 基于虚拟函数表替换的软件安全防护方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101441566B (zh) * 2008-11-18 2012-04-25 腾讯科技(深圳)有限公司 一种在嵌入式平台上动态链接程序的方法
CN101770360B (zh) * 2008-12-29 2013-01-16 上海科泰世纪科技有限公司 构件化软件系统中构件的继承方法
WO2012135192A2 (en) * 2011-03-28 2012-10-04 Mcafee, Inc. System and method for virtual machine monitor based anti-malware security
CN102693395B (zh) * 2012-06-07 2015-02-11 北京奇虎科技有限公司 一种用于拦截应用程序对服务的调用的方法和装置
CN106991324B (zh) * 2017-03-30 2020-02-14 兴华永恒(北京)科技有限责任公司 一种基于内存保护类型监控的恶意代码跟踪识别方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6199095B1 (en) * 1996-01-29 2001-03-06 Compaq Computer Corporation System and method for achieving object method transparency in a multi-code execution environment
US6874149B1 (en) * 2000-06-28 2005-03-29 Microsoft Corporation Hooking of replacement and augmented API functions
CN103164204A (zh) * 2011-12-15 2013-06-19 北京新媒传信科技有限公司 基于Symbian系统的用户界面的生成方法和系统
CN102693394A (zh) * 2012-06-07 2012-09-26 奇智软件(北京)有限公司 一种用于拦截应用程序对服务的调用的方法和装置
CN105808251A (zh) * 2016-03-03 2016-07-27 武汉斗鱼网络科技有限公司 一种基于虚函数表劫持绕过安全检测的方法与系统
CN106126981A (zh) * 2016-08-30 2016-11-16 电子科技大学 基于虚拟函数表替换的软件安全防护方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Advance Dynamic Malware Analysis Using Api Hooking;Ajay Kumar 等;《International Journal Of Engineering And Computer Science》;20160331;第5卷(第3期);16038-16040 *
基于SSDT的进程注入拦截技术的研究与实现;毕海;《中国优秀硕士学位论文全文数据库信息科技辑》;20111215(第12期);1-60 *
微软研究院Detour开发包之API拦截技术;至尊王者;《https://www.cnblogs.com/flying%5Fbat/archive/2008/04/18/1159996.html》;20080418;1-6 *

Also Published As

Publication number Publication date
CN108446149A (zh) 2018-08-24

Similar Documents

Publication Publication Date Title
CN108446149B (zh) 一种第三方动态库接口拦截方法及系统
CN104714828B (zh) 应用安装、运行方法及装置
Yaghmour Embedded Android: Porting, Extending, and Customizing
Batista et al. Managing dynamic reconfiguration in component-based systems
US5864850A (en) Asynchronous-event opening component of a network component system
US20150339137A1 (en) Methods, systems, and media for binary compatible graphics support in mobile operating systems
US20020129340A1 (en) Reconfigurable isomorphic software representations
US8990790B2 (en) Java native interface array handling in a distributed java virtual machine
US20050240945A1 (en) System and method for dynamic generation of remote proxies
JP2021192254A (ja) パッケージファイルに対する機能拡張方法およびシステム
US8560602B2 (en) Data sharing in a stream processing system
WO2014078341A2 (en) Automatically rendering web or hybrid applications natively
US9983869B2 (en) Adaptive interface for cross-platform component generation
KR20160008245A (ko) 컴퓨팅 플랫폼의 이종 프로세서들 간의 공유 가상 메모리에서의 가상 함수들의 공유
US20160077850A1 (en) Methods, systems, and media for binary compatibility
US20090249311A1 (en) Sharing a native module of compiled code using an abstraction module of interpreted code in a virtual machine environment
US7877749B2 (en) Utilizing and maintaining data definitions during process thread traversals
US9558014B2 (en) System, method and apparatus for transparently enabling software applications with adaptive user interfaces
US20100162207A1 (en) Behavior-first event programming model
US20190102279A1 (en) Generating an instrumented software package and executing an instance thereof
CN111797387B (zh) 拦截外挂插件的方法及装置
CN116954824A (zh) 一种支持多种扩展现实 (xr) 技术规范应用程序与2d应用程序多进程混合运行的运行时系统、数据交互方法、设备及介质
CN106126213B (zh) 一种基于IFML的Android开发建模方法
US20070006121A1 (en) Development activity recipe
CN107133046B (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
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20220608

Address after: Room 804-4, building 1, No. 371, Mingxing Road, Xiaoshan District, Hangzhou, Zhejiang 311202

Patentee after: Hangzhou Jialan Innovation Technology Co.,Ltd.

Address before: 100092 excellent investment space on the second floor of Building 1, Dongsheng International Business Park, Zhongguancun, No.1, yongtaizhuang North Road, Haidian District, Beijing

Patentee before: NOLO Co.,Ltd.

EE01 Entry into force of recordation of patent licensing contract
EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20180824

Assignee: Beijing Intellectual Property Management Co.,Ltd.

Assignor: Hangzhou Jialan Innovation Technology Co.,Ltd.

Contract record no.: X2023110000068

Denomination of invention: A method and system for intercepting third-party dynamic library interfaces

Granted publication date: 20210720

License type: Common License

Record date: 20230531