CN109408063B - 基于虚拟机的指令插桩方法及装置 - Google Patents
基于虚拟机的指令插桩方法及装置 Download PDFInfo
- Publication number
- CN109408063B CN109408063B CN201811343937.3A CN201811343937A CN109408063B CN 109408063 B CN109408063 B CN 109408063B CN 201811343937 A CN201811343937 A CN 201811343937A CN 109408063 B CN109408063 B CN 109408063B
- Authority
- CN
- China
- Prior art keywords
- virtual machine
- library file
- instrumentation
- source code
- codes
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于虚拟机的指令插桩方法及装置。其中,该方法包括:确定与系统中包含的虚拟机库文件相对应的虚拟机源码;对虚拟机源码进行分析,以确定虚拟机源码中的插桩位置,向插桩位置插入探针函数,得到插桩后的虚拟机源码;根据插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将系统中包含的虚拟机库文件替换为携带探针函数的虚拟机库文件;通过携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。本发明中的方式能够从系统层面实现针对目标程序的插桩操作,进而能够基于该携带探针函数的虚拟机库文件实现针对多个目标程序的插桩操作,并且能够针对基于虚拟机运行的程序进行插桩,拓宽了插桩操作的范围。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种基于虚拟机的指令插桩方法及装置。
背景技术
目前,为了对应用程序的功能和实现原理进行分析,往往需要采用逆向分析方式实现。在逆向分析方式中,需要读取源代码并进行分析。但是,随着加固技术的日益发展,越来越多的应用程序实施了加固处理,导致逆向分析的难度越来越大。为了实现对加固程序的逆向分析操作,现有技术中出现了针对源代码进行插桩的处理方式。
但是,发明人在实现本发明的过程中发现,现有的插桩处理方式只能针对常规应用程序的源代码进行插桩操作,对于基于虚拟机实现的应用程序而言,由于虚拟机需要针对应用程序执行编译操作,因此,现有的插桩处理方式无法应用于基于虚拟机实现的应用程序中,应用场景受限。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的基于虚拟机的指令插桩方法及装置。
根据本发明的一个方面,提供了基于虚拟机的指令插桩方法,包括:
确定与系统中包含的虚拟机库文件相对应的虚拟机源码;
对所述虚拟机源码进行分析,以确定所述虚拟机源码中的插桩位置,向所述插桩位置插入探针函数,得到插桩后的虚拟机源码;
根据所述插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将所述系统中包含的虚拟机库文件替换为所述携带探针函数的虚拟机库文件;
通过所述携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
根据本发明另一个方面,提供了基于虚拟机的指令插桩装置,包括:
源码确定模块,适于确定与系统中包含的虚拟机库文件相对应的虚拟机源码;
探针插入模块,适于对所述虚拟机源码进行分析,以确定所述虚拟机源码中的插桩位置,向所述插桩位置插入探针函数,得到插桩后的虚拟机源码;
替换模块,适于根据所述插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将所述系统中包含的虚拟机库文件替换为所述携带探针函数的虚拟机库文件;
插桩处理模块,适于通过所述携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
根据本发明的又一方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,处理器、存储器和通信接口通过通信总线完成相互间的通信;
存储器用于存放至少一可执行指令,可执行指令使处理器执行上述基于虚拟机的指令插桩方法对应的操作。
根据本发明的再一方面,提供了一种计算机存储介质,存储介质中存储有至少一可执行指令,可执行指令使处理器执行如上述基于虚拟机的指令插桩方法对应的操作。
在本发明公开的基于虚拟机的指令插桩方法及装置中,首先,确定与系统中包含的虚拟机库文件相对应的虚拟机源码,并确定虚拟机源码中的插桩位置,向该插桩位置插入探针函数,得到插桩后的虚拟机源码;然后,根据插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将系统中包含的虚拟机库文件替换为携带探针函数的虚拟机库文件;最后,通过该携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。由此可见,本发明中的方式能够直接对虚拟机源码执行插桩,以便生成携带探针函数的虚拟机库文件,并利用该携带探针函数的虚拟机库文件实现针对目标程序的插桩处理,从而能够从系统层面实现针对目标程序的插桩操作,进而能够基于该携带探针函数的虚拟机库文件实现针对多个目标程序的插桩操作,并且能够针对基于虚拟机运行的程序进行插桩,拓宽了插桩操作的范围。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明一个实施例的基于虚拟机的指令插桩方法的流程示意图;
图2示出了本发明另一个实施例的基于虚拟机的指令插桩方法的流程示意图;
图3示出了本发明又一实施例的一种基于虚拟机的指令插桩装置的装置结构图;
图4示出了根据本发明实施例的一种电子设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了本发明一个实施例的基于虚拟机的指令插桩方法的流程示意图。如图1所示,该方法包括:
步骤S110:确定与系统中包含的虚拟机库文件相对应的虚拟机源码。
其中,系统中包含的虚拟机库文件用于对运行于虚拟机中的目标程序执行编译运行等相关操作。例如,在Davlik虚拟机中,虚拟机库文件为libdvm.so文件。在ART虚拟机中,虚拟机库文件为libart.so文件。本发明不限定虚拟机的类型以及库文件的具体名称,只要能够实现与虚拟机的运行相关的操作即可。与虚拟机库文件相对应的虚拟机源码是指:用于生成该虚拟机库文件的源代码。
步骤S120:对虚拟机源码进行分析,以确定虚拟机源码中的插桩位置,向插桩位置插入探针函数,得到插桩后的虚拟机源码。
其中,虚拟机源码用于生成上述的虚拟机库文件,相应地,该虚拟机源码中包含用于对运行于虚拟机中的目标程序执行编译运行等相关操作的函数代码,因此,本发明通过分析虚拟机源码,能够确定其中包含的与目标程序的编译运行相关的函数代码,进而针对这些与目标程序的编译运行相关的函数代码对应的位置执行插桩操作,从而实现在目标程序的编译运行过程中进行插桩处理的目的。
具体实施时,本领域技术人员可根据虚拟机的类型和插桩的目的灵活确定虚拟机源码中的插桩位置,本发明对具体实现细节不做限定。
步骤S130:根据插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将系统中包含的虚拟机库文件替换为该携带探针函数的虚拟机库文件。
具体地,针对虚拟机源码进行插桩后,在虚拟机源码中插入了用于监测程序运行过程的探针函数,相应地,根据插桩后的虚拟机源码重新生成携带探针函数的虚拟机库文件,并将系统中原有的虚拟机库文件替换为该携带探针函数的虚拟机库文件。
步骤S140:通过该携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
具体地,由于虚拟机库文件用于对运行于虚拟机中的目标程序执行编译运行等相关操作,相应地,向该虚拟机库文件中进行插桩之后,能够利用插入的探针函数在目标程序的编译和/或运行过程中获取目标程序的运行信息,从而实现针对目标程序的插桩处理。
由此可见,本发明中的方式能够直接对虚拟机源码执行插桩,以便生成携带探针函数的虚拟机库文件,并利用该携带探针函数的虚拟机库文件实现针对目标程序的插桩处理,从而能够从系统层面实现针对目标程序的插桩操作,进而能够基于该携带探针函数的虚拟机库文件实现针对多个目标程序的插桩操作,并且能够针对基于虚拟机运行的程序进行插桩,拓宽了插桩操作的范围。
图2示出了本发明另一个实施例的基于虚拟机的指令插桩方法的流程示意图。如图2所示,该方法包括:
步骤S210:确定与系统中包含的虚拟机库文件相对应的虚拟机源码。
其中,系统中包含的虚拟机库文件用于对运行于虚拟机中的目标程序执行编译运行等相关操作。在本实施例中,虚拟机为ART虚拟机,且虚拟机库文件为libart.so文件。在ART虚拟机中,需要对运行于该虚拟机中的目标程序执行预编译,通过预编译过程生成与该目标程序相对应的本地机器码。例如,可以在目标程序的安装过程中执行预编译操作,相应地,当目标程序在后续过程中运行时,直接调用预编译得到的本地机器码即可实现目标程序的快速运行,无需像Dalvik虚拟机那样需要在程序的每次运行过程中动态地将高级语言形式的目标程序的源码编译为机器语言形式的机器码。与虚拟机库文件相对应的虚拟机源码是指:用于生成该虚拟机库文件的源代码。该虚拟机源码可通过系统源码获得。
步骤S220:对虚拟机源码进行分析,将虚拟机源码中包含的与指令执行操作相关的代码确定为目标代码,根据该目标代码确定虚拟机源码中的插桩位置。
其中,由于本发明的目的在于对目标程序进行插桩,以获取目标程序的运行相关信息,因此,需要重点分析虚拟机源码中包含的与指令执行操作相关的代码。所谓与指令执行操作相关的代码是指:用于执行目标程序中的指令的代码,相应地,通过对与指令执行操作相关的代码进行插桩能够间接实现对目标程序中的指令进行插桩的目的。
具体实施时,在本实施例的一种实现方式中,将虚拟机源码中包含的用于读取目标程序中的类和/或方法的函数代码确定为目标代码。发明人在实现本发明的过程中发现,在ART虚拟机中,由于虚拟机库文件需要对目标程序执行预编译操作,因此,在对应的虚拟机源码中需要包含用于读取目标程序中的类和/或方法的函数,以便对目标程序的代码进行预编译。通过对这些用于读取目标程序中的类和/或方法的函数代码进行插桩能够在其读取目标程序中的类和/或方法的过程中,借助插入的探针函数获取与目标程序中的类和/或方法相对应的运行相关信息,从而实现程序跟踪的目的。例如,用于读取目标程序中的类和/或方法的函数包括GetCompiledCodeToInterpreterBridge函数等。
通过针对用于读取目标程序中的类和/或方法的函数代码进行插桩能够获取与目标程序中的类和/或方法相对应的运行相关信息,但是,发明人在实现本发明的过程中发现:由于虚拟机系统中用于读取目标程序中的类和/或方法的函数代码的功能是预先设置好的,因此,在这些函数代码处执行插桩操作所执行的插桩处理逻辑也是由插入的探针函数预先配置好的。可选地,为了便于根据实际需求灵活配置插桩处理逻辑中所需监测的对象种类和数量,在本实施例中,还可以进一步将虚拟机源码中包含的用于读取与目标程序相对应的配置文件的函数代码确定为目标代码。该虚拟机源码中包含的用于读取与目标程序相对应的配置文件的函数代码可以是系统的虚拟机源码中原本存在的代码,也可以是根据具体应用场景由本领域技术人员重新编写的代码,本发明对该用于读取与目标程序相对应的配置文件的函数代码的具体来源和形式不做限定。该用于读取与目标程序相对应的配置文件的函数代码能够读取与目标程序相对应的配置文件,进而根据配置文件中存储的待监测的配置项,灵活确定针对各个目标程序的跟踪对象。由此可见,与目标程序相对应的配置文件用于存储待监测的配置项,并且,与目标程序相对应的配置文件包括:系统中预设的通用配置文件,和/或,针对目标程序设置的应用配置文件。其中,系统中预设的通用配置文件用于存储通用于各类目标程序的常规配置项,例如监测入口函数等。该通用配置文件可预先存储在系统中的预设路径下,以便根据该通用配置文件实现对各个目标程序的插桩跟踪操作。针对目标程序设置的应用配置文件用于存储针对于该目标程序设置的配置项,例如该目标程序中包含的函数名称等。该应用配置文件可在指定的目标应用安装之前进行配置。具体实施时,该用于读取与目标程序相对应的配置文件的函数代码首先根据当前安装和/或运行的目标程序的程序标识,确定是否存在与该程序标识相对应的应用配置文件,若是,则读取与该程序标识相对应的应用配置文件,根据读取的应用配置文件执行插桩处理;若否,则读取预设路径下的通用配置文件,根据读取的通用配置文件执行插桩处理。
由此可见,在本实施例中,还可以进一步设置通用配置文件和/或应用配置文件,并在用于读取配置文件的函数代码处进行插桩,以便结合配置文件灵活设置待监测的对象的数量和种类。其中,待监测的对象主要是指目标程序中包含的各个类和方法函数等。
步骤S230:向确定出的插桩位置插入探针函数,得到插桩后的虚拟机源码。
在上述步骤中已经将用于读取目标程序中的类和/或方法的函数代码和/或用于读取与目标程序相对应的配置文件的函数代码确定为插桩位置,相应地,在各个插桩位置分别插入对应的探针函数,即可得到插桩后的虚拟机源码。其中,在确定具体的插桩位置时,可以将程序的第一条语句、分支语句的开始位置、循环语句的开始位置、下一个入口语句之前的语句位置、程序的结束语句位置、分支语句的结束位置和/或循环语句的结束位置确定为插桩位置。
另外,还需要配置各个位置的探针函数的类型,并设置各个探针函数的执行逻辑;其中,探针函数的执行逻辑用于确定需要监测的函数对象和/或对象属性信息。另外,在针对用于读取与目标程序相对应的配置文件的函数代码进行插桩的情况下,还可以在探针函数中包含用于读取与目标程序相对应的配置文件中的配置项,并根据读取到的配置项动态确定需要监测的函数对象和/或对象属性信息的代码,以便灵活根据配置文件调整各个目标程序的跟踪对象。其中,探针函数的类型可以包括:语句覆盖类型,用于在基本块的入口和出口处,分别植入相应的探针,以确定程序执行时该基本块是否被覆盖;分支覆盖类型,用于针对每个分支,在其开始处植入一个相应的探针,以确定程序执行时该分支是否被覆盖;条件覆盖类型,用于在每个条件表达式的布尔表达式处植入探针,进行变量跟踪取值,以确定其被覆盖情况。
总之,探针函数的类型和执行逻辑可根据实际场景进行灵活配置,本发明对此不做限定。
步骤S240:根据插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将系统中包含的虚拟机库文件替换为该携带探针函数的虚拟机库文件。
具体地,针对虚拟机源码进行插桩后,在虚拟机源码中插入了用于监测程序运行过程的探针函数,相应地,根据插桩后的虚拟机源码重新生成携带探针函数的虚拟机库文件,并将系统中原有的虚拟机库文件替换为该携带探针函数的虚拟机库文件。具体实施时,可以针对插桩后的虚拟机源码重新编译后再刷入移动终端等存储设备中以替换其中原有的虚拟机库文件。
步骤S250:通过该携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
由于系统中原有的虚拟机库文件已被替换为该携带探针函数的虚拟机库文件,因此,当运行于虚拟机中的目标程序执行时,则会通过该携带探针函数的虚拟机库文件实现针对目标程序的插桩操作。
具体地,当检测到针对目标程序发出的启动指令时,根据该携带探针函数的虚拟机库文件执行目标程序。其中,在执行过程中根据该携带探针函数的虚拟机库文件中携带的探针函数获取与该探针函数相对应的监测结果,并将获取到的监测结果存储到预设目录下。其中,针对目标程序发出的启动指令可以是安装指令,也可以是运行指令,本发明对启动指令的具体类型不做限定。为了便于分析监测结果,可以在预设目录下生成用于存储监测结果的日志文件,后续过程中通过分析该日志文件即可大致了解程序中的各个函数的执行流程。
综上可知,在本实施例中,通过修改安卓系统源码的方式在一些指令解析处进行插桩,然后重新编译后再刷入手机替换原有的虚拟机库文件。相应地,目标程序运行时会触发系统源码中插桩的代码,然后在设定好的目录下会生成相应的日志文件,通过分析日志文件,能够分析程序的函数执行流程。本发明通过改变虚拟机源码的方式,能够对基于虚拟机实现的程序进行插桩,该方式的插桩效率很高,只需修改一次系统虚拟机源码即可通用于各个程序的插桩处理;并且,在高效的同时还兼顾了程序的个性化设置,即:通过为各个程序设置配置文件的方式能够使虚拟机源码中插桩的探针函数基于应用配置文件动态确定需要监测的对象,从而灵活性较高。
并且,若想针对同一个目标程序执行多次插桩操作,并分别针对每次插桩操作设置不同的监测对象,只需为该目标程序设置多个分别对应于各次插桩操作的应用配置文件即可。相应地,当同一目标程序对应于多个应用配置文件时,各个应用配置文件中除包含对应于该目标程序的程序标识外,还包含用于唯一标识该应用配置文件的版本号或时间信息等,以便在目标程序的各次执行过程中调用不同的版本号的应用配置文件以实现不同的插桩处理,从而能够从多个角度实现对同一目标程序的监测。
另外,本发明对目标程序实现指令插桩后,对于后续的逆向分析有很大的帮助。目前市面上的大部分应用都进行了加固保护处理,因此,单纯地通过逆向分析来获取应用内部逻辑的难度越来越大,而通过本发明中的指令插桩方式可以便捷地对某些函数进行监控,例如在函数进入时可以提示某函数开始执行,函数出口处提示某函数执行结束,由此可以不需要进行逆向分析,即可大致获取到应用内部的执行流程,进而对于后续的应用分析提供便利。
图3示出了本发明又一实施例提供的一种基于虚拟机的指令插桩装置的装置结构图。如图3所示,本装置包括:
源码确定模块31,适于确定与系统中包含的虚拟机库文件相对应的虚拟机源码;
探针插入模块32,适于对所述虚拟机源码进行分析,以确定所述虚拟机源码中的插桩位置,向所述插桩位置插入探针函数,得到插桩后的虚拟机源码;
替换模块33,适于根据所述插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将所述系统中包含的虚拟机库文件替换为所述携带探针函数的虚拟机库文件;
插桩处理模块34,适于通过所述携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
可选地,所述探针插入模块32具体适于:
将所述虚拟机源码中包含的与指令执行操作相关的代码确定为目标代码,根据所述目标代码确定所述插桩位置。
可选地,所述探针插入模块32具体适于:将所述虚拟机源码中包含的用于读取目标程序中的类和/或装置的函数代码确定为所述目标代码。
可选地,所述探针插入模块32具体适于:
将所述虚拟机源码中包含的用于读取与目标程序相对应的配置文件的函数代码确定为所述目标代码。
可选地,所述与目标程序相对应的配置文件用于存储待监测的配置项,且所述与目标程序相对应的配置文件包括:系统中预设的通用配置文件,和/或,针对目标程序设置的应用配置文件。
可选地,所述插桩处理模块34具体适于:
当检测到针对目标程序发出的启动指令时,根据所述携带探针函数的虚拟机库文件执行所述目标程序;其中,在执行过程中根据所述携带探针函数的虚拟机库文件中携带的探针函数获取与所述探针函数相对应的监测结果,并将获取到的监测结果存储到预设目录下。
可选地,所述虚拟机为ART虚拟机,且所述虚拟机库文件为libart.so文件。
上述各个模块的具体结构和工作原理可参照方法实施例中相应步骤的描述,此处不再赘述。
本申请实施例提供了一种非易失性计算机存储介质,计算机存储介质存储有至少一可执行指令,该计算机可执行指令可执行上述任意方法实施例中的基于虚拟机的指令插桩方法。
图4示出了根据本发明实施例的一种电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。
如图4所示,该电子设备可以包括:处理器(processor)402、通信接口(Communications Interface)404、存储器(memory)406、以及通信总线408。
其中:
处理器402、通信接口404、以及存储器406通过通信总线408完成相互间的通信。
通信接口404,用于与其它设备比如客户端或其它服务器等的网元通信。
处理器402,用于执行程序410,具体可以执行上述基于虚拟机的指令插桩方法实施例中的相关步骤。
具体地,程序410可以包括程序代码,该程序代码包括计算机操作指令。
处理器402可能是中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。电子设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器406,用于存放程序410。存储器406可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
程序410具体可以用于使得处理器402执行上述方法实施例中的各项操作。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的基于虚拟机的指令插桩装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
Claims (16)
1.一种基于虚拟机的指令插桩方法,包括:
确定与系统中包含的虚拟机库文件相对应的虚拟机源码;
对所述虚拟机源码进行分析,以确定所述虚拟机源码中的插桩位置,向所述插桩位置插入探针函数,得到插桩后的虚拟机源码;
根据所述插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将所述系统中包含的虚拟机库文件替换为所述携带探针函数的虚拟机库文件;
通过所述携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
2.根据权利要求1所述的方法,其中,所述确定所述虚拟机源码中的插桩位置包括:
将所述虚拟机源码中包含的与指令执行操作相关的代码确定为目标代码,根据所述目标代码确定所述插桩位置。
3.根据权利要求2所述的方法,其中,所述将所述虚拟机源码中包含的与指令执行操作相关的代码确定为目标代码包括:
将所述虚拟机源码中包含的用于读取目标程序中的类和/或方法的函数代码确定为所述目标代码。
4.根据权利要求2所述的方法,其中,所述将所述虚拟机源码中包含的与指令执行操作相关的代码确定为目标代码包括:
将所述虚拟机源码中包含的用于读取与目标程序相对应的配置文件的函数代码确定为所述目标代码。
5.根据权利要求4所述的方法,其中,所述与目标程序相对应的配置文件用于存储待监测的配置项,且所述与目标程序相对应的配置文件包括:系统中预设的通用配置文件,和/或,针对目标程序设置的应用配置文件。
6.根据权利要求1-5任一所述的方法,其中,所述通过所述携带探针函数的虚拟机库文件实现针对目标程序的插桩处理包括:
当检测到针对目标程序发出的启动指令时,根据所述携带探针函数的虚拟机库文件执行所述目标程序;其中,在执行过程中根据所述携带探针函数的虚拟机库文件中携带的探针函数获取与所述探针函数相对应的监测结果,并将获取到的监测结果存储到预设目录下。
7.根据权利要求1-6任一所述的方法,其中,所述虚拟机为ART虚拟机,且所述虚拟机库文件为libart.so文件。
8.一种基于虚拟机的指令插桩装置,包括:
源码确定模块,适于确定与系统中包含的虚拟机库文件相对应的虚拟机源码;
探针插入模块,适于对所述虚拟机源码进行分析,以确定所述虚拟机源码中的插桩位置,向所述插桩位置插入探针函数,得到插桩后的虚拟机源码;
替换模块,适于根据所述插桩后的虚拟机源码生成携带探针函数的虚拟机库文件,将所述系统中包含的虚拟机库文件替换为所述携带探针函数的虚拟机库文件;
插桩处理模块,适于通过所述携带探针函数的虚拟机库文件实现针对目标程序的插桩处理。
9.根据权利要求8所述的装置,其中,所述探针插入模块具体适于:
将所述虚拟机源码中包含的与指令执行操作相关的代码确定为目标代码,根据所述目标代码确定所述插桩位置。
10.根据权利要求9所述的装置,其中,所述探针插入模块具体适于:将所述虚拟机源码中包含的用于读取目标程序中的类和/或装置的函数代码确定为所述目标代码。
11.根据权利要求9所述的装置,其中,所述探针插入模块具体适于:
将所述虚拟机源码中包含的用于读取与目标程序相对应的配置文件的函数代码确定为所述目标代码。
12.根据权利要求11所述的装置,其中,所述与目标程序相对应的配置文件用于存储待监测的配置项,且所述与目标程序相对应的配置文件包括:系统中预设的通用配置文件,和/或,针对目标程序设置的应用配置文件。
13.根据权利要求8-12任一所述的装置,其中,所述插桩处理模块具体适于:
当检测到针对目标程序发出的启动指令时,根据所述携带探针函数的虚拟机库文件执行所述目标程序;其中,在执行过程中根据所述携带探针函数的虚拟机库文件中携带的探针函数获取与所述探针函数相对应的监测结果,并将获取到的监测结果存储到预设目录下。
14.根据权利要求8-13任一所述的装置,其中,所述虚拟机为ART虚拟机,且所述虚拟机库文件为libart.so文件。
15.一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;
所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如权利要求1-7中任一项所述的基于虚拟机的指令插桩方法对应的操作。
16.一种计算机存储介质,所述存储介质中存储有至少一可执行指令,所述可执行指令使处理器执行如权利要求1-7中任一项所述的基于虚拟机的指令插桩方法对应的操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811343937.3A CN109408063B (zh) | 2018-11-13 | 2018-11-13 | 基于虚拟机的指令插桩方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811343937.3A CN109408063B (zh) | 2018-11-13 | 2018-11-13 | 基于虚拟机的指令插桩方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109408063A CN109408063A (zh) | 2019-03-01 |
CN109408063B true CN109408063B (zh) | 2022-11-04 |
Family
ID=65472718
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811343937.3A Active CN109408063B (zh) | 2018-11-13 | 2018-11-13 | 基于虚拟机的指令插桩方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109408063B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116775040B (zh) * | 2023-08-16 | 2023-11-17 | 北京安普诺信息技术有限公司 | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019865A (zh) * | 2012-12-28 | 2013-04-03 | 北京神州绿盟信息安全科技股份有限公司 | 虚拟机监控方法和系统 |
CN103970659A (zh) * | 2014-05-16 | 2014-08-06 | 刘玉光 | 基于插桩技术的安卓应用软件自动化测试方法 |
CN104834590A (zh) * | 2014-02-11 | 2015-08-12 | 腾讯科技(深圳)有限公司 | 软件测试方法和系统 |
CN106802866A (zh) * | 2017-01-23 | 2017-06-06 | 浙江大学 | 一种Android程序的执行路径的还原方法 |
CN108563450A (zh) * | 2018-04-27 | 2018-09-21 | 董利军 | 一种java虚拟机自适应优化方法、装置以及可读存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9152531B2 (en) * | 2005-02-18 | 2015-10-06 | Green Hills Sofware, Inc. | Post-compile instrumentation of object code for generating execution trace data |
-
2018
- 2018-11-13 CN CN201811343937.3A patent/CN109408063B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019865A (zh) * | 2012-12-28 | 2013-04-03 | 北京神州绿盟信息安全科技股份有限公司 | 虚拟机监控方法和系统 |
CN104834590A (zh) * | 2014-02-11 | 2015-08-12 | 腾讯科技(深圳)有限公司 | 软件测试方法和系统 |
CN103970659A (zh) * | 2014-05-16 | 2014-08-06 | 刘玉光 | 基于插桩技术的安卓应用软件自动化测试方法 |
CN106802866A (zh) * | 2017-01-23 | 2017-06-06 | 浙江大学 | 一种Android程序的执行路径的还原方法 |
CN108563450A (zh) * | 2018-04-27 | 2018-09-21 | 董利军 | 一种java虚拟机自适应优化方法、装置以及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109408063A (zh) | 2019-03-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109933350B (zh) | 在应用中嵌入代码的方法、装置及电子设备 | |
CN106776338B (zh) | 一种测试方法、装置及服务器 | |
US11113050B2 (en) | Application architecture generation | |
CN111124480B (zh) | 应用程序包的生成方法、装置、电子设备及存储介质 | |
EP3447635A1 (en) | Application architecture generation | |
CN110990001A (zh) | Ivr流程执行方法及装置 | |
CN111538659B (zh) | 业务场景的接口测试方法、系统、电子设备和存储介质 | |
CN112882732A (zh) | 一种软件开发工具包sdk中功能代码的更新方法和装置 | |
CN109408063B (zh) | 基于虚拟机的指令插桩方法及装置 | |
CN108920179A (zh) | Java反射实现方法、装置和系统 | |
CN110688320B (zh) | 全局变量的检测方法、装置及终端设备 | |
US9436587B2 (en) | Test context generation | |
CN106951236B (zh) | 插件的开发方法及装置 | |
CN112527335B (zh) | 自动化处理npm依赖包安装的方法、系统和计算机设备 | |
CN114840427A (zh) | 一种代码测试、测试用例生成的方法及装置 | |
CN114035846A (zh) | 一种指令验证方法及指令验证装置 | |
CN114297088A (zh) | 前端vue框架组件的测试方法、装置、设备及介质 | |
CN112486497A (zh) | 编译配置文件的生成方法、装置、电子设备及存储介质 | |
CN109460255B (zh) | 内存地址的查询方法及装置 | |
CN112486470A (zh) | 基于文件依赖关系自动调整文件窗口顺序的方法及系统 | |
CN111090578A (zh) | 工程开发联调方法、装置、计算机设备及存储介质 | |
CN111444057A (zh) | 页面性能数据采集方法、装置及计算设备 | |
CN112612471B (zh) | 代码处理方法、装置、设备及存储介质 | |
CN114995799B (zh) | 一种汇编代码生成方法、装置及电子设备 | |
CN112835803B (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 |