CN108595218A - 一种加载系统动态库的方法和装置 - Google Patents
一种加载系统动态库的方法和装置 Download PDFInfo
- Publication number
- CN108595218A CN108595218A CN201810344656.3A CN201810344656A CN108595218A CN 108595218 A CN108595218 A CN 108595218A CN 201810344656 A CN201810344656 A CN 201810344656A CN 108595218 A CN108595218 A CN 108595218A
- Authority
- CN
- China
- Prior art keywords
- dlopen
- functions
- address
- ext
- target process
- 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
- 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/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Abstract
本发明公开了一种加载系统动态库的方法和装置,属于计算机技术领域。所述方法包括:目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定所述dlopen函数的预定调用者的第二逻辑地址;所述目标进程将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用所述dlopen_ext函数;所述目标进程通过所述dlopen_ext函数加载所述目标系统动态库。采用本发明,可以绕开dlopen函数的调用权限检测,实现对系统动态库的加载处理。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种加载系统动态库的方法和装置。
背景技术
函数劫持是指在不改变函数原有功能的前提下在函数中添加新功能,这样,当函数运行的时候,可以同时实现原有功能和添加的新功能。在许多游戏加速或者流量引导的应用场景中,通常需要采用ELF Hook来劫持网络API函数。
为了能够劫持所有未加载的动态库中的网络API函数,应用进程可以加载用于劫持网络API函数的动态库A,然后基于动态库A的执行逻辑先劫持dlopen函数,将其替换成new_dlopen函数。之后,当调用dlopen函数加载动态库B时,应用进程可以先调用new_dlopen函数,再通过new_dlopen函数调用dlopen函数来加载动态库B,然后可以对加载完成后的动态库B进行ELF Hook处理,即劫持其中的网络API函数。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:
在Android 7.0版本之后的操作系统中,dlopen函数增加了调用权限限制,即在调用dlopen函数加载系统动态库时,dlopen函数会检查调用者是否是具备dlopen函数调用权限的预定调用者,如果不是,则告知调用者加载失败,而new_dlopen函数代码位于用户自己加载的动态库(动态库A)中,dlopen函数所检测到的调用者可能不是预定调用者,并不具备加载系统动态库的权限,因此无法调用dlopen函数加载系统动态库。
发明内容
为了解决现有技术的问题,本发明实施例提供了一种加载系统动态库的方法和装置。所述技术方案如下:
第一方面,提供了一种加载系统动态库的方法,所述方法包括:
目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定所述dlopen函数的预定调用者的第二逻辑地址;
所述目标进程将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用所述dlopen_ext函数;
所述目标进程通过所述dlopen_ext函数加载所述目标系统动态库。
可选的,所述确定内存中dlopen_ext函数的第一逻辑地址,包括:
目标进程根据其对应的资源映射文件,确定加载器文件的加载基地址;
所述目标进程解析所述加载器文件,获取dlopen_ext函数的地址偏移量;
所述目标进程根据所述加载基地址和所述地址偏移量,确定内存中所述dlopen_ext函数的第一逻辑地址。
可选的,所述目标进程解析所述加载器文件,获取dlopen_ext函数的地址偏移量,包括:
目标进程根据加载器文件的ELF头部数据获取节头表;
所述目标进程根据所述节头表查找并读取字符串表和静态符号表;
所述目标进程在所述字符串表中查找dlopen_ext对应的目标符号索引;
所述目标进程将所述静态符号表中所述目标符号索引对应的符号地址作为dlopen_ext函数的地址偏移量。
可选的,所述确定所述dlopen函数的预定调用者的第二逻辑地址,包括:
目标进程扫描其对应的资源映射文件,在系统动态库目录下随机选择一个动态库的内存加载地址作为所述第二逻辑地址。
可选的,所述确定所述dlopen函数的预定调用者的第二逻辑地址,包括:
当需要调用dlopen函数时,目标进程通过_builtin_return_address编译器内建指令读取dlopen函数的实际调用者地址作为所述第二逻辑地址。
可选的,所述目标进程将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用dlopen_ext函数,包括:
目标进程获取所述dlopen函数的初始调用参数,将所述初始调用参数和所述第二逻辑地址作为调用参数;
所述目标进程访问所述第一逻辑地址,通过所述调用参数调用dlopen_ext函数。
可选的,所述目标进程劫持dlopen函数,包括:
目标进程扫描其对应的资源映射文件,使用new_dlopen函数替换所述资源映射文件中所有动态库的重定位表所链接的dlopen函数。
第二方面,提供了一种加载系统动态库的装置,所述装置包括:
确定模块,用于劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定所述dlopen函数的预定调用者的第二逻辑地址;
调用模块,用于将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用所述dlopen_ext函数;
加载模块,用于通过所述dlopen_ext函数加载所述目标系统动态库。
可选的,所述确定模块,具体用于:
根据其对应的资源映射文件,确定加载器文件的加载基地址;
解析所述加载器文件,获取dlopen_ext函数的地址偏移量;
根据所述加载基地址和所述地址偏移量,确定内存中所述dlopen_ext函数的第一逻辑地址。
可选的,所述确定模块,具体用于:
根据加载器文件的ELF头部数据获取节头表;
根据所述节头表查找并读取字符串表和静态符号表;
在所述字符串表中查找dlopen_ext对应的目标符号索引;
将所述静态符号表中所述目标符号索引对应的符号地址作为dlopen_ext函数的地址偏移量。
可选的,所述确定模块,具体用于:
扫描其对应的资源映射文件,在系统动态库目录下随机选择一个动态库的内存加载地址作为所述第二逻辑地址。
可选的,所述确定模块,具体用于:
当需要调用dlopen函数时,通过_builtin_return_address编译器内建指令读取dlopen函数的实际调用者地址作为所述第二逻辑地址。
可选的,所述调用模块,具体用于:
获取所述dlopen函数的初始调用参数,将所述初始调用参数和所述第二逻辑地址作为调用参数;
访问所述第一逻辑地址,通过所述调用参数调用dlopen_ext函数。
可选的,所述确定模块,具体用于:
扫描其对应的资源映射文件,使用new_dlopen函数替换所述资源映射文件中所有动态库的重定位表所链接的dlopen函数。
第三方面,提供了一种终端,所述终端包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如第一方面所述的加载系统动态库的方法。
第四方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如第一方面所述的加载系统动态库的方法。
本发明实施例提供的技术方案带来的有益效果是:
本发明实施例中,目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定dlopen函数的预定调用者的第二逻辑地址;目标进程将第二逻辑地址作为调用参数,根据第一逻辑地址调用dlopen_ext函数;目标进程通过dlopen_ext函数加载目标系统动态库。这样,在调用dlopen函数加载系统动态库时,可以向dlopen_ext函数提供预定调用者的逻辑地址,然后直接调用dlopen_ext函数来加载系统动态库,从而可以避免无法通过dlopen函数的调用权限检测,实现对系统动态库的加载处理。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种加载系统动态库的方法流程图;
图2是本发明实施例提供的一种加载系统动态库的装置结构示意图;
图3是本发明实施例提供的一种终端的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
本发明实施例提供了一种加载系统动态库的方法,该方法的执行主体为终端。其中,终端可以是安装有Android操作系统的任意终端,可以是手机或者平板等。终端上可以具备运行应用进程的功能,应用进程可以加载终端中已存储的动态库,并可以调用动态库中的函数。
本实施例中,动态库可以分为系统动态库和非系统动态库,其中,系统动态库属于操作系统或者编译器提供的,非系统动态库则属于应用程序提供的。
终端中可以包括处理器、存储器、收发器,处理器可以用于进行下述流程中的加载系统动态库的处理,存储器可以用于存储下述处理过程中需要的数据以及产生的数据,收发器可以用于接收和发送下述处理过程中的相关数据。本实施例中,以终端为手机,应用进程为游戏进程,实施场景为游戏加速场景进行说明,其它情况与之类似,本实施不再进行一一说明。下面将结合具体实施方式,对图1所示的处理流程进行详细的说明,内容可以如下:
步骤101,目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定dlopen函数的预定调用者的第二逻辑地址。
在实施中,用户可以在终端上安装有游戏应用,当用户点击打开该游戏应用时,终端可以运行该游戏应用的应用进程(即下述目标进程)。同时,终端上可以预先存储有用于进行游戏加速的动态库A,该动态库A可以属于游戏内置动态库,也可以是第三方应用提供的动态库。在目标进程运行过程中,用户如果想要进行游戏加速,则可以通过相关操作(如点击游戏加速按键、开启第三方应用等)触发目标进程加载上述用于游戏加速的动态库A。之后,目标进程可以按照该动态库A的执行逻辑进行加载系统动态库的处理,从而实现游戏加速。
具体的,目标进程可以先劫持用于加载系统动态库的dlopen函数,将其替换成new_dlopen函数,此处,new_dlopen函数为技术人员开发的,预先写入动态库A内的函数。
目标进程还可以确定内存中dlopen_ext函数的第一逻辑地址,以及dlopen函数的预定调用者的第二逻辑地址。需要说明的是,dlopen_ext函数是实现系统动态库加载的功能函数,dlopen函数通过调用dlopen_ext函数来实现动态库的加载,而在调用dlopen_ext函数之前会对调用者的权限进行检查。
一种可行的实施例下,可以采用基地址+偏移量,来确定dlopen_ext函数的逻辑地址,相应的,步骤101的部分处理可以如下:目标进程根据其对应的资源映射文件,确定加载器文件的加载基地址;目标进程解析加载器文件,获取dlopen_ext函数的地址偏移量;目标进程根据加载基地址和地址偏移量,确定内存中dlopen_ext函数的第一逻辑地址。
在实施中,目标进程可以先扫描其对应的资源映射文件(即/proc/PID/maps文件,其中,“PID”表示目标进程的id值),确定出其中加载器文件(即/system/bin/linker文件)在内存中的加载基地址。之后,目标进程可以解析加载器文件,获取dlopen_ext函数的地址偏移量。进而,目标进程可以将/system/bin/linker文件的加载基地址与dlopen_ext函数的地址偏移量相加,得到dlopen_ext函数在内存中的实际地址(即第一逻辑地址)。
一种可行的实施例下,可以通过字符串表和静态符号表,确定dlopen_ext函数的地址偏移量,相应的处理可以如下:目标进程根据加载器文件的ELF头部数据获取节头表;目标进程根据节头表查找并读取字符串表和静态符号表;目标进程在字符串表中查找dlopen_ext对应的目标符号索引;目标进程将静态符号表中目标符号索引对应的符号地址作为dlopen_ext函数的地址偏移量。
在实施中,目标进程在解析/system/bin/linker文件时,可以读取其中位于文件最前端的ELF头部(即ELF header)数据,然后在ELF header中查找e_shoff字段和e_shnum字段,e_shoff字段记录了节头表(即Section header table)在/system/bin/linker文件中的偏移量,e_shnum字段记录了Section header table中包含的section header个数,从而可以基于e_shoff字段和e_shnum字段获取节头表。进一步的,目标进程可以将节头表中的全部section headers内容读到内存中,并枚举所有的section headers,查找字符串表(.strtab)和静态符号表(.symtab)在/system/bin/linker文件中的位置和大小,进而可以将字符串表和静态符号表读取至内存当中。之后,目标进程可以字符串表中查找“dlopen_ext”这一字符串,确定该字符串对应的目标符号索引,然后可以在静态符号表中查找目标符号索引对应的符号地址,将该符号地址作为dlopen_ext函数的地址偏移量。
目标进程确定第二逻辑地址的方式多种多样,如下给出了两种可行的方式:
方式一,目标进程扫描其对应的资源映射文件,在系统动态库目录下随机选择一个动态库的内存加载地址作为第二逻辑地址。
在实施中,目标进程可以扫描其对应的/proc/PID/maps文件,然后在系统动态库目录(包括/system/lib目录或者/vendor/lib目录)下随机选择一个动态库的内存加载地址作为第二逻辑地址。此处,/system/lib目录或者/vendor/lib目录下的动态库为操作系统提供的,本身具备dlopen函数的调用权限。
方式二,当需要调用dlopen函数时,目标进程通过_builtin_return_address编译器内建指令读取dlopen函数的实际调用者地址作为第二逻辑地址。
在实施中,当需要调用dlopen函数时,目标进程可以先在new_dlopen函数中调用_builtin_return_address编译器,然后通过其内建指令读取dlopen函数的实际调用者地址,从而可以将实际调用者地址作为第二逻辑地址。
一种可行的实施例下,可以通过修改重定位表来实现函数劫持处理,相应的,步骤101的部分处理可以如下:目标进程扫描其对应的资源映射文件,使用new_dlopen函数替换资源映射文件中所有动态库的重定位表所链接的dlopen函数。
在实施中,目标进程如果需要劫持全部动态库中的某个函数,则可以先扫描其对应的/proc/PID/maps文件,然后对/proc/PID/maps文件中的所有动态库和可执行文件,使用new_dlopen函数替换其重定位表所链接的dlopen函数。
步骤102,目标进程将第二逻辑地址作为调用参数,根据第一逻辑地址调用dlopen_ext函数。
在实施中,目标进程在确定了dlopen_ext函数的第一逻辑地址和其预定调用者的第二逻辑地址之后,在目标进程需要调用dlopen函数加载某个系统动态库(如目标系统动态库)时,目标进程可以通过new_dlopen函数获取到目标系统动态库的加载请求,进而可以将第二逻辑地址作为调用参数,然后根据第一逻辑地址查找并直接调用dlopen_ext函数。
一种可行的实施例下,步骤102的处理可以具体如下:目标进程获取dlopen函数的初始调用参数,将初始调用参数和第二逻辑地址作为调用参数;目标进程访问第一逻辑地址,通过调用参数调用dlopen_ext函数。
在实施中,当需要调用dlopen函数时,目标进程可以获取dlopen函数的初始调用参数,初始调用参数可以包括系统动态库的路径和动态库加载模式,并将初始调用参数和步骤101中确定的第二逻辑地址作为dlopen_ext函数的调用参数,之后目标进程可以访问第一逻辑地址,然后通过上述调用参数调用dlopen_ext函数。
需要说明的是,在调用dlopen函数的正常流程中,只需要向dlopen函数提供系统动态库的路径和动态库加载模式这两个初始调用参数,dlopen函数会主动去检测调用者的逻辑地址并进行权限检查,若调用者拥有相应调用权限,则将检测到的逻辑地址及两个初始调用参数提供给dlopen_ext函数,并通过dlopen_ext函数实现动态库的加载,否则告知调用者加载失败。故而本实施例中,在直接调用dlopen_ext函数时,需要主动提供调用者的逻辑地址。
步骤103,目标进程通过dlopen_ext函数加载目标系统动态库。
在实施中,目标进程在调用了dlopen_ext函数之后,可以通过dlopen_ext函数加载目标系统动态库。进一步的,目标进程可以对目标系统动态库中的目标函数(即需要劫持的函数)进行劫持处理。值得一提的是,对于在加载动态库A之前就已加载的动态库,目标进程可以直接对这些动态库中需要劫持的函数进行劫持。此处,劫持目标函数的处理可以通过使用新函数来替换资源映射文件中所有动态库的重定位表所链接的目标函数来实现。
本实施例中描述的步骤均以android arm32的处理环境为例,在arm64的处理环境下依然有效;在arm64的处理环境下,/system/lib、/vendor/lib、/system/bin/linker等文件可以分别替换为/system/lib64、/vendor/lib64、/system/bin/linker64,其他处理保持不变。
本发明实施例中,目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定dlopen函数的预定调用者的第二逻辑地址;目标进程将第二逻辑地址作为调用参数,根据第一逻辑地址调用dlopen_ext函数;目标进程通过dlopen_ext函数加载目标系统动态库。这样,在调用dlopen函数加载系统动态库时,可以向dlopen_ext函数提供预定调用者的逻辑地址,然后直接调用dlopen_ext函数来加载系统动态库,从而可以避免无法通过dlopen函数的调用权限检测,实现对系统动态库的加载处理。
基于相同的技术构思,本发明实施例还提供了一种加载系统动态库的装置,如图2所示,所述装置包括:
确定模块201,用于劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定所述dlopen函数的预定调用者的第二逻辑地址;
调用模块202,用于将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用所述dlopen_ext函数;
加载模块203,用于通过所述dlopen_ext函数加载所述目标系统动态库。
可选的,所述确定模块201,具体用于:
根据其对应的资源映射文件,确定加载器文件的加载基地址;
解析所述加载器文件,获取dlopen_ext函数的地址偏移量;
根据所述加载基地址和所述地址偏移量,确定内存中所述dlopen_ext函数的第一逻辑地址。
可选的,所述确定模块201,具体用于:
根据加载器文件的ELF头部数据获取节头表;
根据所述节头表查找并读取字符串表和静态符号表;
在所述字符串表中查找dlopen_ext对应的目标符号索引;
将所述静态符号表中所述目标符号索引对应的符号地址作为dlopen_ext函数的地址偏移量。
可选的,所述确定模块201,具体用于:
扫描其对应的资源映射文件,在系统动态库目录下随机选择一个动态库的内存加载地址作为所述第二逻辑地址。
可选的,所述确定模块201,具体用于:
当需要调用dlopen函数时,通过_builtin_return_address编译器内建指令读取dlopen函数的实际调用者地址作为所述第二逻辑地址。
可选的,所述调用模块202,具体用于:
获取所述dlopen函数的初始调用参数,将所述初始调用参数和所述第二逻辑地址作为调用参数;
访问所述第一逻辑地址,通过所述调用参数调用dlopen_ext函数。
可选的,所述确定模块201,具体用于:
扫描其对应的资源映射文件,使用new_dlopen函数替换所述资源映射文件中所有动态库的重定位表所链接的dlopen函数。
本发明实施例中,目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定dlopen函数的预定调用者的第二逻辑地址;目标进程将第二逻辑地址作为调用参数,根据第一逻辑地址调用dlopen_ext函数;目标进程通过dlopen_ext函数加载目标系统动态库。这样,在调用dlopen函数加载系统动态库时,可以向dlopen_ext函数提供预定调用者的逻辑地址,然后直接调用dlopen_ext函数来加载系统动态库,从而可以避免无法通过dlopen函数的调用权限检测,实现对系统动态库的加载处理。
需要说明的是:上述实施例提供的加载系统动态库的装置在加载系统动态库时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的加载系统动态库的装置与加载系统动态库的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图3是根据一示例性实施例示出的一种终端的结构示意图。该终端可以用于实施上述实施例中提供的加载系统动态库的方法。
终端300可以包括有一个或一个以上计算机可读存储介质的存储器120、输入单元130、显示单元140、传感器150、音频电路160、WiFi(wireless fidelity,无线保真)模块170、包括有一个或者一个以上处理核心的处理器180、以及电源190等部件。本领域技术人员可以理解,图3中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
存储器120可用于存储软件程序以及模块,处理器180通过运行存储在存储器120的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器120可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端300的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器120可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器120还可以包括存储器控制器,以提供处理器180和输入单元130对存储器120的访问。
输入单元130可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,输入单元130可包括触敏表面131以及其他输入设备132。触敏表面131,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面131上或在触敏表面131附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面131可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器180,并能接收处理器180发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面131。除了触敏表面131,输入单元130还可以包括其他输入设备132。具体地,其他输入设备132可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元140可用于显示由用户输入的信息或提供给用户的信息以及终端300的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元140可包括显示面板141,可选的,可以采用LCD(Liquid Crystal Display,液晶显示器)、OLED(Organic Light-Emitting Diode,有机发光二极管)等形式来配置显示面板141。进一步的,触敏表面131可覆盖显示面板141,当触敏表面131检测到在其上或附近的触摸操作后,传送给处理器180以确定触摸事件的类型,随后处理器180根据触摸事件的类型在显示面板141上提供相应的视觉输出。虽然在图3中,触敏表面131与显示面板141是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面131与显示面板141集成而实现输入和输出功能。
终端300还可包括至少一种传感器150,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板141的亮度,接近传感器可在终端300移动到耳边时,关闭显示面板141和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端300还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路160、扬声器161,传声器162可提供用户与终端300之间的音频接口。音频电路160可将接收到的音频数据转换后的电信号,传输到扬声器161,由扬声器161转换为声音信号输出;另一方面,传声器162将收集的声音信号转换为电信号,由音频电路160接收后转换为音频数据,再将音频数据输出处理器180处理后,经RF电路110以发送给比如另一终端,或者将音频数据输出至存储器120以便进一步处理。音频电路160还可能包括耳塞插孔,以提供外设耳机与终端300的通信。
WiFi属于短距离无线传输技术,终端300通过WiFi模块170可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图3示出了WiFi模块170,但是可以理解的是,其并不属于终端300的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器180是终端300的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器120内的软件程序和/或模块,以及调用存储在存储器120内的数据,执行终端300的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器180可包括一个或多个处理核心;优选的,处理器180可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器180中。
终端300还包括给各个部件供电的电源190(比如电池),优选的,电源可以通过电源管理系统与处理器180逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源190还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
具体在本实施例中,终端300的显示单元是触摸屏显示器,终端300还包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行述一个或者一个以上程序包含用于进行上述加载系统动态库的处理的指令。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (16)
1.一种加载系统动态库的方法,其特征在于,所述方法包括:
目标进程劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定所述dlopen函数的预定调用者的第二逻辑地址;
所述目标进程将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用所述dlopen_ext函数;
所述目标进程通过所述dlopen_ext函数加载所述目标系统动态库。
2.根据权利要求1所述的方法,其特征在于,所述确定内存中dlopen_ext函数的第一逻辑地址,包括:
目标进程根据其对应的资源映射文件,确定加载器文件的加载基地址;
所述目标进程解析所述加载器文件,获取dlopen_ext函数的地址偏移量;
所述目标进程根据所述加载基地址和所述地址偏移量,确定内存中所述dlopen_ext函数的第一逻辑地址。
3.根据权利要求2所述的方法,其特征在于,所述目标进程解析所述加载器文件,获取dlopen_ext函数的地址偏移量,包括:
目标进程根据加载器文件的ELF头部数据获取节头表;
所述目标进程根据所述节头表查找并读取字符串表和静态符号表;
所述目标进程在所述字符串表中查找dlopen_ext对应的目标符号索引;
所述目标进程将所述静态符号表中所述目标符号索引对应的符号地址作为dlopen_ext函数的地址偏移量。
4.根据权利要求1所述的方法,其特征在于,所述确定所述dlopen函数的预定调用者的第二逻辑地址,包括:
目标进程扫描其对应的资源映射文件,在系统动态库目录下随机选择一个动态库的内存加载地址作为所述第二逻辑地址。
5.根据权利要求1所述的方法,其特征在于,所述确定所述dlopen函数的预定调用者的第二逻辑地址,包括:
当需要调用dlopen函数时,目标进程通过_builtin_return_address编译器内建指令读取dlopen函数的实际调用者地址作为所述第二逻辑地址。
6.根据权利要求1所述的方法,其特征在于,所述目标进程将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用dlopen_ext函数,包括:
目标进程获取所述dlopen函数的初始调用参数,将所述初始调用参数和所述第二逻辑地址作为调用参数;
所述目标进程访问所述第一逻辑地址,通过所述调用参数调用dlopen_ext函数。
7.根据权利要求1所述的方法,其特征在于,所述目标进程劫持dlopen函数,包括:
目标进程扫描其对应的资源映射文件,使用new_dlopen函数替换所述资源映射文件中所有动态库的重定位表所链接的dlopen函数。
8.一种加载系统动态库的装置,其特征在于,所述装置包括:
确定模块,用于劫持dlopen函数,确定内存中dlopen_ext函数的第一逻辑地址,并确定所述dlopen函数的预定调用者的第二逻辑地址;
调用模块,用于将所述第二逻辑地址作为调用参数,根据所述第一逻辑地址调用所述dlopen_ext函数;
加载模块,用于通过所述dlopen_ext函数加载所述目标系统动态库。
9.根据权利要求8所述的装置,其特征在于,所述确定模块,具体用于:
根据其对应的资源映射文件,确定加载器文件的加载基地址;
解析所述加载器文件,获取dlopen_ext函数的地址偏移量;
根据所述加载基地址和所述地址偏移量,确定内存中所述dlopen_ext函数的第一逻辑地址。
10.根据权利要求9所述的装置,其特征在于,所述确定模块,具体用于:
根据加载器文件的ELF头部数据获取节头表;
根据所述节头表查找并读取字符串表和静态符号表;
在所述字符串表中查找dlopen_ext对应的目标符号索引;
将所述静态符号表中所述目标符号索引对应的符号地址作为dlopen_ext函数的地址偏移量。
11.根据权利要求8所述的装置,其特征在于,所述确定模块,具体用于:
扫描其对应的资源映射文件,在系统动态库目录下随机选择一个动态库的内存加载地址作为所述第二逻辑地址。
12.根据权利要求8所述的装置,其特征在于,所述确定模块,具体用于:
当需要调用dlopen函数时,通过_builtin_return_address编译器内建指令读取dlopen函数的实际调用者地址作为所述第二逻辑地址。
13.根据权利要求8所述的装置,其特征在于,所述调用模块,具体用于:
获取所述dlopen函数的初始调用参数,将所述初始调用参数和所述第二逻辑地址作为调用参数;
访问所述第一逻辑地址,通过所述调用参数调用dlopen_ext函数。
14.根据权利要求8所述的装置,其特征在于,所述确定模块,具体用于:
扫描其对应的资源映射文件,使用new_dlopen函数替换所述资源映射文件中所有动态库的重定位表所链接的dlopen函数。
15.一种终端,其特征在于,所述终端包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如权利要求1至7任一所述的加载系统动态库的方法。
16.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1至7任一所述的加载系统动态库的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810344656.3A CN108595218B (zh) | 2018-04-17 | 2018-04-17 | 一种加载系统动态库的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810344656.3A CN108595218B (zh) | 2018-04-17 | 2018-04-17 | 一种加载系统动态库的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108595218A true CN108595218A (zh) | 2018-09-28 |
CN108595218B CN108595218B (zh) | 2021-08-27 |
Family
ID=63611313
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810344656.3A Expired - Fee Related CN108595218B (zh) | 2018-04-17 | 2018-04-17 | 一种加载系统动态库的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108595218B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710671A (zh) * | 2018-12-14 | 2019-05-03 | 国云科技股份有限公司 | 实现数据库操作数据引流的方法及其数据库防火墙系统 |
CN110414217A (zh) * | 2019-07-31 | 2019-11-05 | 广东小天才科技有限公司 | 应用程序的安全运行方法、装置、电子设备和存储介质 |
CN110704302A (zh) * | 2019-09-02 | 2020-01-17 | 贝壳技术有限公司 | 映射关系建立方法、装置及系统崩溃分流的方法与装置 |
CN111010346A (zh) * | 2019-12-23 | 2020-04-14 | 深信服科技股份有限公司 | 基于动态路由的报文处理方法、设备、存储介质及装置 |
CN111209225A (zh) * | 2020-01-03 | 2020-05-29 | 北京字节跳动网络技术有限公司 | 获取实际地址的方法、装置、介质和电子设备 |
CN111309396A (zh) * | 2020-02-14 | 2020-06-19 | 北京字节跳动网络技术有限公司 | 一种系统库的访问方法、装置以及计算机可读存储介质 |
CN111782302A (zh) * | 2020-07-13 | 2020-10-16 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
CN112256339A (zh) * | 2019-07-22 | 2021-01-22 | 百度在线网络技术(北京)有限公司 | 多进程管理方法、装置、电子设备和存储介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101021804A (zh) * | 2007-03-13 | 2007-08-22 | 华为技术有限公司 | 调用动态库的方法、装置及动态库服务器 |
CN105630557A (zh) * | 2015-12-24 | 2016-06-01 | 迈普通信技术股份有限公司 | 热补丁方法和装置 |
CN105677550A (zh) * | 2015-12-29 | 2016-06-15 | 广州华多网络科技有限公司 | 一种基于Linux系统的性能采集分析的方法、装置及系统 |
CN106325927A (zh) * | 2016-08-19 | 2017-01-11 | 北京金山安全管理系统技术有限公司 | 一种应用于Linux系统中动态库API的拦截方法及装置 |
CN107295573A (zh) * | 2017-07-12 | 2017-10-24 | 网宿科技股份有限公司 | 一种业务应用流量的引导方法和系统 |
CN107343042A (zh) * | 2017-07-03 | 2017-11-10 | 网宿科技股份有限公司 | 浏览器流量劫持方法、装置及移动终端 |
CN107357553A (zh) * | 2017-07-11 | 2017-11-17 | 郑州云海信息技术有限公司 | 一种数据采集管理方法及装置 |
CN107493508A (zh) * | 2017-08-22 | 2017-12-19 | 四川长虹电器股份有限公司 | 基于Android智能终端流媒体播放性能监测的方法 |
-
2018
- 2018-04-17 CN CN201810344656.3A patent/CN108595218B/zh not_active Expired - Fee Related
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101021804A (zh) * | 2007-03-13 | 2007-08-22 | 华为技术有限公司 | 调用动态库的方法、装置及动态库服务器 |
CN105630557A (zh) * | 2015-12-24 | 2016-06-01 | 迈普通信技术股份有限公司 | 热补丁方法和装置 |
CN105677550A (zh) * | 2015-12-29 | 2016-06-15 | 广州华多网络科技有限公司 | 一种基于Linux系统的性能采集分析的方法、装置及系统 |
CN106325927A (zh) * | 2016-08-19 | 2017-01-11 | 北京金山安全管理系统技术有限公司 | 一种应用于Linux系统中动态库API的拦截方法及装置 |
CN107343042A (zh) * | 2017-07-03 | 2017-11-10 | 网宿科技股份有限公司 | 浏览器流量劫持方法、装置及移动终端 |
CN107357553A (zh) * | 2017-07-11 | 2017-11-17 | 郑州云海信息技术有限公司 | 一种数据采集管理方法及装置 |
CN107295573A (zh) * | 2017-07-12 | 2017-10-24 | 网宿科技股份有限公司 | 一种业务应用流量的引导方法和系统 |
CN107493508A (zh) * | 2017-08-22 | 2017-12-19 | 四川长虹电器股份有限公司 | 基于Android智能终端流媒体播放性能监测的方法 |
Non-Patent Citations (2)
Title |
---|
IBTRACE: "Android Native库的加载及动态链接的过程", 《脚本之家》 * |
邹翰: "基于嵌入式Linux的智能家居监控系统研究与实现", 《《中国优秀硕士学位论文全文数据库信息科技辑》》 * |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710671A (zh) * | 2018-12-14 | 2019-05-03 | 国云科技股份有限公司 | 实现数据库操作数据引流的方法及其数据库防火墙系统 |
CN112256339A (zh) * | 2019-07-22 | 2021-01-22 | 百度在线网络技术(北京)有限公司 | 多进程管理方法、装置、电子设备和存储介质 |
CN112256339B (zh) * | 2019-07-22 | 2023-11-03 | 百度在线网络技术(北京)有限公司 | 多进程管理方法、装置、电子设备和存储介质 |
CN110414217A (zh) * | 2019-07-31 | 2019-11-05 | 广东小天才科技有限公司 | 应用程序的安全运行方法、装置、电子设备和存储介质 |
CN110414217B (zh) * | 2019-07-31 | 2023-03-24 | 广东小天才科技有限公司 | 应用程序的安全运行方法、装置、电子设备和存储介质 |
CN110704302A (zh) * | 2019-09-02 | 2020-01-17 | 贝壳技术有限公司 | 映射关系建立方法、装置及系统崩溃分流的方法与装置 |
CN111010346B (zh) * | 2019-12-23 | 2021-10-19 | 深信服科技股份有限公司 | 基于动态路由的报文处理方法、设备、存储介质及装置 |
CN111010346A (zh) * | 2019-12-23 | 2020-04-14 | 深信服科技股份有限公司 | 基于动态路由的报文处理方法、设备、存储介质及装置 |
CN111209225B (zh) * | 2020-01-03 | 2022-04-22 | 北京字节跳动网络技术有限公司 | 获取实际地址的方法、装置、介质和电子设备 |
CN111209225A (zh) * | 2020-01-03 | 2020-05-29 | 北京字节跳动网络技术有限公司 | 获取实际地址的方法、装置、介质和电子设备 |
CN111309396A (zh) * | 2020-02-14 | 2020-06-19 | 北京字节跳动网络技术有限公司 | 一种系统库的访问方法、装置以及计算机可读存储介质 |
CN111309396B (zh) * | 2020-02-14 | 2023-08-15 | 北京字节跳动网络技术有限公司 | 一种系统库的访问方法、装置以及计算机可读存储介质 |
CN111782302A (zh) * | 2020-07-13 | 2020-10-16 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
CN111782302B (zh) * | 2020-07-13 | 2021-05-14 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN108595218B (zh) | 2021-08-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108595218A (zh) | 一种加载系统动态库的方法和装置 | |
US9584476B2 (en) | Safety protection method, firewall, terminal device and computer-readable storage medium | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN107329985B (zh) | 一种页面的收藏方法、装置和移动终端 | |
CN104102500B (zh) | 一种应用程序的进程启动方法及计算机系统 | |
CN107357725B (zh) | 应用测试方法及装置 | |
CN109558734A (zh) | 一种堆栈安全性的检测方法及装置、移动设备 | |
CN104965722B (zh) | 一种显示信息的方法及装置 | |
CN108920220B (zh) | 一种函数调用的方法、装置及终端 | |
CN106529312B (zh) | 一种移动终端的权限控制方法、装置及移动终端 | |
CN107622200A (zh) | 应用程序的安全性检测方法及装置 | |
US20150169874A1 (en) | Method, device, and system for identifying script virus | |
CN106529332B (zh) | 一种移动终端的权限控制方法、装置及移动终端 | |
CN106708554A (zh) | 程序运行方法及装置 | |
CN108897533A (zh) | 一种函数调用的方法、装置及终端 | |
CN107219951A (zh) | 触控屏控制方法、装置、存储介质及终端设备 | |
CN108270757A (zh) | 一种用户账户切换方法、装置、客户端以及系统 | |
CN110046497A (zh) | 一种函数挂钩实现方法、装置和存储介质 | |
CN111966491A (zh) | 统计占用内存的方法及终端设备 | |
CN106708555B (zh) | 一种加载插件的方法和装置 | |
TW201443683A (zh) | 一種巨集病毒查殺的方法和裝置 | |
CN106681884B (zh) | 一种系统调用的监控方法和装置 | |
CN109344035A (zh) | 一种应用程序的运行控制方法、装置、设备及存储介质 | |
CN108984265A (zh) | 检测虚拟机环境的方法及装置 | |
CN110032394B (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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20210827 |
|
CF01 | Termination of patent right due to non-payment of annual fee |