CN114238871A - So中类成员函数保护方法、存储介质、电子设备及系统 - Google Patents

So中类成员函数保护方法、存储介质、电子设备及系统 Download PDF

Info

Publication number
CN114238871A
CN114238871A CN202111535328.XA CN202111535328A CN114238871A CN 114238871 A CN114238871 A CN 114238871A CN 202111535328 A CN202111535328 A CN 202111535328A CN 114238871 A CN114238871 A CN 114238871A
Authority
CN
China
Prior art keywords
file
virtual member
split
class
functions
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.)
Pending
Application number
CN202111535328.XA
Other languages
English (en)
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.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology 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 Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN202111535328.XA priority Critical patent/CN114238871A/zh
Publication of CN114238871A publication Critical patent/CN114238871A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种SO中类成员函数保护方法、存储介质、电子设备及系统,涉及互联网应用开发领域。该方法包括:根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;对需要拆分的虚成员函数执行拆分操作,使得类的虚成员函数按照拆分映射关系被拆分到不同目标SO文件中;对类的创建代码进行Hook修改,使得对应类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。本发明使得SO文件中的类的成员函数不易被破解,有效提高了核心功能函数的安全性,满足了实际应用需求。

Description

SO中类成员函数保护方法、存储介质、电子设备及系统
技术领域
本发明涉及互联网应用开发领域,具体来讲是一种SO中类成员函数保护方法、存储介质、电子设备及系统。
背景技术
对于操作系统为Linux的电子设备来说,会有很多核心功能编写在SO文件中。例如,账号登陆的算法,其作为安全保护的核心功能并不想被外界查看到,就需要使用底层的SO文件,在SO层内部对账号登陆的算法进行编写,然后对内外都留有接口用于互相通信或是互相调用。进一步来说,所谓SO文件是Linux下的动态链接库,其作用相当于Windows下的.dll文件。在Android中可通过JNI的方式调用动态库文件(*.so)加载SO文件的提供的API。
而实际应用中,由于SO文件通常是由C++语言来编写,而C++中所有的函数则都是由类进行封装,对于一个类中的所有函数编译器则会将所有函数的代码连续的写入SO文件中。那么,对于黑客来说,一旦获取到SO文件则可以直接使用,同时基于类的函数可以找到此类的所有接口,也就可以十分方便地进行函数逆向分析等操作,进而导致核心功能的函数容易被黑客所逆向破解,安全性难以保证。
因此,如何有效地对SO文件中类的成员函数进行保护,从而提高核心功能函数的安全性,是本领域技术人员亟待解决的问题。
发明内容
本发明的目的是为了克服上述背景技术的不足,提供一种SO中类成员函数保护方法、存储介质、电子设备及系统,使得Linux操作系统的电子设备中SO文件的类的成员函数不易被破解,有效提高了核心功能函数的安全性,满足了实际应用需求。
为达到以上目的,第一方面,本发明实施例提供一种SO中类成员函数保护方法,其包括:
根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
作为一个优选的实施方案,对SO文件的虚成员函数、加载初始化进行设置,具体包括以下操作:
对SO文件的虚成员函数进行设置,使其没有调用其他全局变量或者全局函数;
对SO文件的加载初始化进行设置,使得该SO文件在调用系统初始化函数进行加载初始化时,不进行类的创建操作以及调用其被拆分的类的成员函数;并将具有依赖关系的所有SO文件同时进行加载。
作为一个优选的实施方案,所述预设的数据结构包括以下成员变量:虚成员函数被拆分的SO文件名、虚成员函数被拆分的类名、被拆分的虚成员函数的偏移地址、被拆分的虚成员函数的大小、目标SO文件名、目标SO文件中存储被拆分的虚成员函数的偏移地址。
作为一个优选的实施方案,该方法还包括:在每个目标SO文件中增设一个代码段,所述代码段用于存储被拆分的虚成员函数的代码。
作为一个优选的实施方案,对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中,具体包括以下操作:
将原SO文件中需要进行拆分的虚成员函数的代码拷贝到目标SO文件中增设的代码段中;清理原SO文件中需要进行拆分的虚成员函数的代码;根据虚成员函数的代码拷贝到目标SO文件中增设的代码段中的位置,赋值对应的数据结构中所述目标SO文件中存储被拆分的虚成员函数的偏移地址。
作为一个优选的实施方案,将原SO文件中需要进行拆分的虚成员函数的代码拷贝到目标SO文件中增设的代码段中,具体包括以下操作:
根据所述拆分映射关系,在对应的数据结构中获取到原SO文件名、目标SO文件名、被拆分的虚成员函数的偏移地址以及被拆分的虚成员函数的大小;
读取原SO文件和目标SO文件到内存中;
根据被拆分的虚成员函数的偏移地找到该虚成员函数的代码;
从目标SO文件中增设的代码段中申请一段内存空间,其大小为被拆分的虚成员函数的大小;
将找到的虚成员函数的代码拷贝到所述申请的一段内存空间中。
作为一个优选的实施方案,对已执行拆分操作的SO文件的类的创建代码进行Hook修改,具体包括以下操作:对已执行拆分操作的SO文件的类的创建代码进行查找;对每个创建代码的位置进行Hook;修改虚表中的虚成员函数的地址为目标SO文件中拷贝该虚成员函数代码的内存地址。
第二方面,本发明实施例提供一种SO中类成员函数保护系统,其包括:
设置模块,其用于根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
记录模块,其用于通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
拆分模块,其用于对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
Hook模块,其用于对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
第三方面,本发明实施例还提供一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面实施例中的方法。
第四方面,本发明实施例还提供一种电子设备,包括Linux操作系统、存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一方面实施例中的方法。
本发明的有益效果在于:
本发明能够将类的虚成员函数进行拆分和打散,同时基于多个SO文件来进行类的成员函数的拆分,这样就保障了一个独立的SO文件无法单独使用,同时类的虚成员函数也会因拆分而不会连续的分布在同一个SO文件中,从而极大的提高了黑客分析的成本和难度,保障了核心功能函数的安全性,满足了实际应用需求。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面对实施例对应的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中SO中类成员函数保护方法的流程图;
图2为本发明实施例中SO中类成员函数保护系统的结构框图。
图中:10-设置模块,20-记录模块,30-拆分模块,40-Hook模块。
具体实施方式
针对现有技术中,很多核心功能编写在SO文件中,而SO文件中所有的函数都是由类进行封装,每个类的所有函数都是顺序写入一个SO文件中,一旦获取到SO文件则可基于类的函数可以找到此类的所有接口,从而可轻易地进行函数逆向分析等操作,因此存在核心功能的函数容易被黑客所逆向破解,安全性低的问题。本发明旨在提供一种SO中类成员函数保护方法、存储介质、电子设备及系统,能够使得Linux操作系统的电子设备中SO文件的类的成员函数不易被破解,有效提高核心功能函数的安全性,满足了实际应用需求。
为达到上述技术效果,本发明的主要设计思路为:
根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
综上所述,本方案在实现SO文件中类的成员函数的保护时,能够将类的虚成员函数进行拆分和打散,同时基于多个SO文件来进行类的成员函数的拆分,这样就保障了一个独立的SO文件无法单独使用,同时类的虚成员函数也会因拆分而不会连续的分布在同一个SO文件中,从而极大的提高了黑客分析的成本和难度,保障了核心功能函数的安全性,满足了实际应用需求。
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合说明书附图以及具体的实施例对本发明的技术方案进行详细的说明。
但需说明的是:接下来要介绍的示例仅是一些具体的例子,而不作为限制本发明的实施例必须为如下具体的步骤、数值、条件、数据、顺序等。本领域技术人员可以通过阅读本说明书来运用本发明的构思来构造本说明书中未提到的更多实施例。
实施例一
参见图1所示,本实施例提供了一种SO中类成员函数保护方法,该方法包括以下步骤:
步骤S1、根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置。
可以理解的是,对于Linux操作系统下的程序来说,其会有多个SO文件,而现有技术中,其SO文件是不存在依赖关系,并且每个类的所有函数都是存在于一个SO文件中,因此存在核心功能的函数容易被黑客所逆向破解,安全性低的问题。而为了解决上述问题,本实施例需要将一些SO文件中的类的成员函数进行打散和拆分,其会遍布于其他SO文件中,因此SO文件之间就存在了依赖关系。而依赖关系则取决于具体的拆分需求,将一个SO文件中的类的成员函数拆分到了哪个或哪几个SO文件中。
进一步地,基于本实施例中可能存在循环依赖关系(假设一个SO1文件中的类成员函数被拆分到了另一个SO2文件中,那么SO1文件则依赖于SO2文件,而当SO2文件中的一个类的成员函数被拆分到了SO1中,则会存在SO2文件依赖于SO1文件,这样就形成了循环依赖关系),并且依赖也会比较复杂,同时也存在某个SO文件依赖于其他SO文件,那么此时在加载某个SO文件时则必须先加载其依赖的SO文件,因此由于类的成员函数被拆分到不同的SO文件,而为了保障功能的正确性,则需要对各SO文件的加载初始化进行一定的设置,从而保障所有功能是正确可用的。除此之外,由于类的成员函数分为三种:一种是类的静态成员函数,一种是类的成员函数,一种是类的虚成员函数。而其中对于类的虚成员函数则存在其会有一个类的虚表,虚表中存储了所有的成员函数的内存地址,而考虑到本方案后续的函数具体拆分实现的方便性和复杂度,本实施例中则只对类的虚成员函数进行拆分,从而可以简化后续的操作步骤,因此则需要对各SO文件的虚成员函数进行一定的设置。
示例性的,作为一种优选的实施方式,步骤S1中,对SO文件的虚成员函数、加载初始化进行设置,具体包括以下操作:
1)、对SO文件的虚成员函数进行设置,使其没有调用其他全局变量或者全局函数。可以理解的是,由于类的成员函数可能会使用本SO中的全局变量或全局函数等信息,那么这些全局变量或全局函数都存在需要与当前SO关联的功能,因此其都会存在重定位修复的问题。而考虑到跨SO修复重定位等复杂问题,因此本实例对SO文件的虚成员函数进行设置限定,使得在虚成员函数中没有调用其他全局变量或者全局函数,从而不存在重定位的修复问题。这样,则可以简化后续的操作。
2)、对SO文件的加载初始化进行设置,使得该SO文件在调用系统初始化函数进行加载初始化时,不进行类的创建操作以及调用其被拆分的类的成员函数;并将具有依赖关系的所有SO文件同时进行加载。可以理解的是,SO文件在被加载到内存时,其首先会调用其系统初始化函数(即,初始化函数.init和.init_array段函数和JNI_OnLoad函数,这三个初始化函数是加载SO时系统自动进行调用的)。基于本实施例的类的成员函数的拆分,那么对于每个SO文件来说,如果其存在类的成员函数拆分到了其他SO文件中,那么其在上述的初始化函数中则不能够进行创建和调用拆分的类的成员函数,否则会造成程序崩溃。由于其使用和调用是依赖于其他SO文件的,所以本实施例为了简化拆分的复杂度,会使得各SO文件在调用其系统初始化函数进行加载初始化时,不进行类的创建操作以及调用其被拆分的类的成员函数,而在上述初始化函数执行完成后,则可在其他代码执行的任意地方进行类的创建和使用。
从上述操作可以看出,本实施例对SO文件的加载初始化进行了设计,保障了SO文件被加载时,其不会调用到对应的被拆分的类成员函数,从避免了SO文件被加载导致的程序异常。同时,本实施例还会将具有类成员函数拆分的几个SO文件同时一起加载,加载时则只加载SO文件,并不执行SO中的函数,目的是将需要的SO文件加载到内存中,从而方便其他SO进行类成员函数的查找和调用。这样设计则既保证了所有相关SO文件都能够加载,而在被拆分的类查找其成员函数时都能够找到,同时也不会造成SO循环依赖从而无法正确顺序加载SO的情况。
步骤S2、通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系。
可以理解的是,由于本实施例会将SO中的虚成员函数进行拆分,那么则需要设计一个数据结构来存储这样的拆分和映射关系,从而后续使用时才能够正确的执行。具体来说,本实施例中所述预设的数据结构可包括以下成员变量:虚成员函数被拆分的SO文件名,用于表示哪个SO文件中的类的虚成员函数被拆分;虚成员函数被拆分的类名,用于表示哪个类的虚成员函数被拆分;被拆分的虚成员函数的偏移地址,用于记录被拆分的虚成员函数对应于其SO文件的模块偏移地址;被拆分的虚成员函数的大小,用于记录被拆分的虚成员函数的大小;目标SO文件名,用于表示被拆分的虚成员函数被拆分到哪个目标SO文件(依赖的SO文件)中;目标SO文件中存储被拆分的虚成员函数的偏移地址,用于记录被拆分的虚成员函数存储于目标SO文件的模块偏移地址。
举例来说,在具体实现时,所述预设的数据结构可设计如下:
Struct SOFunc{
String so1name;//虚成员函数被拆分的SO1文件名
String class;//虚成员函数被拆分的类名class
Uint64_t func;//被拆分的虚成员函数的偏移地址func
Uint64_t size;//被拆分的虚成员函数的大小size
String so2name;//目标SO2文件名
Uint64_t func2;//目标SO2文件中存储被拆分的虚成员函数的偏移地址func2}
并且,具体实现时对于每个被拆分的类的虚成员函数,都会实例化上述的结构体SOFunc的一个对象来存储该虚成员函数的映射关系。
步骤S3、对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中。
可以理解的是,在记录并储存了各SO文件中虚成员函数的拆分映射关系后,则需要按照所述拆分映射关系,对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中。而拆分操作的本质,实际上就是将需要进行拆分的SO文件中的虚成员函数的代码拷贝到目标SO文件中,并在原SO文件中清除被拆分的虚成员函数的代码,从而实现代码的替换。例如,原本class1类中的一个虚成员函数的代码是存储在SO1文件中的,经过上述操作后,则SO1文件中的class1类的一个虚成员函数处的代码则被修改或者删除了,且相应代码被拷贝到了SO2文件中,这样就完成了代码替换。按照上述拆分操作,就可以实现一个类的虚成员函数分别拆分到不同的SO文件中。而最终则会形成一个用数组来表示的替换列表,用来存储所有的虚成员函数的替换(拆分)关系。
进一步地,为了更好的确保类的虚成员函数能够成功地被拆分到目标SO文件中,即原SO文件中虚成员函数的代码能成功拷贝到目标SO文件中,本实施例在步骤S3之前还包括以下操作:在每个目标SO文件中增设一个代码段。可以理解的是,目标SO文件是需要存储其他SO文件的类的虚成员函数的代码。而通常当SO文件编译器生成好后,其大小已经固定。因此,如果需要在SO文件中添加代码,则需要通过其他的技术来实现添加。为此,本实施例则通过在SO文件中(例如SO文件的尾部)增设一个代码段,以用于存储其他SO文件中的虚成员函数的代码,这样就保障了不管其他虚成员函数的大小是多少,目标SO文件都可以有空间来进行存储,可以适用于各种情况需求。
在此基础上,作为一种可选的实施方式,步骤S3具体包括以下操作:
步骤S31、将原SO文件中需要进行拆分的虚成员函数的代码拷贝到目标SO文件中增设的代码段中。具体来说,实际应用中可包括以下操作:
S31-1、根据所述拆分映射关系,在对应的数据结构中获取到原SO文件名(即虚成员函数被拆分的SO文件名)so1name、目标SO文件名so2name、被拆分的虚成员函数的偏移地址func以及被拆分的虚成员函数的大小size;
S31-2、读取原SO文件和目标SO文件到内存中;
S31-3、根据被拆分的虚成员函数的偏移地址func找到该虚成员函数的代码;
S31-4、从目标SO文件中增设的代码段中申请一段内存空间,其大小为被拆分的虚成员函数的大小size;
S31-5、将找到的虚成员函数的代码拷贝到所述申请的一段内存空间中。
步骤S32、清理原SO文件中需要进行拆分的虚成员函数的代码。可以理解的是,当虚成员函数的代码拷贝到了目标SO文件后,那么原来的这份代码则可以清理掉,具体来说可以采用清理成无效指令或者全部清空操作。
步骤S33、根据虚成员函数的代码拷贝到目标SO文件中增设的代码段中的位置,赋值对应的数据结构中所述目标SO文件中存储被拆分的虚成员函数的偏移地址。
步骤S4、对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
可以理解的是,对于SO文件来说,如果其存在了一个类的虚成员函数被拷贝到了其他SO文件中,那么则需要对现有类的创建进行修改,从而保障原SO文件中的类在创建后,当其调用其虚成员函数时能够调用到拷贝到目标SO文件中的代码中,进而保障类的函数功能是正确的。并且,在具体执行过程中,对原SO文件的类的创建代码进行Hook修改的执行还需要是在SO文件的初始化后立刻进行的,从而保障类一旦创建后,其虚成员函数的地址即被替换。
具体来说,作为一种可选的实施方案,步骤S4中,对已执行拆分操作的SO文件的类的创建代码进行Hook修改,包括以下操作:
1)、对已执行拆分操作的SO文件的类的创建代码进行查找。实际应用中,可查找该SO文件中实例化类代码的代码位置。
2)、对每个创建代码的位置进行Hook。可以理解的是,实际应用中,需要对每个创建类实例的地方的代码进行Hook,其中Hook一定是新建(new)了该对象后,并且调用了该类的构造函数。其中,在C++语言中实例化一个类的对象则是通过调用new函数来实例化,其中在new函数调用完成后立即就会调用该类的构造函数来初始化此类,同时会初始化此类的虚表,其中虚表中存储了类的所有虚函数在内存中的地址。那么,通过对类的实例化对象构造函数调用完成后,虚表的虚函数地址也已经填入到了虚表中,此时在这个赋值完成后进行Hook。
3)、修改虚表中的虚成员函数的地址为目标SO文件中拷贝该虚成员函数代码的内存地址。可以理解的是,本实施例中需要对虚表中的虚成员函数地址进行修改,修改成拷贝到目标SO文件中虚成员函数代码的内存地址,该地址则是该虚成员函数新的内存地址,那么后续调用时则会从虚表中取出该地址进行调用,从而实现当调用该虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码的目的。
从上述步骤S1~S4的操作可以看出,本方案在实现SO中类的成员函数保护时,能够将类的虚成员函数进行拆分和打散,同时基于多个SO文件来进行类的成员函数的拆分,这样就保障了一个独立的SO文件无法单独使用,同时类的虚成员函数也会因拆分而不会连续的分布在同一个SO文件中,从而极大的提高了黑客分析的成本和难度,保障了核心功能函数的安全性,满足了实际应用需求。
实施例二
基于同一发明构思,如图2所示,本发明第二实施例提供一种SO中类成员函数保护系统,其包括:
设置模块10,其用于根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
记录模块20,其用于通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
拆分模块30,其用于对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
Hook模块40,其用于对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
前述方法实施例中的各种变化方式和具体实例同样适用于本实施例的系统,通过前述方法的详细描述,本领域技术人员可以清楚的知道本实施例中系统的实施方法,所以为了说明书的简洁,在此不再详述。
实施例三
基于同一发明构思,本发明第三实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的一种SO中类成员函数保护方法,该方法包括:
根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
实施例四
基于同一发明构思,本发明第四实施例还提供一种电子设备,包括Linux操作系统、存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一实施例中的所有方法步骤或部分方法步骤。示例性地,以电子设备为移动端为例进行说明,该移动端包括Linux操作系统、存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一实施例中的SO中类成员函数保护方法的所有步骤或部分方法步骤。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述计算机装置的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、视频数据等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
总体来说,本发明实施例提供的一种SO中类成员函数保护方法、存储介质、电子设备及系统,使得Linux操作系统的电子设备中SO文件的类的成员函数不易被破解,有效提高了核心功能函数的安全性,满足了实际应用需求。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
注意:上述的具体实施例仅是例子而非限制,且本领域技术人员可以根据本发明的构思从上述分开描述的各个实施例中合并和组合一些步骤和装置来实现本发明的效果,这种合并和组合而成的实施例也被包括在本发明中,在此不一一描述这种合并和组合。
本发明实施例中提及的优点、优势、效果等仅是示例,而非限制,不能认为这些优点、优势、效果等是本发明的各个实施例必须具备的。另外,本发明实施例公开的上述具体细节仅是为了示例的作用和便于理解的作用,而非限制,上述细节并不限制本发明实施例必须采用上述具体的细节来实现。
本发明实施例中涉及的器件、装置、设备、系统的方框图仅作为例示性的例子,并且不意图要求或暗示必须按照方框图示出的方式进行连接、布置、配置。如本领域技术人员将认识到的,可以按任意方式连接、布置、配置这些器件、装置、设备、系统。诸如“包括”、“包含”、“具有”等等的词语是开放性词汇,指“包括但不限于”,且可与其互换使用。本发明实施例所使用的词汇“或”和“和”指词汇“和/或”,且可与其互换使用,除非上下文明确指示不是如此。本发明实施例所使用的词汇“诸如”指词组“诸如但不限于”,且可与其互换使用。
本发明实施例中的步骤流程图以及以上方法描述仅作为例示性的例子,并且不意图要求或暗示必须按照给出的顺序进行各个实施例的步骤。如本领域技术人员将认识到的,可以按任意顺序进行以上实施例中的步骤的顺序。诸如“其后”、“然后”、“接下来”等等的词语不意图限制步骤的顺序;这些词语仅用于引导读者通读这些方法的描述。此外,例如使用冠词“一个”、“一”或者“该”对于单数的要素的任何引用不被解释为将该要素限制为单数。
另外,本发明各个实施例中的步骤和装置并非仅限定于某个实施例中实行,事实上,可以根据本发明的概念来结合本文中的各个实施例中相关的部分步骤和部分装置,以构思新的实施例,而这些新的实施例也包括在本发明的范围内。
本发明实施例中的各个操作可以通过能够进行相应的功能的任何适当的手段而进行。该手段可以包括各种硬件和/或软件组件和/或模块,包括但不限于硬件的电路或处理器。
本发明实施例的方法包括用于实现上述的方法的一个或多个动作。方法和/或动作可以彼此互换而不脱离权利要求的范围。换句话说,除非指定了动作的具体顺序,否则可以修改具体动作的顺序和/或使用而不脱离权利要求的范围。
本领域技术人员可以不脱离由所附权利要求定义的教导的技术而进行对在此所述的技术的各种改变、替换和更改。此外,本公开的权利要求的范围不限于以上所述的处理、机器、制造、事件的组成、手段、方法和动作的具体方面。可以利用与在此所述的相应方面进行基本相同的功能或者实现基本相同的结果的当前存在的或者稍后要开发的处理、机器、制造、事件的组成、手段、方法或动作。因而,所附权利要求包括在其范围内的这样的处理、机器、制造、事件的组成、手段、方法或动作。
提供所公开的方面的以上描述以使本领域的任何技术人员能够做出或者使用本发明。对这些方面的各种修改对于本领域技术人员而言是非常显而易见的,并且在此定义的一般原理可以应用于其他方面而不脱离本发明的范围。因此,本发明不意图被限制到在此示出的方面,而是按照与在此公开的原理和新颖的特征一致的最宽范围。
为了例示和描述的目的已经给出了以上描述。此外,此描述不意图将本发明的实施例限制到在此公开的形式。尽管以上已经讨论了多个示例方面和实施例,但是本领域技术人员将认识到其某些变型、修改、改变、添加和子组合。且本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

Claims (10)

1.一种SO中类成员函数保护方法,其特征在于,该方法包括以下步骤:
根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
2.如权利要求1所述的SO中类成员函数保护方法,其特征在于,对SO文件的虚成员函数、加载初始化进行设置,具体包括以下操作:
对SO文件的虚成员函数进行设置,使其没有调用其他全局变量或者全局函数;
对SO文件的加载初始化进行设置,使得该SO文件在调用系统初始化函数进行加载初始化时,不进行类的创建操作以及调用其被拆分的类的成员函数;并将具有依赖关系的所有SO文件同时进行加载。
3.如权利要求2所述的SO中类成员函数保护方法,其特征在于,所述预设的数据结构包括以下成员变量:虚成员函数被拆分的SO文件名、虚成员函数被拆分的类名、被拆分的虚成员函数的偏移地址、被拆分的虚成员函数的大小、目标SO文件名、目标SO文件中存储被拆分的虚成员函数的偏移地址。
4.如权利要求3所述的SO中类成员函数保护方法,其特征在于,该方法还包括:在每个目标SO文件中增设一个代码段,所述代码段用于存储被拆分的虚成员函数的代码。
5.如权利要求4所述的SO中类成员函数保护方法,其特征在于,对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中,具体包括以下操作:
将原SO文件中需要进行拆分的虚成员函数的代码拷贝到目标SO文件中增设的代码段中;
清理原SO文件中需要进行拆分的虚成员函数的代码;
根据虚成员函数的代码拷贝到目标SO文件中增设的代码段中的位置,赋值对应的数据结构中所述目标SO文件中存储被拆分的虚成员函数的偏移地址。
6.如权利要求5所述的SO中类成员函数保护方法,其特征在于,将原SO文件中需要进行拆分的虚成员函数的代码拷贝到目标SO文件中增设的代码段中,具体包括以下操作:
根据所述拆分映射关系,在对应的数据结构中获取到原SO文件名、目标SO文件名、被拆分的虚成员函数的偏移地址以及被拆分的虚成员函数的大小;
读取原SO文件和目标SO文件到内存中;
根据被拆分的虚成员函数的偏移地找到该虚成员函数的代码;
从目标SO文件中增设的代码段中申请一段内存空间,其大小为被拆分的虚成员函数的大小;
将找到的虚成员函数的代码拷贝到所述申请的一段内存空间中。
7.如权利要求1所述的SO中类成员函数保护方法,其特征在于,对已执行拆分操作的SO文件的类的创建代码进行Hook修改,具体包括以下操作:
对已执行拆分操作的SO文件的类的创建代码进行查找;
对每个创建代码的位置进行Hook;
修改虚表中的虚成员函数的地址为目标SO文件中拷贝该虚成员函数代码的内存地址。
8.一种存储介质,其上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现权利要求1至7任一项所述的方法。
9.一种电子设备,包括Linux操作系统、存储器和处理器,存储器上存储有在所述处理器上运行的计算机程序,其特征在于:所述处理器执行所述计算机程序时实现权利要求1至7任一项所述的方法。
10.一种SO中类成员函数保护系统,其特征在于,包括:
设置模块,其用于根据各SO文件中虚成员函数的拆分需求,设置SO文件间的依赖关系;并对SO文件的虚成员函数、加载初始化进行设置;
记录模块,其用于通过预设的数据结构记录SO文件中虚成员函数的拆分映射关系;
拆分模块,其用于对需要进行拆分的SO文件中的虚成员函数执行拆分操作,使得类的虚成员函数按照所述拆分映射关系被拆分到不同的目标SO文件中;
Hook模块,其用于对已执行拆分操作的SO文件的类的创建代码进行Hook修改,使得对应的类在创建后,当其调用其虚成员函数时能够调用到对应目标SO文件中的相应虚成员函数代码。
CN202111535328.XA 2021-12-15 2021-12-15 So中类成员函数保护方法、存储介质、电子设备及系统 Pending CN114238871A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111535328.XA CN114238871A (zh) 2021-12-15 2021-12-15 So中类成员函数保护方法、存储介质、电子设备及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111535328.XA CN114238871A (zh) 2021-12-15 2021-12-15 So中类成员函数保护方法、存储介质、电子设备及系统

Publications (1)

Publication Number Publication Date
CN114238871A true CN114238871A (zh) 2022-03-25

Family

ID=80756417

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111535328.XA Pending CN114238871A (zh) 2021-12-15 2021-12-15 So中类成员函数保护方法、存储介质、电子设备及系统

Country Status (1)

Country Link
CN (1) CN114238871A (zh)

Similar Documents

Publication Publication Date Title
JP7231681B2 (ja) パッケージファイルに対する機能拡張方法およびシステム
KR20150024842A (ko) 적응식 이식가능 라이브러리
CN108614702B (zh) 字节码优化方法及装置
CN109408393B (zh) 应用测试方法、装置及设备和计算机可读存储介质
TW201820131A (zh) 進程管理方法及裝置
CN113961919B (zh) 恶意软件检测方法和装置
CN115378735B (zh) 一种数据处理方法、装置、存储介质及电子设备
CN110609687A (zh) 一种编译方法、装置、电子设备和存储介质
CN112667246A (zh) 应用功能扩展的方法、装置及电子设备
US10275595B2 (en) System and method for characterizing malware
US8769498B2 (en) Warning of register and storage area assignment errors
CN103514004A (zh) Windows系统下的系统环境管理方法及装置
US11500982B2 (en) Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses
CN113835748B (zh) 基于html5的应用程序的打包方法、系统和可读介质
CN114238871A (zh) So中类成员函数保护方法、存储介质、电子设备及系统
US11675593B2 (en) Dynamically updating a dynamic library
US11921874B2 (en) Method and system for protecting file using class distribution and sequential memory loading
CN115760391A (zh) 区块链中智能合约更改方法、装置、电子设备及存储介质
US10375206B1 (en) Entity-component architecture with components having multiple configurations
US9697018B2 (en) Synthesizing inputs to preserve functionality
CN111382076B (zh) 应用程序的测试方法、装置、电子设备及计算机存储介质
US11520866B2 (en) Controlling processor instruction execution
CN110083469B (zh) 一种异构硬件组织运行统一内核方法及系统
CN106897588B (zh) 一种标签函数的处理方法及装置
US10671397B2 (en) Reduced save and restore instructions for call-clobbered registers

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