CN108415739A - 一种动态链接库函数的钩挂方法、装置和存储介质 - Google Patents
一种动态链接库函数的钩挂方法、装置和存储介质 Download PDFInfo
- Publication number
- CN108415739A CN108415739A CN201810167443.8A CN201810167443A CN108415739A CN 108415739 A CN108415739 A CN 108415739A CN 201810167443 A CN201810167443 A CN 201810167443A CN 108415739 A CN108415739 A CN 108415739A
- Authority
- CN
- China
- Prior art keywords
- function
- address
- memory
- segment
- section
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种动态链接库函数钩挂方法、装置和存储介质,用以实现对native层任意动态链接库函数进行钩挂。所述动态链接库函数钩挂方法,包括:在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;根据跳转地址执行所述自定义函数得到自定义函数的执行结果;并在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
Description
技术领域
本发明涉及计算机程序开发技术领域,尤其涉及一种动态链接库函数的钩挂方法、装置和存储介质。
背景技术
本部分旨在为权利要求书中陈述的本发明的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑。Android的系统架构采用了分层的架构,共分为四层,从高到低分别是Android应用层,Android应用框架层,Android系统运行层(native层)和Linux内核层。Android平台将native层代码打包成so(动态链接库)的格式提供给外部或者内部使用。
现有技术中通过so函数的GOT(全局偏移表)可以对外部函数进行hook(劫持),通过修改外部函数的地址完成hook操作,但是,该方法对于函数的内部函数无法进行hook。
发明内容
本发明实施例提供一种动态链接库函数的钩挂方法、装置和存储介质,用以实现对native层任意so函数的hook。
第一方面,提供一种动态连接库函数的钩挂方法,包括:
在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;
根据跳转地址执行所述自定义函数得到自定义函数的执行结果;并
在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
第二方面,提供一种动态链接库的钩挂装置,包括:
第一确定单元,用于在在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;
执行单元,用于根据跳转地址执行所述自定义函数得到自定义函数的执行结果;
返回单元,用于在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
第三方面,提供一种终端设备,包括至少一个处理器、以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述任一动态链接库的钩挂方法所述的步骤。
第四方面,提供一种计算机可读介质,其存储有可由终端设备执行的计算机程序,当所述程序在终端设备上运行时,使得所述终端设备执行上述动态链接库的钩挂方法所述的步骤。
本发明实施例提供的动态链接库的钩挂方法、装置和存储介质,通过将目标函数在可执行与可连接格式文件中的地址偏移信息修改为根据自定义函数的存储地址确定出的地址偏移信息,这样,当系统调用目标函数时,根据修改后的地址偏移信息确定出的跳转地址可以跳转执行自定义函数实现自定义函数功能,同时在自定义函数中调用目标函数以返回目标函数的执行结果,以保证应用程序的正常运行,由此实现了对目标函数的钩挂。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为根据本发明的hook原理机制示意图;
图2为根据本发明实施方式的终端设备结构示意图;
图3a为根据本发明实施方式的动态链接库函数钩挂方法的实施流程示意图;
图3b为根据本发明实施方式的从ELF文件中获得目标函数在内存中存储的段基址的实施流程示意图;
图4为根据本发明实施方式的查找目标函数的地址偏移信息的流程示意图;
图5为根据本发明实施方式的动态链接库函数钩挂装置的结构示意图。
具体实施方式
为了实现对native层任意动态链接库函数的钩挂,本发明实施例提供了一种动态链接库函数的钩挂方法、装置和存储介质。
以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明,并且在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
首先,对本发明实施例中涉及的部分用语进行说明,以便于本领域技术人员理解。
函数的hook(钩挂)是指当目标进程执行到某个函数(当需要hook这个函数的时候称这个函数为待hook函数)的时候,通过修改该函数头部的几条指令,让它跳转到自定义的一个函数(一般称之为自定义的hook函数)中去的过程,称之为函数的hook,有时被hook函数逻辑比较复杂的情况下需要在自定义hook函数中实现原函数的功能,这个时候hook框架会提供一个函数指针,调用该函数指针可以完成被hook函数原有功能,在本发明实施例中提到的这类可以实现原函数功能的函数以Old_开头命名。
如图1所示,为hook的一种原理机制,通用的hook框架会提供一个接口,用以告诉hook框架需要将哪个函数(图1的Function)hook到哪个自定义的函数(图1的My_Function)中去,并且还会提供一个用以实现待hook函数功能的函数(图1中的Old_Function)。现有的解决方案就是利用这套hook框架,将自定义的函数写入到一个动态链接库中,然后加载动态链接库到目标进程中执行hook框架,从而将Function函数hook到My_Function中,当目标进程执行到Function的时候会自动走到My_Function中,而在My_Function就可以编写自定义的代码来代替Function的逻辑,从而达到修改目标进程逻辑的目的。
动态链接库是指一种不可执行的二进制程序,其需要被可执行程序加载后才可以执行其所包含的代码,在Windows系统中,动态数据库的扩展名一般为.dll,在Android系统中,动态链接库的扩展名一般为.so,在需要运行时,可通过加载到可执行程序中运行,例如加载到上述目标进程中运行。本发明实施例中是将编写好的自定义hook函数的代码编译为动态链接库,也可将动态链接库成为hook程序,该hook程序注入到目标进程中后,会以hook服务的方式运行,实现监听外部数据的变化,以及对目标进程中的待hook函数进行相应的hook操作。
ELF(可链接与可执行格式,Executable and Linkable Format)文件,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
GOT:全局偏移表;
Elf32_Ehdr:ELF头部表结构体;
e_phoff:程序头部表的偏移量;
e_phnum:程序头部表的大小;
sizeof:计算结构体长度;
BaseAddr:基地址;
Elf32_Phdr:程序头部表结构体;
p_type:段类型;
p_vaddr:段起始地址;
p_memsz:段在内存中的大小;
SegmentAddr:段基地址;
PT_LOAD:可加载的段;
PT_LOAD_SIZE:可加载的段大小;
PT_DYNAMIC:动态链接类型;
Elf32_Dyn:动态结构体;
d_tag:动态类型;
d_ptr:动态类型的虚拟地址;
DT_SYMTAB:符号表的地址;
DT_STRTAB:字符串表的地址;
DT_HASH:符号哈希表的地址;
bucket:函数索引表;
nbucket:函数索引表长度;
chain:函数索引链表;
Elf32_Sym:函数结构体;
st_name:函数名地址偏移;
st_value:函数地址偏移;
sym:函数表的基地址;
symstr:函数字符串表的基地址;
dlopen:加载动态链接库到系统内存的系统函数。
需要说明的是,本发明中的终端设备可以是个人电脑(英文全称:PersonalComputer,PC)、平板电脑、个人数字助理(Personal Digita l Assistant,PDA)、个人通信业务(英文全称:Personal Communication Service,PCS)电话、笔记本和手机等终端设备,也可以是具有移动终端的计算机,例如,可以是便携式、袖珍式、手持式、计算机内置的或者车载的移动装置,它们能够向用户提供语音和/或数据连通性的设备,以及与无线接入网交换语言和/或数据。
另外,本发明实施例中的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。
为便于说明,本发明中的实施例以便携式多功能装置100作示例性说明,本领域技术人员可以理解的,本发明中的实施例同样适用于其他装置,例如手持设备、车载设备、可穿戴设备、计算设备,以及各种形式的用户设备(User Equipment,UE),移动台(Mobilestation,MS),终端(terminal),终端设备(Terminal Equipment)等等。
本发明实施例提供的方法可以应用于游戏录屏场景中,通过OpenGLES指令录制和回访可以还原出游戏画面,指令的执行在native(本地框架)层,利用本发明实施例提供的动态链接库函数的钩挂方法通过对OpenGL ES库中目标函数的钩挂,在检测到系统调用OpenGL ES库中的目标函数时,可以通过执行自定义函数获取到游戏运行时指令的执行顺序和参数,按照这些顺序保存获取的指令,在另外一台机器进行回放就会得到游戏画面,将这些画面保存即可完成录屏的功能。这样,通过本发明实施例提供的方法可以获得直播场景下的视频画面,用户可以回放这些视频画面,对于游戏直播场景下,用户还可以通过获得的游戏画面分析游戏数据总结经验等,从而提高了直播场景下尤其是游戏直播的用户提体验。
在另一实施例中,本发明提供的动态连接库函数的钩挂方法还可以应用于以下场景中,在APP(应用程序)运行过程中,如果发现APP使用到的动态链接库函数会导致异常或者崩溃时,可以通过本发明实施例提供的动态链接库函数的钩挂方法修改异常动态链接库函数,并下发补丁包,通过钩挂技术修改动态链接库函数的执行,对动态链接库函数进行保护或者修复,保证程序正常运行。
图2示出了根据一些实施例的包括触摸屏的便携式多功能装置100的框图,所述装置100可以包括输入单元130、显示单元140、重力加速度传感器151、接近光传感器152、环境光传感器153、存储器120、处理器190、射频单元110、音频电路160、扬声器161、麦克风162、WiFi(wireless fidelity,无线保真)模块170、蓝牙模块180、电源193、外部接口197等部件。
本领域技术人员可以理解,图2仅仅是便携式多功能装置的举例,并不构成对便携式多功能装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件。
所述输入单元130可用于接收输入的数字或字符信息,以及产生与所述便携式多功能装置的用户设置以及功能控制有关的键信号输入。具体地,输入单元130可包括触摸屏131以及其他输入设备132。所述触摸屏131可收集用户在其上或附近的触摸操作(比如用户使用手指、关节、触笔等任何适合的物体在触摸屏上或在触摸屏附近的操作),并根据预先设定的程序驱动相应的连接装置。触摸屏可以检测用户对触摸屏的触摸动作,将所述触摸动作转换为触摸信号发送给所述处理器190,并能接收所述处理器190发来的命令并加以执行;所述触摸信号至少包括触点坐标信息。所述触摸屏131可以提供所述装置100和用户之间的输入界面和输出界面。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触摸屏。除了触摸屏131,输入单元130还可以包括其他输入设备。具体地,其他输入设备132可以包括但不限于物理键盘、功能键(比如音量控制按键132、开关按键133等)、轨迹球、鼠标、操作杆等中的一种或多种。
所述显示单元140可用于显示由用户输入的信息或提供给用户的信息以及装置100的各种菜单。进一步的,触摸屏131可覆盖显示面板141,当触摸屏131检测到在其上或附近的触摸操作后,传送给处理器190以确定触摸事件的类型,随后处理器190根据触摸事件的类型在显示面板141上提供相应的视觉输出。
所述重力加速度传感器151可检测各个方向上(一般为三轴)加速度的大小,同时,所述重力加速度传感器151还可用于检测终端静止时重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等。
装置100还可以包括一个或多个接近光传感器152,用于当所述装置100距用户较近时(例如当用户正在打电话时靠近耳朵)关闭并禁用触摸屏以避免用户对触摸屏的误操作;装置100还可以包括一个或多个环境光传感器153,用于当装置100位于用户口袋里或其他黑暗区域时保持触摸屏关闭,以防止装置100在锁定状态时消耗不必要的电池功耗或被误操作,在一些实施例中,接近光传感器和环境光传感器可以集成在一个颗部件中,也可以作为两个独立的部件。至于装置100还可配置陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。虽然图2示出了接近光传感器和环境光传感器,但是可以理解的是,其并不属于装置100的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
所述存储器120可用于存储指令和数据,存储器120可主要包括存储指令区和存储数据区,存储数据区可存储关节触摸手势与应用程序功能的关联关系;存储指令区可存储操作系统、至少一个功能所需的指令等;所述指令可使处理器190执行以下方法,具体方法包括:在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;根据跳转地址执行所述自定义函数得到自定义函数的执行结果;并在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
处理器190是装置100的控制中心,利用各种接口和线路连接整个装置100的各个部分,通过运行或执行存储在存储器120内的指令以及调用存储在存储器120内的数据,执行装置100的各种功能和处理数据,从而对装置100进行整体监控。可选的,处理器190可包括一个或多个处理单元;优选的,处理器190可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器190中。在一些实施例中,处理器、存储器、可以在单一芯片上实现,在一些实施例中,他们也可以在独立的芯片上分别实现。在本发明实施例中,处理器190还用于调用存储器中的指令以实现so函数的hook方法。
所述射频单元110可用于收发信息或通话过程中信号的接收和发送,特别地,将基站的下行信息接收后,给处理器190处理;另外,将设计上行的数据发送给基站。通常,RF电路包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(Low NoiseAmplifier,LNA)、双工器等。此外,射频单元110还可以通过无线通信与网络设备和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(Global System of Mobile communication,GSM)、通用分组无线服务(General PacketRadio Service,GPRS)、码分多址(Code Division Multiple Access,CDMA)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、长期演进(Long Term Evolution,LTE)、电子邮件、短消息服务(Short Messaging Service,SMS)等。
音频电路160、扬声器161、麦克风162可提供用户与装置100之间的音频接口。音频电路160可将接收到的音频数据转换后的电信号,传输到扬声器161,由扬声器161转换为声音信号输出;另一方面,麦克风162将收集的声音信号转换为电信号,由音频电路160接收后转换为音频数据,再将音频数据输出处理器190处理后,经射频单元110以发送给比如另一终端,或者将音频数据输出至存储器120以便进一步处理,音频电路也可以包括耳机插孔163,用于提供音频电路和耳机之间的连接接口。
WiFi属于短距离无线传输技术,装置100通过WiFi模块170可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图2示出了WiFi模块170,但是可以理解的是,其并不属于装置100的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
蓝牙是一种短距离无线通讯技术。利用蓝牙技术,能够有效地简化掌上电脑、笔记本电脑和手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网(Internet)之间的通信,装置100通过蓝牙模块180使装置100与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙技术是能够实现语音和数据无线传输的开放性方案。然图2示出了WiFi模块170,但是可以理解的是,其并不属于装置100的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
装置100还包括给各个部件供电的电源193(比如电池),优选的,电源可以通过电源管理系统194与处理器190逻辑相连,从而通过电源管理系统194实现管理充电、放电、以及功耗管理等功能。
装置100还包括外部接口197,所述外部接口可以是标准的Micro USB接口,也可以使多针连接器,可以用于连接装置100与其他装置进行通信,也可以用于连接充电器为装置100充电。
尽管未示出,装置100还可以包括摄像头、闪光灯等,在此不再赘述。
下面详细介绍本发明实施例提供的动态链接库函数的钩挂方法,如图3a所示,可以包括以下步骤:
S31、在检测到系统调用目标函数时,根据目标函数在内存中存储的段基址和目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址。
本步骤中涉及的目标函数可以为so函数,例如,针对游戏录屏场景中,目标函数可以为OpenGL-ES库中实现录屏指令的函数。
其中,目标函数在可执行与可连接格式文件中的地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的。
具体实施时,系统在调用目标函数时,使用公式SegmentAddress+symA.st_value计算函数的跳转地址,其中,SegmentAddress表示目标函数在内存中存储的基地址,symA.st_value表示目标函数在可执行与可连接格式(ELF)文件中的地址偏移信息。根据自定义函数的存储地址AddrB修改目标函数的地址偏移信息为AddrB-SegmentAddr,这样,系统可以计算得到目标函数的跳转地址为AddrB,即自定义函数的存储地址,由此,可以保证目标函数的执行会被拦截到自定义函数执行,在自定义函数中调用目标函数,并返回目标函数的执行结果,这样完成了针对目标函数的hook(钩挂)。
S32、根据跳转地址执行自定义函数得到自定义函数的执行结果。
S33、在自定义函数中调用目标函数,返回目标函数的执行结果。
本发明实施例提供的动态链接库函数的钩挂方法,对于一个待执行hook的目标函数,通过hook拦截其执行,并将其参数传输到自定义函数,在自定义函数中读取到目标函数的参数,为了不影响程序的正常运行,需要执行目标函数得到返回值,并将此值返回。
为了获得目标函数在内存中存储的段基址和目标函数在ELF文件中的地址偏移信息,具体实施时,可以通过对ELF文件结构体分析获得这些信息,如图3b所示,其为从ELF文件中获得目标函数在内存中存储的段基址的实施流程示意图,可以包括以下步骤:
S301、加载ELF文件至内存,所述ELF文件中包含有待hook的目标函数。
so函数信息存放在ELF文件中的.dynamic段中,因此,需要解析ELF文件在内存中的结构才能获取所有函数结构。因此,具体实施时,可以利用Android系统提供的系统函数dlopen将包含有so函数的ELF文件加载至内存中。
S302、从本地文件中读取当前本地运行进程内所有so函数的内存空间地址范围,并根据所述目标函数的函数名称在所述本地文件中查找所述so函数在内存映射的内存基址。
具体实施时,通过读取目录/pro/self/maps文件获取当前正在运行进程内所有so函数的内存空间地址范围,根据待hook的so函数查找出待hook的so函数在内存映射的开始地址,即内存基址BaseAddr。
S303、根据ELF文件结构体,在ELF文件中查找包含目标函数段的在内存中的大小。
S304、根据内存基址和查找到的段大小确定目标函数在内存中存储的段基址。
本步骤中,可以根据ELF文件结构体中包含的段数量,确定ELF文件占据的字节长度;进一步地,根据确定出字节长度,从步骤S302查找到到的内存基址开始读取相应长度的第一数据;遍历读取的第一数据,获取段结构体,段结构体中包含有段类型和段在内存中的大小;根据步骤S302中查找到的内存基址和段类型为可加载的段在内存中的大小确定段基址。
具体地,根据32位ELF文件头结构struct Elf32_Ehdr{Elf32_Off e_phoff;Elf32_Half_e_phnum;},其中,e_phnum为ELF文件中包含的段数量,e_phoff为段首地址相对于内存基址的偏移值。利用siozeof(Elf32_Ehdr)确定ELF文件占据的字节长度,并据此从BaseArr开始读取相应长度的第一数据。
遍历读取的第一数据,获得ELF文件中包含的各个段Elf32_Phdr的结构体structElf32_Phdr{Elf32_Half p_type;Elf32_Addr p_vaddr;Elf32_Xword p_memsz;},其中p_type表示段类型,p_vaddr表示段起始地址,p_memsz表示段在内存中的大小,对于p_type为PT_LOAD的段,根据其在内存中的大小确定该PT_LOAD段的大小PT_LOAD_SIZE,根据步骤S32中查找到的内存基址和PT_LOAD段的大小PT_LOAD_SIZE可以按照以下公式确定PT_LOAD段的段基址SegmentAdd:SegmentAdd=BaseAdd-PT_LOAD_SIZE。
如图4所示,可以按照以下流程确定目标函数在ELF文件中的地址便宜信息:
S41、从段类型为动态链接类型的段中获取所有动态结构体信息。
其中,步骤S41中,可以确定段类型为动态连接类型的段的段首地址和段长度,其中,段首地址为根据步骤S303中确定出的段基址和段结构体中包含的段起始地址确定出的;从段首地址开始,遍历段长度的第二数据获得所有动态结构体信息。
具体地,步骤341中可以通过遍历步骤S303中获取的第一数据,对于p_type为PT_DYNAMIC的.dynamic段,根据结构体struct Elf32_Phdr{Elf32_Half p_type;Elf32_Addrp_vaddr;Elf32_Xword p_memsz;}和段基址确定该段的段首地址dyn和段长度dynsize。
在一个实施例中,根据步骤S33中确定出的段基址和段结构体可以按照以下公式确定该段的段首地址:SegmentAdd+p_vaddr;并按照以下公式确定段长度:p_memsz/sizeof(Elf32_Dyn),其中,Elf32_Dyn为.dynamic段存放的数据类型,其结构体为struct Elf32_Dyn{Elf32_Sword d_tag;union{Elf32_Word d_val;Elf32_Addr d_ptr;}d_un;}。
进一步地,根据确定出的段首地址,从段首地址开始,遍历段长度的第二数据,可以得到所有的动态结构体信息。
S42、从获得动态结构体信息中,查找动态类型为字符串表地址和符号表地址的动态结构体信息分别存储于函数表基地址和函数字符串表基地址中。
其中,符号表地址(DT_SYMTAB)存放的是函数的基址,字符串表地址(DT_STRTAB)存放的是所有函数名称的基址。
S43、从动态类型为符号哈希表地址的函数结构体信息中读取函数索引表和函数索引链表的哈希值。
本步骤中,从动态结构体(Elf32_Dyn)信息中读取动态类型(d_tag)为符号哈希表地址(DT_HASH)的动态结构体信息,并读取该信息中的函数索引表(bucket)和函数索引链表(chain)的哈希值。
S44、根据读取的哈希值确定目标函数的地址偏移信息。
本步骤中,针对每一函数,根据该函数对应的HASH值和bucket数组的长度确定该函数在函数表中的偏移量;并根据该偏移量从sym中读取Elf32_Sym结构体,如果根据Elf32_Sym结构体中包含的函数名称确定为目标函数,则确定Elf32_Sym结构体中包含的地址偏移信息为目标函数的地址偏移信息。
具体地,针对每一函数,根据读取的HASH值,按照以下公式确定一个值:hash%nbucket,其中,hash即为读取的HASH值,其为固定值,每个函数均有其对应的HASH值。根据确定出的值,在bucket数组中查找下标为该值的index(索引),确定查找到的index为该函数在函数表中的偏移量。根据偏移量从sym读取Elf32_Sym结构体struct Elf32_Sym{Elf32_Word st_name;Elf32_Addr st_value;},通过读取symstr+st_name获取到该函数名,如果和目标函数不同则通过查找chain[index]查找下一个index,同样通过对比函数名称的方法,直到找到该函数。而找到了目标函数的结构体中包含的st_value即为目标函数在内存中相对段基址的偏移地址。
确定出了目标函数在内存中相对段基址的地址偏移信息之后,在步骤S35中,修改该地址偏移信息即完成了对目标函数的hook。具体实施时,为了修改目标函数的地址偏移信息,可以通过mprotect函数修改st_value所在内存位置的属性为可写,然后根据自定义函数的地址进行修改。
具体实施时,自定义函数的参数和返回值与目标函数相同,获取自定义函数的地址,修改目标函数的地址偏移信息为AddrB-SegmentAddr,其中,AddrB为自定义函数的地址。
这样,在系统调用目标函数时,根据段基址和目标函数的地址偏移信息确定跳转地址,根据修改后的地址偏移信息执行自定义函数得到自定义函数的执行结果;在自定义函数中调用目标函数,返回目标函数的执行结果。
本发明实施例提供的动态链接库函数的钩挂方法,将通过将目标函数在可执行与可连接格式文件中的地址偏移信息修改为根据自定义函数的存储地址确定出的地址偏移信息,这样,当系统调用目标函数时,根据修改后的地址偏移信息确定出的跳转地址可以跳转执行自定义函数实现自定义函数功能,同时在自定义函数中调用目标函数以返回目标函数的执行结果,以保证应用程序的正常运行,由此实现了对目标函数的钩挂。
基于同一发明构思,本发明实施例中还提供了一种动态链接库函数的钩挂装置,由于上述装置解决问题的原理与动态链接库函数的钩挂方法相似,因此上述装置及设备的实施可以参见方法的实施,重复之处不再赘述。
如图5所示,其为本发明实施例提供的动态链接库函数的钩挂装置结构示意图,包括:
第一确定单元51,用于在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;
执行单元52,用于根据跳转地址执行所述自定义函数得到自定义函数的执行结果;
返回单元53,用于在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
可选地,本发明实施例提供的动态链接库函数钩挂装置,还包括:
第一读取单元,用于在包含有所述目标函数的可执行与可连接格式文件加载至内存中之后,从本地文件中读取当前本地运行进程内所有动态链接库函数的内存空间地址范围;
第一查找单元,用于根据所述目标函数的函数名称在所述本地文件中查找所述动态链接库函数在内存映射的内存基址;
第二查找单元,用于根据可执行与可连接格式文件结构体,在所述可执行与可连接格式文件中查找包含所述目标函数的段在内存中的大小;
第二确定单元,用于根据所述内存基址和所述查找到的段大小确定所述段基址。
可选地,所述第二查找单元,包括:
第一确定子单元,用于根据可执行与可连接格式文件结构体中包含的段数量,确定所述可执行与可连接格式文件占据的字节长度;
第一读取子单元,用于根据所述字节长度,从所述内存基址开始读取相应长度的第一数据;
获取子单元,用于遍历所述第一数据,获取段结构体,所述段结构体中包含有段类型和段在内存中的大小;
第二确定子单元,用于确定段类型为可加载的段在内存中的大小为包含所述目标函数的段在内存中的大小。
可选地,本发明实施例提供的动态链接库函数钩挂装置,还包括:
获取单元,用于从段类型为动态链接类型的段中获取所有动态结构体信息;
第三查找单元,用于从所述动态结构体信息中,查找动态类型为字符串表地址的动态结构体信息存储于函数表的基地址中,所述字符串表地址中包含有所有函数名称的基址;
第二读取单元,用于从动态类型为符号哈希表地址的函数结构体信息中读取函数索引表和函数索引链表的哈希值;
第三确定单元,用于根据所述哈希值确定所述目标函数的地址偏移信息。
可选地,所述获取单元,包括:
第三确定子单元,用于确定动态连接类型段的段首地址和段长度,所述段首地址为根据所述段基址和所述段结构体中包含的段起始地址确定出的;
遍历子单元,用于从所述段首地址开始,遍历所述段长度的第二数据获得所有动态结构体信息。
可选地,所述第三确定单元,包括:
第四确定子单元,用于针对每一函数,根据该函数对应的哈希值和函数索引表的长度确定该函数在函数表中的偏移量;
第二读取子单元,用于根据所述偏移量从函数表基地址中读取函数结构体,如果根据所述函数结构体中包含的函数名称确定为所述目标函数,则确定所述函数结构体中包含的地址偏移信息为所述目标函数的地址偏移信息。
为了描述的方便,以上各部分按照功能划分为各模块(或单元)分别描述。当然,在实施本发明时可以把各模块(或单元)的功能在同一个或多个软件或硬件中实现。
本发明实施例还提供了一种计算机可读存储介质,存储为执行上述处理器所需执行的计算机可执行指令,其包含用于执行上述处理器所需执行的程序。
在一些可能的实施方式中,本发明提供的动态链接库函数的钩挂方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述描述的根据本发明各种示例性实施方式的动态链接库函数的钩挂方法中的步骤,例如,可以执行如图3中所示的步骤S31、在检测到系统调用目标函数时,根据目标函数在内存中存储的段基址和目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,步骤S32、根据跳转地址执行自定义函数得到自定义函数的执行结果,步骤S33、在自定义函数中调用目标函数,返回目标函数的执行结果。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
本发明的实施方式的用于so函数的hook的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在计算设备上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
应当注意,尽管在上文详细描述中提及了装置的若干单元或子单元,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。反之,上文描述的一个单元的特征和功能可以进一步划分为由多个单元来具体化。
此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (12)
1.一种动态链接库函数的钩挂方法,其特征在于,包括:
在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;
根据跳转地址执行所述自定义函数得到自定义函数的执行结果;并
在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
2.如权利要求1所述的方法,其特征在于,按照以下流程确定所述目标函数在内存中存储的段基址:
在包含有所述目标函数的可执行与可连接格式文件加载至内存中之后,从本地文件中读取当前本地运行进程内所有动态链接库函数的内存空间地址范围,并根据所述目标函数的函数名称在所述本地文件中查找所述动态链接库函数在内存映射的内存基址;
根据可执行与可连接格式文件结构体,在所述可执行与可连接格式文件中查找包含所述目标函数的段在内存中的大小;
根据所述内存基址和所述查找到的段大小确定所述段基址。
3.如权利要求2所述的方法,其特征在于,根据可执行与可连接格式文件结构体,在所述可执行与可连接格式文件中查找包含所述目标函数的段在内存中的大小,具体包括:
根据可执行与可连接格式文件结构体中包含的段数量,确定所述可执行与可连接格式文件占据的字节长度;
根据所述字节长度,从所述内存基址开始读取相应长度的第一数据;
遍历所述第一数据,获取段结构体,所述段结构体中包含有段类型和段在内存中的大小;
确定段类型为可加载的段在内存中的大小为包含所述目标函数的段在内存中的大小。
4.如权利要求3所述的方法,其特征在于,按照以下流程确定所述目标函数在可执行与可连接格式文件中的地址偏移信息:
从段类型为动态链接类型的段中获取所有动态结构体信息;
从所述动态结构体信息中,查找动态类型为字符串表地址的动态结构体信息存储于函数表的基地址中,所述字符串表地址中包含有所有函数名称的基址;以及
从动态类型为符号哈希表地址的函数结构体信息中读取函数索引表和函数索引链表的哈希值;
根据所述哈希值确定所述目标函数的地址偏移信息。
5.如权利要求4所述的方法,其特征在于,从段类型为动态链接类型的段中获取所有动态结构体信息,具体包括:
确定动态连接类型段的段首地址和段长度,所述段首地址为根据所述段基址和所述段结构体中包含的段起始地址确定出的;
从所述段首地址开始,遍历所述段长度的第二数据获得所有动态结构体信息。
6.如权利要求4所述的方法,其特征在于,根据所述哈希值确定所述目标函数的地址偏移信息,具体包括:
针对每一函数,根据该函数对应的哈希值和函数索引表的长度确定该函数在函数表中的偏移量;并
根据所述偏移量从函数表基地址中读取函数结构体,如果根据所述函数结构体中包含的函数名称确定为所述目标函数,则确定所述函数结构体中包含的地址偏移信息为所述目标函数的地址偏移信息。
7.一种动态链接库的钩挂装置,其特征在于,包括:
第一确定单元,用于在在检测到系统调用目标函数时,根据所述目标函数在内存中存储的段基址和所述目标函数在可执行与可连接格式文件中的地址偏移信息确定跳转地址,其中,所述地址偏移信息为根据自定义函数的存储地址和所述段基址确定出的;
执行单元,用于根据跳转地址执行所述自定义函数得到自定义函数的执行结果;
返回单元,用于在所述自定义函数中调用所述目标函数,返回所述目标函数的执行结果。
8.如权利要求7所述的装置,其特征在于,还包括:
第一读取单元,用于在包含有所述目标函数的可执行与可连接格式文件加载至内存中之后,从本地文件中读取当前本地运行进程内所有动态链接库函数的内存空间地址范围;
第一查找单元,用于根据所述目标函数的函数名称在所述本地文件中查找所述动态链接库函数在内存映射的内存基址;
第二查找单元,用于根据可执行与可连接格式文件结构体,在所述可执行与可连接格式文件中查找包含所述目标函数的段在内存中的大小;
第二确定单元,用于根据所述内存基址和所述查找到的段大小确定所述段基址。
9.如权利要求8所述的装置,其特征在于,所述第二查找单元,包括:
第一确定子单元,用于根据可执行与可连接格式文件结构体中包含的段数量,确定所述可执行与可连接格式文件占据的字节长度;
第一读取子单元,用于根据所述字节长度,从所述内存基址开始读取相应长度的第一数据;
获取子单元,用于遍历所述第一数据,获取段结构体,所述段结构体中包含有段类型和段在内存中的大小;
第二确定子单元,用于确定段类型为可加载的段在内存中的大小为包含所述目标函数的段在内存中的大小。
10.如权利要求9所述的装置,其特征在于,还包括:
获取单元,用于从段类型为动态链接类型的段中获取所有动态结构体信息;
第三查找单元,用于从所述动态结构体信息中,查找动态类型为字符串表地址的动态结构体信息存储于函数表的基地址中,所述字符串表地址中包含有所有函数名称的基址;
第二读取单元,用于从动态类型为符号哈希表地址的函数结构体信息中读取函数索引表和函数索引链表的哈希值;
第三确定单元,用于根据所述哈希值确定所述目标函数的地址偏移信息。
11.如权利要求10所述的装置,其特征在于,所述获取单元,包括:
第三确定子单元,用于确定动态连接类型段的段首地址和段长度,所述段首地址为根据所述段基址和所述段结构体中包含的段起始地址确定出的;
遍历子单元,用于从所述段首地址开始,遍历所述段长度的第二数据获得所有动态结构体信息。
12.如权利要求10所述的装置,其特征在于,所述第三确定单元,包括:
第四确定子单元,用于针对每一函数,根据该函数对应的哈希值和函数索引表的长度确定该函数在函数表中的偏移量;
第二读取子单元,用于根据所述偏移量从函数表基地址中读取函数结构体,如果根据所述函数结构体中包含的函数名称确定为所述目标函数,则确定所述函数结构体中包含的地址偏移信息为所述目标函数的地址偏移信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810167443.8A CN108415739B (zh) | 2018-02-28 | 2018-02-28 | 一种动态链接库函数的钩挂方法、装置和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810167443.8A CN108415739B (zh) | 2018-02-28 | 2018-02-28 | 一种动态链接库函数的钩挂方法、装置和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108415739A true CN108415739A (zh) | 2018-08-17 |
CN108415739B CN108415739B (zh) | 2020-04-14 |
Family
ID=63129398
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810167443.8A Active CN108415739B (zh) | 2018-02-28 | 2018-02-28 | 一种动态链接库函数的钩挂方法、装置和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108415739B (zh) |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109992328A (zh) * | 2019-03-14 | 2019-07-09 | 北京椒图科技有限公司 | 一种函数重定向方法及装置 |
CN110045998A (zh) * | 2019-04-22 | 2019-07-23 | 腾讯科技(深圳)有限公司 | 加载动态库的方法及装置 |
CN110532774A (zh) * | 2019-07-24 | 2019-12-03 | 阿里巴巴集团控股有限公司 | 钩子检查方法、装置、服务器及可读存储介质 |
CN110908882A (zh) * | 2019-11-14 | 2020-03-24 | 北京无限光场科技有限公司 | 一种应用程序的性能分析方法、装置、终端设备及介质 |
CN111290747A (zh) * | 2020-03-07 | 2020-06-16 | 苏州浪潮智能科技有限公司 | 一种创建函数钩子的方法、系统、设备及介质 |
CN111290952A (zh) * | 2020-01-22 | 2020-06-16 | 北京深之度科技有限公司 | 一种动态链接库函数的跟踪方法及装置 |
CN111309396A (zh) * | 2020-02-14 | 2020-06-19 | 北京字节跳动网络技术有限公司 | 一种系统库的访问方法、装置以及计算机可读存储介质 |
CN111435328A (zh) * | 2019-01-14 | 2020-07-21 | 阿里巴巴集团控股有限公司 | 应用测试方法、装置、电子设备及可读存储介质 |
CN111510457A (zh) * | 2020-04-20 | 2020-08-07 | 同盾(广州)科技有限公司 | 函数攻击的检测方法、装置、电子设备及可读介质 |
CN111831294A (zh) * | 2020-07-10 | 2020-10-27 | 广州市挖米科技有限责任公司 | 一种医疗系统免安装方法及装置 |
CN111949296A (zh) * | 2020-08-07 | 2020-11-17 | 北京字节跳动网络技术有限公司 | 一种数据更新方法及装置 |
CN112100570A (zh) * | 2020-08-20 | 2020-12-18 | 北京智游网安科技有限公司 | 指定函数被hook的处理方法、智能终端、存储介质 |
CN112306683A (zh) * | 2020-10-29 | 2021-02-02 | 北京字节跳动网络技术有限公司 | 一种函数劫持方法、装置、介质和电子设备 |
CN112416366A (zh) * | 2019-08-23 | 2021-02-26 | 华为技术有限公司 | 一种Java语言动态挂钩子的方法、装置及设备 |
CN112528296A (zh) * | 2021-02-10 | 2021-03-19 | 腾讯科技(深圳)有限公司 | 漏洞检测方法、装置和存储介质及电子设备 |
CN112631684A (zh) * | 2020-12-30 | 2021-04-09 | 北京元心科技有限公司 | 可执行程序的运行方法、装置、电子设备及计算机存储介质 |
CN112948024A (zh) * | 2021-04-15 | 2021-06-11 | 网易(杭州)网络有限公司 | 动态链接库的加载方法、装置、存储介质及电子设备 |
CN113778687A (zh) * | 2021-09-16 | 2021-12-10 | 北京小米移动软件有限公司 | 内存分配信息处理方法、装置、电子设备及存储介质 |
CN113918935A (zh) * | 2021-12-15 | 2022-01-11 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
CN114968417A (zh) * | 2021-02-25 | 2022-08-30 | 中移物联网有限公司 | 一种函数调用方法、装置及设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103077332A (zh) * | 2012-12-28 | 2013-05-01 | 飞天诚信科技股份有限公司 | 一种运行含有自校验的加壳程序的方法和装置 |
CN106095416A (zh) * | 2016-06-01 | 2016-11-09 | 腾讯科技(深圳)有限公司 | 一种在应用程序中的跳转处理方法、装置及智能终端 |
CN106325927A (zh) * | 2016-08-19 | 2017-01-11 | 北京金山安全管理系统技术有限公司 | 一种应用于Linux系统中动态库API的拦截方法及装置 |
CN107391219A (zh) * | 2017-07-07 | 2017-11-24 | 腾讯科技(深圳)有限公司 | 函数编译方法和装置 |
CN107704279A (zh) * | 2016-08-08 | 2018-02-16 | 腾讯科技(深圳)有限公司 | 一种数据加载方法以及装置 |
-
2018
- 2018-02-28 CN CN201810167443.8A patent/CN108415739B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103077332A (zh) * | 2012-12-28 | 2013-05-01 | 飞天诚信科技股份有限公司 | 一种运行含有自校验的加壳程序的方法和装置 |
CN106095416A (zh) * | 2016-06-01 | 2016-11-09 | 腾讯科技(深圳)有限公司 | 一种在应用程序中的跳转处理方法、装置及智能终端 |
CN107704279A (zh) * | 2016-08-08 | 2018-02-16 | 腾讯科技(深圳)有限公司 | 一种数据加载方法以及装置 |
CN106325927A (zh) * | 2016-08-19 | 2017-01-11 | 北京金山安全管理系统技术有限公司 | 一种应用于Linux系统中动态库API的拦截方法及装置 |
CN107391219A (zh) * | 2017-07-07 | 2017-11-24 | 腾讯科技(深圳)有限公司 | 函数编译方法和装置 |
Cited By (30)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111435328A (zh) * | 2019-01-14 | 2020-07-21 | 阿里巴巴集团控股有限公司 | 应用测试方法、装置、电子设备及可读存储介质 |
CN111435328B (zh) * | 2019-01-14 | 2023-05-05 | 阿里巴巴集团控股有限公司 | 应用测试方法、装置、电子设备及可读存储介质 |
CN109992328B (zh) * | 2019-03-14 | 2023-05-12 | 北京椒图科技有限公司 | 一种函数重定向方法及装置 |
CN109992328A (zh) * | 2019-03-14 | 2019-07-09 | 北京椒图科技有限公司 | 一种函数重定向方法及装置 |
CN110045998A (zh) * | 2019-04-22 | 2019-07-23 | 腾讯科技(深圳)有限公司 | 加载动态库的方法及装置 |
CN110532774A (zh) * | 2019-07-24 | 2019-12-03 | 阿里巴巴集团控股有限公司 | 钩子检查方法、装置、服务器及可读存储介质 |
CN112416366A (zh) * | 2019-08-23 | 2021-02-26 | 华为技术有限公司 | 一种Java语言动态挂钩子的方法、装置及设备 |
CN110908882A (zh) * | 2019-11-14 | 2020-03-24 | 北京无限光场科技有限公司 | 一种应用程序的性能分析方法、装置、终端设备及介质 |
CN111290952A (zh) * | 2020-01-22 | 2020-06-16 | 北京深之度科技有限公司 | 一种动态链接库函数的跟踪方法及装置 |
CN111290952B (zh) * | 2020-01-22 | 2023-04-14 | 北京统信软件技术有限公司 | 一种动态链接库函数的跟踪方法及装置 |
CN111309396B (zh) * | 2020-02-14 | 2023-08-15 | 北京字节跳动网络技术有限公司 | 一种系统库的访问方法、装置以及计算机可读存储介质 |
CN111309396A (zh) * | 2020-02-14 | 2020-06-19 | 北京字节跳动网络技术有限公司 | 一种系统库的访问方法、装置以及计算机可读存储介质 |
CN111290747A (zh) * | 2020-03-07 | 2020-06-16 | 苏州浪潮智能科技有限公司 | 一种创建函数钩子的方法、系统、设备及介质 |
CN111510457A (zh) * | 2020-04-20 | 2020-08-07 | 同盾(广州)科技有限公司 | 函数攻击的检测方法、装置、电子设备及可读介质 |
CN111831294A (zh) * | 2020-07-10 | 2020-10-27 | 广州市挖米科技有限责任公司 | 一种医疗系统免安装方法及装置 |
CN111831294B (zh) * | 2020-07-10 | 2024-03-22 | 广州市挖米科技有限责任公司 | 一种医疗系统免安装方法及装置 |
CN111949296A (zh) * | 2020-08-07 | 2020-11-17 | 北京字节跳动网络技术有限公司 | 一种数据更新方法及装置 |
CN112100570A (zh) * | 2020-08-20 | 2020-12-18 | 北京智游网安科技有限公司 | 指定函数被hook的处理方法、智能终端、存储介质 |
CN112306683A (zh) * | 2020-10-29 | 2021-02-02 | 北京字节跳动网络技术有限公司 | 一种函数劫持方法、装置、介质和电子设备 |
CN112631684A (zh) * | 2020-12-30 | 2021-04-09 | 北京元心科技有限公司 | 可执行程序的运行方法、装置、电子设备及计算机存储介质 |
CN112631684B (zh) * | 2020-12-30 | 2021-08-06 | 北京元心科技有限公司 | 可执行程序的运行方法、装置、电子设备及计算机存储介质 |
CN112528296A (zh) * | 2021-02-10 | 2021-03-19 | 腾讯科技(深圳)有限公司 | 漏洞检测方法、装置和存储介质及电子设备 |
CN112528296B (zh) * | 2021-02-10 | 2021-05-25 | 腾讯科技(深圳)有限公司 | 漏洞检测方法、装置和存储介质及电子设备 |
CN114968417A (zh) * | 2021-02-25 | 2022-08-30 | 中移物联网有限公司 | 一种函数调用方法、装置及设备 |
CN114968417B (zh) * | 2021-02-25 | 2024-05-24 | 中移物联网有限公司 | 一种函数调用方法、装置及设备 |
CN112948024A (zh) * | 2021-04-15 | 2021-06-11 | 网易(杭州)网络有限公司 | 动态链接库的加载方法、装置、存储介质及电子设备 |
CN113778687A (zh) * | 2021-09-16 | 2021-12-10 | 北京小米移动软件有限公司 | 内存分配信息处理方法、装置、电子设备及存储介质 |
CN113778687B (zh) * | 2021-09-16 | 2024-02-23 | 北京小米移动软件有限公司 | 内存分配信息处理方法、装置、电子设备及存储介质 |
CN113918935B (zh) * | 2021-12-15 | 2022-04-01 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
CN113918935A (zh) * | 2021-12-15 | 2022-01-11 | 飞天诚信科技股份有限公司 | 一种函数被hook时的处理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN108415739B (zh) | 2020-04-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108415739A (zh) | 一种动态链接库函数的钩挂方法、装置和存储介质 | |
CN105404585B (zh) | 获取代码覆盖率的方法及装置 | |
CN107038112B (zh) | 应用界面的调试方法及装置 | |
CN107943683B (zh) | 一种测试脚本生成方法、装置、电子设备及存储介质 | |
CN110286865A (zh) | 一种触摸屏的显示方法及电子设备 | |
CN106708554B (zh) | 程序运行方法及装置 | |
CN107329985B (zh) | 一种页面的收藏方法、装置和移动终端 | |
CN109753276B (zh) | 一种基于虚幻引擎的控制方法及相关装置 | |
CN107943685B (zh) | 一种遍历路径生成方法、装置、服务器及存储介质 | |
CN106126411B (zh) | 一种对被测程序代码进行测试的方法和装置 | |
CN108156508B (zh) | 弹幕信息处理的方法、装置、移动终端、服务器及系统 | |
CN110032512A (zh) | 一种小程序的调试方法、相关设备及终端 | |
CN111427853A (zh) | 一种数据加载方法和相关装置 | |
CN107276602B (zh) | 射频干扰处理方法、装置、存储介质及终端 | |
CN109814930A (zh) | 一种应用加载方法、装置及移动终端 | |
CN110058850A (zh) | 一种应用的开发方法、装置以及存储介质 | |
CN110196795A (zh) | 检测移动终端应用运行状态的方法及相关装置 | |
CN108958680A (zh) | 显示控制方法、装置、显示系统及计算机可读存储介质 | |
CN108920220B (zh) | 一种函数调用的方法、装置及终端 | |
CN109240902A (zh) | 一种获取电子设备的固件代码的方法和装置 | |
CN108090345A (zh) | linux系统外部命令执行方法及装置 | |
CN111966491A (zh) | 统计占用内存的方法及终端设备 | |
CN106959859A (zh) | 系统调用函数的调用方法与装置 | |
CN108984374B (zh) | 一种数据库性能的测试方法和系统 | |
CN106708555B (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 |