CN113821439A - 将函数注册到探测点的方法、装置、存储介质以及终端 - Google Patents

将函数注册到探测点的方法、装置、存储介质以及终端 Download PDF

Info

Publication number
CN113821439A
CN113821439A CN202111119142.6A CN202111119142A CN113821439A CN 113821439 A CN113821439 A CN 113821439A CN 202111119142 A CN202111119142 A CN 202111119142A CN 113821439 A CN113821439 A CN 113821439A
Authority
CN
China
Prior art keywords
function
address
target
kernel
symbol table
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
CN202111119142.6A
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.)
Chengdu Oppo Communication Technology Co ltd
Original Assignee
Chengdu Oppo Communication 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 Chengdu Oppo Communication Technology Co ltd filed Critical Chengdu Oppo Communication Technology Co ltd
Priority to CN202111119142.6A priority Critical patent/CN113821439A/zh
Publication of CN113821439A publication Critical patent/CN113821439A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请实施例公开了一种将函数注册到探测点的方法、装置、存储介质以及终端,所述方法包括:获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度,基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。本申请可以找到已经存在的tracepoint点(即系统入口函数和系统出口函数)在内核符号表中分别对应的地址,进而可以在注册函数中,添加它们的地址,即可实现hook到系统入口函数和系统出口函数分别对应的地址,可以在不影响系统性能的基础上,实现监控内核的所有系统调用。

Description

将函数注册到探测点的方法、装置、存储介质以及终端
技术领域
本申请涉及计算机技术领域,尤其涉及一种将函数注册到探测点的方法、装置、存储介质以及终端。
背景技术
开发人员在内核或者模块的调试过程中,往往会需要知道其中的一些函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么等等。比较简单的做法是在内核代码对应的函数中添加日志打印信息,但这种方式往往需要重新编译内核或模块,重新启动设备之类的,操作较为复杂甚至可能会破坏原有的代码执行过程。
而利用kprobes技术,用户可以定义自己的回调函数,然后在内核的函数中或者模块的函数中,几乎所有的函数中(有些函数是不可探测的,例如kprobes自身的相关实现函数)动态的插入探测点,当内核执行流程执行到指定的探测函数时,会调用该回调函数,用户即可收集所需的信息了,同时内核最后还会回到原本的正常执行流程。如果用户已经收集足够的信息,不再需要继续探测,则同样可以动态的移除探测点。
发明内容
本申请实施例提供了一种将函数注册到探测点的方法、装置、计算机存储介质以及终端,可以在不影响系统性能的基础上,实现监控linux内核的所有系统调用。所述技术方案如下:
第一方面,本申请实施例提供了一种将函数注册到探测点的方法,所述方法包括:
获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度;
基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址;
在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
第二方面,本申请实施例提供了一种将函数注册到探测点的装置,所述装置包括:
地址获取模块,用于获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度;
地址计算模块,用于基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址;
函数注册模块,用于在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
第三方面,本申请实施例提供了一种计算机存储介质,所述计算机存储介质有多条指令,所述指令适于由处理器加载并执行上述的方法步骤。
第四方面,本申请实施例提供了一种终端,可包括:存储器和处理器;其中,所述存储器存储有计算机程序,所述计算机程序适于由所述存储器加载并执行上述的方法步骤。
本申请实施例提供的技术方案带来的有益效果至少包括:
本申请实施例的方案在执行时,获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度,基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。本申请可以找到已经存在的探测点tracepoint(即系统入口函数和系统出口函数)在内核符号表中分别对应的地址,进而可以在将钩子函数注册到tracepoint点的注册函数中,添加系统入口函数和系统出口函数分别对应的地址,即可实现hook到系统入口函数和系统出口函数分别对应的地址,避免了相关技术中采用Kprobe机制只能监控部分函数的系统调用,还会带来一次额外的中断开销,因而可以在不影响系统性能的基础上,实现监控linux内核的所有系统调用,还可以避免产生额外的中断开销。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种将函数注册到探测点的方法的流程示意图;
图2是本申请实施例提供的一种tracepoint的hook框架的示意图;
图3是本申请实施例提供的一种函数执行的原理示意图;
图4是本申请实施例提供的另一种将函数注册到探测点的方法的流程示意图;
图5是本申请实施例提供的一种将函数注册到探测点的装置的结构示意图;
图6是本申请实施例提供的一种终端的结构示意图。
具体实施方式
为使得本申请实施例的发明目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而非全部实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在本申请的描述中,需要理解的是,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。在本申请的描述中,需要说明的是,除非另有明确的规定和限定,“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其他步骤或单元。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本申请中的具体含义。此外,在本申请的描述中,除非另有说明,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
现如今,Google在android11-5.4分支上开始要求,所有下游厂商使用通用内核镜像(Generic Kernel Image,简称GKI),需要将SoC和device相关的代码从核心内核剥离到可加载模块中,从而解决内核碎片化问题。GKI为内核模块提供了稳定的内核模块接口(Kernel Module Interface,简称KMI),模块和内核可以独立更新。
Linux内核系统调用是指所有的操作系统在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。Linux系统使用的这样的函数叫做“系统调用”,英文是systemcall。这些函数代表了从用户空间到内核空间的一种转换,例如在用户空间调用open函数,则会在内核空间调用sys_open。一个已经安装的系统的支持的所有的系统调用可以在/usr/include/bits/syscall.h文件里面看到。
而在GKI之后,如果想要对所有系统调用进行客制化,可行的方法是使用Kprobe机制进行hook。Kprobe技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程。利用Kprobe技术,用户可以自定义自己的回调函数,可以在几乎所有的函数中动态插入探测点。但是,若使用Kprobe技术监控内核的系统调用,由于Kprobe框架的特性,会增加一次额外的break中断指令,即带来一次额外的中断开销,对系统的性能产生影响。此外,Kprobe存在黑名单,部分关键函数无法使用,也就无法实现监控所有系统调用的目的。
下面结合具体的实施例对本申请进行详细说明。
在下述方法实施例中,为了便于说明,仅以各步骤的执行主体为终端进行介绍说明。
请参见图1,为本申请实施例提供的一种将函数注册到探测点的方法的流程示意图。如图1所示,本申请实施例的所述方法可以包括以下步骤:
S101,获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度。
由以上描述可知,由于使用Kprobe技术只能监控部分系统调用,而且当可以监控部分函数的系统调用时,又因为Kprobe框架的特性,会增加一次额外的中断开销,影响系统性能。那么本申请,主要是基于Linux内核系统中已经存在的tracepoint,来实现监控所有系统调用。
可以理解的是,tracepoint是Linux内核静态定义的一些调试点,它分布于内核的各个子系统中。内核中的每个tracepoint声明了一个内核中的hook点,可以在内核运行过程中动态地向该tracepoint上添加或者删除hook函数。一个tracepoint可以是“打开”或者“关闭”状态,当处于“打开”状态时,也就是有hook函数注册到该tracepoint;当处于“关闭”状态时,也就是没有hook函数注册到该tracepoint。当tracepoint处于“关闭”状态时,对内核产生的影响很小,只是增加了极少的时间开销(一个分支条件判断),极小的空间开销(一条函数调用语句和几个数据结构)。当tracepoint处于“打开”状态时,开发者提供的hook函数在每次这个tracepoint执行时都会被调用,开发者提供的hook函数可由开发者自定义代码逻辑,进而可以实现相应的功能,例如,利用hook函数可以实现多种安全策略的检测逻辑。
在本申请实施例中,目标探测点函数,指的是__tracepoint_dma_fence_emit函数。
在本申请实施例中,初始地址指的是,目标探测点函数在内核符号表中对应的地址。Linux系统中的内核符号表记录了内核中所有的符号(函数、全局变量等)的地址以及名字。内核符号表被嵌入到内核镜像中,使得内核可以在运行过程中随时获得一个符号地址对应的符号名。
在本申请实施例中,探测点函数指的是__tracepoint_XX形式的函数。
根据一些实施例,获取目标探测函数在内核符号表中的初始地址,可以有以下几种实施方式:一是可以使用kallsyms_lookup_name()函数,该函数在kernel/kallsyms.c文件中定义的,要使用它必须启用CONFIG_KALLSYMS编译内核。kallsyms_lookup_name()接收一个字符串格式的内核函数名,返回内核函数的地址,比如,kallsyms_lookup_name(“函数名”);二是可以利用System.map,使用命令:$grep“函数名”/usr/src/linux/System.map;三是可以利用nm命令:$nm vmlinuz|grep“函数名”;四是可以利用/proc/kallsyms,使用命令:$cat/proc/kallsyms|grep“函数名”。需要说明的是,本申请实施例并不具体限定以上的任一实施方式,可由实际应用过程选择合适的获取方式。
根据一些实施例,在获取内核符号表中任一探测点函数的地址长度时,由于在内核符号表中,同一时间注册的探测点函数所在的位置是相邻的,内核开发者还发现,每个探测点函数在内核符号表中所占据的长度都是固定的,因此可以计算任意相邻的两个探测点函数在内核符号表中的地址之差,得到任一探测点函数的地址长度。需要说明的是,对于不同内核版本的内核符号表中的探测点函数来说,任一探测点函数的地址长度是不同的。比如,在某个内核版本的内核系统中,探测点函数__tracepoint_map_sg在内核符号表中的地址可以是ffffffd571200160,与之相邻的探测点函数__tracepoint_io_page_fault在内核符号表中的地址可以是ffffffd571200190,那么ffffffd571200190减去ffffffd571200160得到的地址长度是0x30,则在该内核符号表中,任一探测点函数的地址长度是0x30。
S102,基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址。
在本申请实施例中,系统入口函数指的是__tracepoint_sys_enter函数,系统出口函数指的是__tracepoint_sys_exit函数。
可以理解的是,可参见如图2所示的tracepoint在系统调用中的原理示意图。由图2可知,el0_svc_common start为用户态系统调用的入口,el0_svc_common end为用户态系统调用的出口,在el0_svc_common start和el0_svc_common end之间设置有__tracepoint_sys_enter、invoke_syscall以及__tracepoint_sys_exit。__tracepoint_sys_enter为系统在系统调用的入口路径上,所设置的tracepoint格式的trace event;__tracepoint_sys_exit为系统在系统调用的出口路径上,所设置的tracepoint格式的traceevent,在__tracepoint_sys_enter和__tracepoint_sys_exit之间的invoke_syscall,是系统调用。
根据一些实施例,由于系统入口函数和系统出口函数也是探测点函数,而系统入口函数和系统出口都没有在EXPORT_SYMBOL_GPL中进行声明,也没有被添加到whilelist(白名单)中,无法通过S101中获取初始地址的方式来直接获取系统入口函数的地址,以及系统出口函数的地址。由于同一时间注册的探测点函数在内核符号表中的位置是相邻的,因此可以通过初始地址减去地址长度,得到一个地址,该地址可以为某个探测点函数的地址,进一步的,可以在内核符号表中找到该地址对应的探测点函数的函数名。进一步的,可以判断该探测点函数的函数名是否为系统入口函数的函数名,以及系统出口函数的函数名,如果某个地址对应的探测点函数名为系统入口函数的函数名,则意味着该地址为系统入口函数在内核符号表中的地址,同理,如果某个地址对应的探测点函数名为系统出口函数的函数名,则意味着该地址为系统出口函数在内核符号表中的地址。
S103,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
在本申请实施例中,将钩子函数注册到探测点的注册函数,指的是tracepoint_probe_register函数。钩子函数指的是hook函数,也可以称为回调函数,可以是系统内核为驱动程序提供的一些特定的函数,在驱动程序中某个变量的状态发生改变或将要改变或改变完成时,将会自动调用该回调函数。探测点(tracepoint)指的是__tracepoint_sys_enter和__tracepoint_sys_exit。
具体的,在将钩子函数注册到探测点的注册函数中,添加系统入口函数和系统出口函数分别对应的地址,可以理解为,在执行tracepoint_probe_register函数,在tracepoint_probe_register函数中分别传入__tracepoint_sys_enter的地址和对应的probe结构体,以及__tracepoint_sys_exit的地址和对应的probe结构体。
可以理解的是,tracepoint_probe_register函数的函数原型是int tracepoint_probe_register(const char*name,void*probe),const char*name这个参数可以指向__tracepoint_sys_enter的地址或者__tracepoint_sys_exit的地址,而void*probe这个参数表示对应的probe结构体。当const char*name指向__tracepoint_sys_enter的地址时,void*probe表示与之对应的probe结构体;当const char*name指向__tracepoint_sys_exit时,void*probe表示与之对应的probe结构体。
可参见如图3所示的tracepoint_probe_register函数的执行流程示意图。由图3可知,如果仅仅是注册了针对某一个tracepoint的钩子函数,目前内核中的处理是更新内核中目前所有的tracepoint,tracepoint的钩子函数的注册与撤销是通过一个哈希表来维护的。
可以理解的是,tracepoint其实就是在Linux内核的一些关键函数中埋下的hook点,这样在跟踪内核函数的时候,开发者就可以在hook点上挂载调试的函数,也就是钩子函数,然后查看内核的信息。而在本申请实施例中,所找到的__tracepoint_sys_exit和__tracepoint_sys_enter就是在内核函数中埋下的hook点,那么则可以在hook点上挂载钩子函数,以实现对系统调用的监控。在hook点所挂载的钩子函数可由开发者自定义代码逻辑,进而可以实现相应的功能,例如,利用hook函数可以实现多种安全策略的检测逻辑。
本申请实施例的方案在执行时,获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度,基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。本申请可以找到已经存在的探测点tracepoint(即系统入口函数和系统出口函数)在内核符号表中分别对应的地址,进而可以在将钩子函数注册到tracepoint点的注册函数中,添加系统入口函数和系统出口函数分别对应的地址,即可实现hook到系统入口函数和系统出口函数分别对应的地址,避免了相关技术中采用Kprobe机制只能监控部分函数的系统调用,还会带来一次额外的中断开销,因而可以在不影响系统性能的基础上,实现监控linux内核的所有系统调用,还可以避免产生额外的中断开销。
在下述方法实施例中,为了便于说明,仅以各步骤的执行主体为终端进行介绍说明。
请参见图4,为本申请实施例提供的一种将函数注册到探测点的方法的流程示意图。如图4所示,本申请实施例的所述方法可以包括以下步骤:
S401,确定满足声明条件和白名单条件的至少一个探测点函数。
其中,声明条件指的是在EXPORT_SYMBOL_GPL中进行了声明的函数。EXPORT_SYMBOL和EXPORT_SYMBOL_GPL用于导出符号到内核符号表中(内核符号表可通过‘/proc/kallsyms’查看),导出的符号可以被其它模块调用,调用前需要先声明。通过EXPORT_SYMBOL导出的符号可以被包含GPL许可权的模块和不包含GPL许可权的模块调用,通过EXPORT_SYMBOL_GPL导出的符号只能被包含GPL许可权的模块调用,否则会报错。
其中,白名单条件指的是被添加在whilelist(白名单)中的函数。
其中,探测点函数指的是__tracepoint_XX形式的函数。
具体的,可以从内核符号表中筛选出同时满足声明条件和白名单条件的至少一个探测点函数。
S402,获取所述至少一个探测点函数分别在内核符号表中的地址,分别计算各所述地址与系统入口函数的第一参考地址之间的第一差值,并分别计算各所述地址与系统出口函数的第二参考地址之间的第二差值。
其中,系统入口函数指的是__tracepoint_sys_enter函数;系统入口函数的第一参考地址指的是,内核开发者人为在内核符号表中找到的__tracepoint_sys_enter函数的地址。
其中,系统出口函数指的是__tracepoint_sys_exit函数;系统出口函数的第二参考地址指的是,内核开发者人为在内核符号表中找到的__tracepoint_sys_exit函数的地址。
需要说明的是,在本申请实施例的步骤S410之前,终端并不知道系统入口函数的第一参考地址的含义,即系统入口函数在内核符号表中的地址,也不知道系统出口函数的第二参考地址的含义,即系统出口函数在内核符号表中的地址,仅知道第一参考地址和第二参考地址为两个不同的数值。
具体的,至少一个探测点函数分别在内核符号表中的地址的获取方式,可参见图1中S101中获取目标探测点数据在内核符号表中的地址的方式,在此不再赘述。在一些实施例中,获取至少一个探测点函数分别在内核符号表中的地址,还可以使用取地址符“&”,使用“&函数名”直接获取该函数名对应的函数的地址。进一步的,可以分别计算每个探测点函数在内核符号表中的地址和第一参考地址之间的差值,得到至少一个第一差值,以及每个探测点函数在内核符号表中的地址和第二参考地址之间的差值,得到至少一个第二差值。可以理解的是,在计算地址之间的差值时,可以保证差值是个正数,计算探测点函数的地址和第一参考地址之间的差值,可以将较大的地址作为被减数,将较小的地址作为减数,进而可以得到正的第一差值;计算探测点函数的地址和第二参考地址之间的差值,也是可以将较大的地址作为被减数,将较小的地址作为减数,进而可以得到正的第二差值。
S403,将同时满足第一差值和第二差值最小的地址作为初始地址,所述初始地址对应的函数为目标探测点函数。
具体的,可以从至少一个第一差值找出最小的第一差值,以及从至少一个第二差值中找出最小的第二差值,而最小的第一差值和最小的第二差值对应同一个探测点函数的地址,可以将这个地址作为初始地址,这个探测点函数作为目标探测点函数,也就是说,可以确定目标探测点函数在内核符号表中的初始地址。在本申请实施例中,目标探测点函数指的是__tracepoint_dma_fence_emit函数。内核开发者通过比对多个内核版本中的tracepoint函数,发现__tracepoint_dma_fence_emit函数总在第一参考地址和第二参考地址的下方,即__tracepoint_dma_fence_emit函数地址的值大于第一参考地址的值和第二参考地址的值。
S404,确定内核系统的版本号。
需要说明的是,对于步骤S401~S403,内核开发者可以选择多个不同版本的内核系统进行执行,比如,可以使用安卓11、安卓12、内核4.19、内核5.4、内核5.10等版本。
具体的,在找到当前内核系统中的目标探测点函数之后,可以确定当前内核系统的版本号。
S405,基于不同版本号和内核符号表中任一探测点函数的地址长度之间的对应关系,得到所述版本号对应的地址长度。
具体的,对于一个内核系统的内核符号表中的探测点函数来说,任一探测点函数的地址长度都是固定的,内核开发者可以在不同版本的内核系统的内核符号表中计算出任一探测点函数的地址长度,还可以存储不同版本号和任一探测点函数的地址长度之间的对应关系。在确定当前内核系统的版本号之后,可以从对应关系中直接获取当前内核系统的版本号所对应的探测点函数的地址长度。比如,内核版本号为5.10的内核系统,其内核符号表中任一探测点函数的地址长度是0x18;内核版本号为5.4的内核系统,其内核符号表中任一探测点函数的地址长度是0x30。
S406,计算所述初始地址和所述地址长度之间的差值,将所述差值作为目标地址。
S407,将所述目标地址传入内核导出函数,得到所述目标地址对应的探测点函数的目标函数名。
S408,若确定所述目标函数名不为所述系统入口函数的函数名,并且不为所述系统出口函数的函数名,则将所述目标地址作为所述初始地址,并执行所述计算所述初始地址和所述地址长度之间的差值,将所述差值作为所述目标地址的步骤,执行次数小于或者等于次数阈值。
下面对S406~S408进行解释说明。
具体的,内核开发者通过比较不同内核版本中,目标探测点函数(__tracepoint_dma_fence_emit函数)、系统入口函数(__tracepoint_sys_enter函数)以及系统出口函数(__tracepoint_sys_exit函数)这三个函数各自在内核符号表中的地址,发现目标探测点函数总在系统入口函数和系统出口函数的下方。而任一探测点函数在内核符号表中的地址长度又是固定的,因此,可以计算目标探测点函数的初始地址和地址长度之间的差值,将差值作为目标地址,而这个目标地址必然为某个探测点函数在内核符号表中的地址,进一步的,可以获取这个目标地址所对应的函数名,若函数名为系统入口函数的函数名,则说明目标地址必然为系统入口函数在内核符号表中的地址,若函数名为系统出口函数的地址,则说明目标地址必然为系统出口函数的地址。
可以理解的是,并非第一次计算初始地址和地址长度之间的差值,得到的目标地址就为系统入口函数在内核符号表中的地址,或者为系统出口函数在内核符号表中的地址。当第一次计算初始地址和地址长度的差值,得到的目标地址不为系统入口函数在内核符号表中的地址,并且,也不为系统出口函数在内核符号表中的地址时,将目标地址作为新的初始地址,继续计算新的初始地址和地址长度之间的差值,得到新的目标地址。进一步的,继续判断新的目标地址是否为系统入口函数在内核符号表中地址,或者是否为系统出口函数在内核符号表中的地址,可以重复执行上述步骤,直至找到系统入口函数在内核符号表中的地址,以及系统出口函数在内核符号表中的地址。
需要说明的是,重复执行计算目标探测点函数的初始地址和地址长度之间的差值,将差值作为目标地址的步骤的执行次数不超过次数阈值,次数阈值可由不同内核版本的内核系统的运行过程进行设定,比如,安卓12的次数阈值可以设为1000次。
可以理解的是,将所述目标地址传入内核导出函数,得到所述目标地址对应的探测点函数的目标函数名,具体实施过程可以是,使用sprint_symbol函数(内核导出函数),将目标地址传入sprint_symbol函数,得到目标地址对应的目标函数名。
可以理解的是,在判断目标函数名是否为系统入口函数的函数名或者系统出口函数的函数名时,可以通过strncmp函数(字符串对比函数)进行字符串对比。
S409,直至至少一个所述目标函数名中的第一目标函数名为所述系统入口函数的函数名,以及至少一个所述目标函数名中的第二目标函数名为所述系统出口函数的函数名。
S410,将所述第一目标函数名对应的第一目标地址作为所述系统入口函数的地址,以及将所述第二目标函数名对应的第二目标地址作为所述系统出口函数的地址。
下面对S409和S410进行解释说明。
具体的,经过S406~S408的循环过程,可以找到系统入口函数的函数名,简称为第一目标函数名,以及系统出口函数的函数名,简称为第二目标函数名。因此,可以确定系统入口函数在内核符号表中的地址为第一目标函数名对应的第一目标地址,系统出口函数在内核符号表中的地址为第二目标函数名对应的第二目标地址。
S411,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
具体的,S411可参见图1中的S103,在此不再赘述。
S412,在将所述钩子函数从所述探测点注销的注销函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
在本申请实施例中,将钩子函数从探测点注销的注销函数,指的是tracepoint_probe_unregister函数。
具体的,在将所述钩子函数从所述探测点注销的注销函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址,可以理解为,在tracepoint_probe_unregister函数中分别传入__tracepoint_sys_enter的地址和对应的probe结构体,以及__tracepoint_sys_exit的地址和对应的probe结构体。tracepoint_probe_unregister函数是与tracepoint_probe_register函数对应的注销函数,是可以将hook函数从tracepoint点注销的函数。也就是说,tracepoint_probe_unregister函数用于将hook函数从__tracepoint_sys_enter和__tracepoint_sys_exit注销,从而可以使hook函数不再挂载在tracepoint点,以结束监控内核的系统调用。
可以理解的是,tracepoint_probe_unregister函数的函数原型是inttracepoint_probe_unregister(const char*name,void*probe),const char*name这个参数可以指向__tracepoint_sys_enter的地址或者__tracepoint_sys_exit的地址,而void*probe这个参数表示对应的probe结构体。当const char*name指向__tracepoint_sys_enter的地址时,void*probe表示与之对应的probe结构体;当const char*name指向__tracepoint_sys_exit时,void*probe表示与之对应的probe结构体。
本申请实施例的方案在执行时,首先找到满足声明条件、白名单条件以及地址条件的目标探测点函数,获取所确定的目标探测点函数在内核符号表中的初始地址,确定内核系统的版本号,基于不同版本号和内核符号表中任一探测点函数的地址长度之间的对应关系,得到所述版本号对应的地址长度,因此,本申请的方案可以适用于多个版本的内核系统。另外,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址;以及在将所述钩子函数从探测点注销的注销函数中,添加所述系统入口函数和所述系统出口函数的地址。因而,本申请可以将hook函数挂载到已经存在的探测点tracepoint(即系统入口函数所在的位置和系统出口函数)所在的地址,避免了相关技术中采用Kprobe机制只能监控部分函数的系统调用,还会带来一次额外的中断开销,因而可以在不影响系统性能的基础上,实现监控不同linux内核版本的所有系统调用,还可以避免产生额外的中断开销。
请参见图5,为本申请实施例提供的一种将函数注册到探测点的装置的结构示意图。将函数注册到探测点的装置500可以通过软件、硬件或者两者的结合实现成为终端的全部或一部分。装置500包括:
地址获取模块510,用于获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度;
地址计算模块520,用于基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址;
函数注册模块530,用于在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
可选的,地址计算模块520包括:
第一计算单元,用于计算所述初始地址和所述地址长度之间的差值,将所述差值作为目标地址;
第二计算单元,用于在所述内核符号表中获取所述目标地址对应的探测点函数的目标函数名;
第三计算单元,用于在确定所述目标函数名不为所述系统入口函数的函数名,并且不为所述系统出口函数的函数名时,则将所述目标地址作为所述初始地址,并执行所述计算所述初始地址和所述地址长度之间的差值,将所述差值作为所述目标地址的步骤,执行次数小于或者等于次数阈值;
第四计算单元,用于直至至少一个所述目标函数名中的第一目标函数名为所述系统入口函数的函数名,以及至少一个所述目标函数名中的第二目标函数名为所述系统出口函数的函数名;
第五计算单元,用于将所述第一目标函数名对应的第一目标地址作为所述系统入口函数的地址,以及将所述第二目标函数名对应的第二目标地址作为所述系统出口函数的地址。
可选的,第二计算单元包括:
第二计算子单元,用于将所述目标地址传入内核导出函数,得到所述目标地址对应的探测点函数的目标函数名。
可选的,装置500还包括:
函数注销模块,用于在将所述钩子函数从所述探测点注销的注销函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
可选的,地址获取模块510包括:
版本确定单元,用于确定内核系统的版本号;
地址长度确定单元,用于基于不同版本号和内核符号表中任一探测点函数的地址长度之间的对应关系,得到所述版本号对应的地址长度。
可选的,地址获取模块510包括:
第一选取单元,用于确定满足声明条件和白名单条件的至少一个探测点函数;
第二选取单元,用于获取所述至少一个探测点函数分别在内核符号表中的地址,从所述地址中选取满足地址条件的初始地址,所述初始地址对应的函数为目标探测点函数。
可选的,第二选取单元包括:
差值计算单元,用于分别计算各所述地址与系统入口函数的第一参考地址之间的第一差值,并分别计算各所述地址与系统出口函数的第二参考地址之间的第二差值;
差值选取单元,用于将同时满足第一差值和第二差值最小的地址作为初始地址。
本申请实施例的方案在执行时,获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度,基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址,在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。本申请可以找到已经存在的tracepoint点(即系统入口函数和系统出口函数)在内核符号表中分别对应的地址,进而可以在将钩子函数注册到tracepoint点的注册函数中,添加系统入口函数和系统出口函数分别对应的地址,即可实现hook到系统入口函数和系统出口函数分别对应的地址,避免了相关技术中采用Kprobe机制只能监控部分函数的系统调用,还会带来一次额外的中断开销,因而可以在不影响系统性能的基础上,实现监控linux内核的所有系统调用,还可以避免产生额外的中断开销。
请参考图6,图6为本申请实施例提供的一种终端的结构示意图。如图6所示,终端1300可以包括:至少一个处理器1301,至少一个网络接口1304,用户接口1303,存储器1305,显示屏组件1306,至少一个通信总线1302。
其中,通信总线1302用于实现这些组件之间的连接通信。
其中,用户接口1303可以包括显示屏(Display)、摄像头(Camera),可选用户接口1303还可以包括标准的有线接口、无线接口。
其中,网络接口1304可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。
其中,处理器1301可以包括一个或者多个处理核心。处理器1301利用各种借口和线路连接整个终端1300内的各个部分,通过运行或执行存储在存储器1305内的指令、程序、代码集或指令集,以及调用存储在存储器1305内的数据,执行终端1300的各种功能和处理数据。可选的,处理器1301可以采用数字信号处理(Digital Signal Processing,DSP)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)、可编程逻辑阵列(Programmable Logic Array,PLA)中的至少一种硬件形式来实现。处理器1301可集成中央处理器(Central Processing Unit,CPU)、图像处理器(Graphics Processing Unit,GPU)和调制解调器等中的一种或几种的组合。其中,CPU主要处理操作系统、用户界面和应用程序等;GPU用于负责显示屏所需要显示的内容的渲染和绘制;调制解调器用于处理无线通信。可以理解的是,上述调制解调器也可以不集成到处理器1301中,单独通过一块芯片进行实现。
其中,存储器1305可以包括随机存储器(Random Access Memory,RAM),也可以包括只读存储器(Read-Only Memory)。可选的,该存储器1305包括非瞬时性计算机可读介质(non-transitory computer-readable storage medium)。存储器1305可用于存储指令、程序、代码、代码集或指令集。存储器1305可包括存储程序区和存储数据区,其中,存储程序区可存储用于实现操作系统的指令、用于至少一个功能的指令(比如触控功能、声音播放功能、图像播放功能等)、用于实现上述各个方法实施例的指令等;存储数据区可存储上面各个方法实施例中涉及到的数据等。存储器1305可选的还可以是至少一个位于远离前述处理器1301的存储装置。如图6所示,作为一种计算机存储介质的存储器1305中可以包括操作系统、网络通信模块、用户接口模块以及将函数注册到探测点的程序。
在图6所示的终端1300中,用户接口1303主要用于为用户提供输入的接口,获取用户输入的数据;而处理器1301可以用于调用存储器1305中存储的将函数注册到探测点的程序,并具体执行以下操作:
获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度;
基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址;
在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
在一个实施例中,处理器1301在执行所述基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址的步骤时,具体执行以下操作:
计算所述初始地址和所述地址长度之间的差值,将所述差值作为目标地址;
在所述内核符号表中获取所述目标地址对应的探测点函数的目标函数名;
若确定所述目标函数名不为所述系统入口函数的函数名,并且不为所述系统出口函数的函数名,则将所述目标地址作为所述初始地址,并执行所述计算所述初始地址和所述地址长度之间的差值,将所述差值作为所述目标地址的步骤,执行次数小于或者等于次数阈值;
直至至少一个所述目标函数名中的第一目标函数名为所述系统入口函数的函数名,以及至少一个所述目标函数名中的第二目标函数名为所述系统出口函数的函数名;
将所述第一目标函数名对应的第一目标地址作为所述系统入口函数的地址,以及将所述第二目标函数名对应的第二目标地址作为所述系统出口函数的地址。
在一个实施例中,处理器1301在执行所述在所述内核符号表中获取所述目标地址对应的探测点函数的目标函数名的步骤时,具体执行以下操作:
将所述目标地址传入内核导出函数,得到所述目标地址对应的探测点函数的目标函数名。
在一个实施例中,处理器1301还执行以下操作:
在将所述钩子函数从所述探测点注销的注销函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
在一个实施例中,处理器1301在执行所述获取内核符号表中任一探测点函数的地址长度的步骤时,具体执行以下操作:
确定内核系统的版本号;
基于不同版本号和内核符号表中任一探测点函数的地址长度之间的对应关系,得到所述版本号对应的地址长度。
在一个实施例中,处理器1301在执行所述获取所确定的目标探测点函数在内核符号表中的初始地址的步骤时,具体执行以下操作:
确定满足声明条件和白名单条件的至少一个探测点函数;
获取所述至少一个探测点函数分别在内核符号表中的地址,从所述地址中选取满足地址条件的初始地址,所述初始地址对应的函数为目标探测点函数。
在一个实施例中,处理器1301在执行所述从所述地址中选取满足地址条件的初始地址的步骤时,具体执行以下操作:
分别计算各所述地址与系统入口函数的第一参考地址之间的第一差值,并分别计算各所述地址与系统出口函数的第二参考地址之间的第二差值;
将同时满足第一差值和第二差值最小的地址作为初始地址。
除此之外,本领域技术人员可以理解,上述附图所示出的终端1300的结构并不构成对终端1300的限定,用户终端可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。比如,终端1300中还包括射频电路、音频电路、WiFi组件、电源、蓝牙组件等部件,在此不再赘述。
本申请实施例还提供了一种计算机可读存储介质,该计算机存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现如上述各个实施例所述的将函数注册到探测点的方法。
本申请实施例还提供了一种计算机程序产品,该计算机程序产品存储有至少一条指令,所述至少一条指令由所述处理器加载并执行以实现如上各个实施例所述的将函数注册到探测点的方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (10)

1.一种将函数注册到探测点的方法,其特征在于,所述方法包括:
获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度;
基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址;
在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
2.根据权利要求1所述的方法,其特征在于,所述基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址,包括:
计算所述初始地址和所述地址长度之间的差值,将所述差值作为目标地址;
在所述内核符号表中获取所述目标地址对应的探测点函数的目标函数名;
若确定所述目标函数名不为所述系统入口函数的函数名,并且不为所述系统出口函数的函数名,则将所述目标地址作为所述初始地址,并执行所述计算所述初始地址和所述地址长度之间的差值,将所述差值作为所述目标地址的步骤,执行次数小于或者等于次数阈值;
直至至少一个所述目标函数名中的第一目标函数名为所述系统入口函数的函数名,以及至少一个所述目标函数名中的第二目标函数名为所述系统出口函数的函数名;
将所述第一目标函数名对应的第一目标地址作为所述系统入口函数的地址,以及将所述第二目标函数名对应的第二目标地址作为所述系统出口函数的地址。
3.根据权利要求2所述的方法,其特征在于,所述在所述内核符号表中获取所述目标地址对应的探测点函数的目标函数名,包括:
将所述目标地址传入内核导出函数,得到所述目标地址对应的探测点函数的目标函数名。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在将所述钩子函数从所述探测点注销的注销函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
5.根据权利要求1所述的方法,其特征在于,所述获取内核符号表中任一探测点函数的地址长度,包括:
确定内核系统的版本号;
基于不同版本号和内核符号表中任一探测点函数的地址长度之间的对应关系,得到所述版本号对应的地址长度。
6.根据权利要求1所述的方法,其特征在于,所述获取所确定的目标探测点函数在内核符号表中的初始地址,包括:
确定满足声明条件和白名单条件的至少一个探测点函数;
获取所述至少一个探测点函数分别在内核符号表中的地址,从所述地址中选取满足地址条件的初始地址,所述初始地址对应的函数为目标探测点函数。
7.根据权利要求6所述的方法,其特征在于,所述从所述地址中选取满足地址条件的初始地址,包括:
分别计算各所述地址与系统入口函数的第一参考地址之间的第一差值,并分别计算各所述地址与系统出口函数的第二参考地址之间的第二差值;
将同时满足第一差值和第二差值最小的地址作为初始地址。
8.一种将函数注册到探测点的装置,其特征在于,所述装置包括:
地址获取模块,用于获取所确定的目标探测点函数在内核符号表中的初始地址,以及获取内核符号表中任一探测点函数的地址长度;
地址计算模块,用于基于所述初始地址和所述地址长度,得到系统入口函数和系统出口函数分别对应的地址;
函数注册模块,用于在将钩子函数注册到探测点的注册函数中,添加所述系统入口函数和所述系统出口函数分别对应的地址。
9.一种计算机存储介质,其特征在于,所述计算机存储介质存储有多条指令,所述指令适于由处理器加载并执行如权利要求1~7任意一项的方法步骤。
10.一种终端,其特征在于,包括:处理器和存储器;其中,所述存储器存储有计算机程序,所述计算机程序适于由所述处理器加载并执行如权利要求1~7任意一项的方法步骤。
CN202111119142.6A 2021-09-23 2021-09-23 将函数注册到探测点的方法、装置、存储介质以及终端 Pending CN113821439A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111119142.6A CN113821439A (zh) 2021-09-23 2021-09-23 将函数注册到探测点的方法、装置、存储介质以及终端

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111119142.6A CN113821439A (zh) 2021-09-23 2021-09-23 将函数注册到探测点的方法、装置、存储介质以及终端

Publications (1)

Publication Number Publication Date
CN113821439A true CN113821439A (zh) 2021-12-21

Family

ID=78921081

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111119142.6A Pending CN113821439A (zh) 2021-09-23 2021-09-23 将函数注册到探测点的方法、装置、存储介质以及终端

Country Status (1)

Country Link
CN (1) CN113821439A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115017058A (zh) * 2022-08-04 2022-09-06 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质
CN116775040A (zh) * 2023-08-16 2023-09-19 北京安普诺信息技术有限公司 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6026235A (en) * 1997-05-20 2000-02-15 Inprise Corporation System and methods for monitoring functions in natively compiled software programs
KR20020055528A (ko) * 2000-12-28 2002-07-09 오길록 멀티 태스크 프로그램의 논스톱 디버깅을 위한트레이스포인트 설정 방법
US20130283240A1 (en) * 2013-02-12 2013-10-24 Concurix Corporation Application Tracing by Distributed Objectives
CN104077220A (zh) * 2014-06-10 2014-10-01 中标软件有限公司 Mips架构操作系统内核的调试方法和装置
CN105354498A (zh) * 2015-10-30 2016-02-24 珠海市君天电子科技有限公司 一种注册表的操作方法和相关装置及设备
CN108628739A (zh) * 2018-03-19 2018-10-09 北京奇艺世纪科技有限公司 一种对Lua脚本进行调试的方法、客户端、服务器及调试器
CN110347407A (zh) * 2019-07-16 2019-10-18 武汉斗鱼鱼乐网络科技有限公司 一种获取内存占用量的方法、装置、计算机设备及介质
CN111597089A (zh) * 2020-05-18 2020-08-28 广州锦行网络科技有限公司 一种Linux系统调用事件采集和缓存装置及方法

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6026235A (en) * 1997-05-20 2000-02-15 Inprise Corporation System and methods for monitoring functions in natively compiled software programs
KR20020055528A (ko) * 2000-12-28 2002-07-09 오길록 멀티 태스크 프로그램의 논스톱 디버깅을 위한트레이스포인트 설정 방법
US20130283240A1 (en) * 2013-02-12 2013-10-24 Concurix Corporation Application Tracing by Distributed Objectives
CN104077220A (zh) * 2014-06-10 2014-10-01 中标软件有限公司 Mips架构操作系统内核的调试方法和装置
CN105354498A (zh) * 2015-10-30 2016-02-24 珠海市君天电子科技有限公司 一种注册表的操作方法和相关装置及设备
CN108628739A (zh) * 2018-03-19 2018-10-09 北京奇艺世纪科技有限公司 一种对Lua脚本进行调试的方法、客户端、服务器及调试器
CN110347407A (zh) * 2019-07-16 2019-10-18 武汉斗鱼鱼乐网络科技有限公司 一种获取内存占用量的方法、装置、计算机设备及介质
CN111597089A (zh) * 2020-05-18 2020-08-28 广州锦行网络科技有限公司 一种Linux系统调用事件采集和缓存装置及方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
LINUX知识积累: "Linux内核符号表", pages 1 - 6, Retrieved from the Internet <URL:https://blog.csdn.net/T146lLa128XX0x/article/details/80102588> *
狄卫华: "使用 tracepoint 跟踪文件 open 系统调用", pages 1 - 8, Retrieved from the Internet <URL:https://mp.weixin.qq.com/s?__biz=MzA3NjY2NzY1MA==&mid=2649740426&idx=1&sn=2e25fdcc5b01a96b4c9dd3f21eadcec6&chksm=8746bae7b03133f117d2dc50a4554f6a685bcbfc8023ddaf4d6456e3335666a0dda1b1698fbf&scene=27> *
陈荔城等: "一种监测函数语义信息访存地址序列的方法", 计算机研究与发展, vol. 50, no. 05, 15 May 2013 (2013-05-15), pages 1100 - 1109 *
黄毅益: "巧用类比法讲授汇编指令的寻址方式", 福建电脑, vol. 27, no. 05, 25 May 2011 (2011-05-25), pages 205 - 206 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115017058A (zh) * 2022-08-04 2022-09-06 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质
CN115017058B (zh) * 2022-08-04 2022-11-29 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质
CN116775040A (zh) * 2023-08-16 2023-09-19 北京安普诺信息技术有限公司 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法
CN116775040B (zh) * 2023-08-16 2023-11-17 北京安普诺信息技术有限公司 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法

Similar Documents

Publication Publication Date Title
US7827395B2 (en) Update-startup apparatus and update-startup control method
CN111090536B (zh) 一种获取内存泄露信息的方法、装置、介质和电子设备
US7779427B2 (en) Automated application configuration using device-provided data
CN107896162B (zh) 监控系统的部署方法、装置、计算机设备及存储介质
CN110569130B (zh) 一种跨进程通信方法、装置及设备
CN113821439A (zh) 将函数注册到探测点的方法、装置、存储介质以及终端
CN110457154B (zh) 异常服务处理方法及装置、存储介质、通信终端
US8990929B2 (en) Auditing application activities
CN110543327A (zh) 业务组件复用方法、装置、计算机设备及存储介质
CN113094087A (zh) 软件配置方法、电子设备及存储介质
CN114461223A (zh) 一种代码生成方法、装置及终端设备
CN113535194A (zh) 安装包的更新方法、装置、计算机设备及存储介质
CN108595192A (zh) 一种应用程序的安装方法及终端设备
CN111290740B (zh) 应用程序的开发方法、装置、计算机设备和存储介质
CN109901849B (zh) 应用程序安装方法、装置、电子设备及存储介质
CN110192178A (zh) 程序打补丁的方法、装置、微控制单元和终端设备
CN111385661B (zh) 语音控制全屏播放的方法、装置、终端及存储介质
CN111338708A (zh) 基于安卓插件的应用程序处理方法、客户端及系统
CN108628620B (zh) Pos应用开发的实现方法、装置、计算机设备和存储介质
JPWO2008111382A1 (ja) 情報処理装置、情報処理方法およびプログラム
CN111552537B (zh) 主题切换方法、装置、计算机设备及存储介质
CN114356290A (zh) 一种数据处理方法、装置及计算机可读存储介质
CN114296754A (zh) 芯片平台升级方法及相关装置
CN112052054A (zh) 函数调用方法、装置、电子设备及存储介质
CN109413714B (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