CN111427782B - 安卓动态链接库的运行方法、装置、设备及存储介质 - Google Patents
安卓动态链接库的运行方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN111427782B CN111427782B CN202010211148.5A CN202010211148A CN111427782B CN 111427782 B CN111427782 B CN 111427782B CN 202010211148 A CN202010211148 A CN 202010211148A CN 111427782 B CN111427782 B CN 111427782B
- Authority
- CN
- China
- Prior art keywords
- file
- return value
- java
- command
- system call
- 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
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3664—Environments for testing or debugging software
-
- 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
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开提供一种安卓动态链接库的运行方法、装置、设备及存储介质,涉及软件分析技术领域。该方法包括:获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令;基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果;根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值;基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值;通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果。该方法实现了在不需要运行整个应用程序情况下单独模拟运行Android动态链接库。
Description
技术领域
本公开涉及软件分析技术领域,具体而言,涉及一种安卓动态链接库的运行方法、装置、设备及可读存储介质。
背景技术
近年来,伴随着移动互联网的飞速发展,具有移动操作***的智能手机已成为目前移动终端发展的主流。这其中,基于Linux内核的安卓(Android)智能手机操作***发展最为迅速。Android平台上的应用软件,可以满足用户浏览互联网,收发电子邮件、短信息,与其他设备交换数据的需求。但是,其中的带有非正常代码的软件也把用户的智能终端作为潜在的攻击目标。为了对抗安全软件的分析检测,Android恶意应用经常把关键的非正常逻辑隐藏到用C语言编写的动态链接库当中。除此之外,恶意应用的开发者还有可能采用代码混淆、动态加载等方式加固代码,进一步提高分析的难度。在虚拟环境里模拟执行这些包含恶意逻辑的动态链接库,能够绕过这些代码加固的逻辑,更好地检测恶意代码的行为逻辑。因而Android动态链接库的模拟运行是一种十分重要的分析技术。
相关技术中的Android模拟器只实现了对安卓运行环境(Android Runtime,ART)虚拟机本身的运行支持,却并未深入底层解耦组件之间的依赖,因此并不能单独运行Android动态链接库本身,导致它们不能任意地运行动态链接库中的代码,只能依靠Android应用程序本身Java层,以Java层为入口运行整个应用程序以对动态链接库进行调用。进而导致现有的Android模拟器使用起来较为笨重,运行时资源占用较高,对宿主设备的软硬件要求较高。同时,相关技术中的Android模拟器与底层虚拟环境的实现耦合度较高,因此不能提供底层的调试接口。
如上所述,如何提供在不需要运行整个应用程序情况下单独模拟运行Android动态链接库的方法成为亟待解决的问题。
在所述背景技术部分公开的上述信息仅用于加强对本公开的背景的理解,因此它可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开的目的在于提供一种方法、装置、设备及可读存储介质,至少在一定程度上克服由于相关技术的Android模拟器与底层虚拟环境的耦合度较高导致的在不运行整个应用程序情况下无法单独模拟运行Android动态链接库的问题。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开的一方面,提供一种安卓动态链接库的运行方法,包括:获取安卓动态链接库的信息,所述安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令;基于模拟运行环境根据所述安卓动态链接库的信息解析所述安卓动态链接库获得文件解析结果;根据所述文件解析结果通过所述模拟运行环境中的模拟应用接口执行所述***调用命令获得***调用返回值;基于预设模拟配置根据所述文件解析结果和所述***调用返回值执行所述文件读写命令获得文件读写返回值;通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果。
根据本公开的一实施例,所述通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果包括:根据所述Java层函数的命令获得所述Java层函数的名称信息;通过所述模拟Java本地接口根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的名称信息执行所述Java层函数的命令获得所述Java层函数的模拟执行结果。
根据本公开的一实施例,所述模拟Java本地接口包括模拟Java结构对象;所述通过所述模拟Java本地接口根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的名称信息执行所述Java层函数的命令获得所述Java层函数的模拟执行结果包括:根据所述Java层函数的名称信息通过所述模拟Java结构对象调用模拟Java层函数;根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和执行所述模拟Java层函数获得所述Java层函数的模拟执行结果。
根据本公开的一实施例,所述Java层函数包括安卓类Java层函数;所述通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果包括:基于安卓模拟调用环境通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述安卓类Java层函数的命令获得所述安卓类Java层函数的模拟执行结果。
根据本公开的一实施例,所述安卓动态链接库还包括待调试文件;所述方法还包括:根据所述待调试文件的信息、所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的模拟执行结果对所述待调试文件进行调试。
根据本公开的一实施例,所述待调试文件包括待调试函数的命令;所述根据所述待调试文件的信息、所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的模拟执行结果对所述待调试文件进行调试包括:根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的模拟执行结果获取函数执行环境信息;根据所述待调试函数的信息和所述函数执行环境信息执行所述待调试函数的命令。
根据本公开的一实施例,所述待调试文件包括待调试地址;所述基于预设模拟配置根据所述文件解析结果和所述***调用返回值执行所述文件读写命令获得文件读写返回值包括:基于预设模拟配置根据所述待调试地址的信息、所述文件解析结果和所述***调用返回值执行文件读写命令获得读写执行环境信息;输出所述读写执行环境信息。
根据本公开的再一方面,提供一种安卓动态链接库的运行装置,包括:模拟器模块,用于获取安卓动态链接库的信息,所述安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令;所述模拟器模块,还用于基于模拟运行环境根据所述安卓动态链接库的信息解析所述安卓动态链接库获得文件解析结果;***模块,用于根据所述文件解析结果通过模拟应用接口执行所述***调用命令获得***调用返回值;***模块,还用于基于预设模拟配置根据所述文件解析结果和所述***调用返回值执行所述文件读写命令获得文件读写返回值;Java模块,用于通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果。
根据本公开的再一方面,提供一种设备,包括:存储器、处理器及存储在所述存储器中并可在所述处理器中运行的可执行指令,所述处理器执行所述可执行指令时实现如上述任一种方法。
根据本公开的再一方面,提供一种计算机可读存储介质,其上存储有计算机可执行指令,所述可执行指令被处理器执行时实现如上述任一种方法。
本公开的实施例提供的安卓动态链接库的运行方法,通过获取包括***调用命令、文件读写命令和Java层函数的命令的安卓动态链接库的信息,基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果,根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值,基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值,通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果,从而可实现在不需要运行整个应用程序情况下单独模拟运行Android动态链接库。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本公开。
附图说明
通过参照附图详细描述其示例实施例,本公开的上述和其它目标、特征及优点将变得更加显而易见。
图1示出本公开实施例中一种安卓动态链接库的运行方法的流程图。
图2示出本公开实施例中另一种安卓动态链接库的运行方法的流程图。
图3示出本公开实施例中再一种安卓动态链接库的运行方法的流程图。
图4示出本公开实施例中再一种安卓动态链接库的运行方法的流程图。
图5示出本公开实施例中一种安卓动态链接库的运行装置的框图。
图6示出本公开实施例中另一种安卓动态链接库的运行装置的框图。
图7示出本公开实施例中一种电子设备的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施例。然而,示例实施例能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施例使得本公开将更加全面和完整,并将示例实施例的构思全面地传达给本领域的技术人员。附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本公开的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、装置、步骤等。在其它情况下,不详细示出或描述公知结构、方法、装置、实现或者操作以避免喧宾夺主而使得本公开的各方面变得模糊。
此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本公开的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。符号“/”一般表示前后关联对象是一种“或”的关系。
在本公开中,除非另有明确的规定和限定,“连接”等术语应做广义理解,例如,可以是电连接或可以互相通讯;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本公开中的具体含义。
如上所述,相关技术中的Android模拟器基于Linux虚拟机改造,添加了一些Android特有的文件、设置,用于运行Android ART虚拟机,因而可以运行Android应用。因此相关技术中的Android模拟器只实现了对ART虚拟机本身的运行支持,却并未深入底层解耦组件之间的依赖,因此并不能单独运行Android动态链接库本身,导致它们不能任意地运行动态链接库中的代码,只能依靠Android应用程序本身Java层,以Java层为入口运行整个应用程序以对动态链接库进行调用。进而导致现有的Android模拟器使用起来较为笨重,运行时资源占用较高,对宿主设备的软硬件要求较高。同时,相关技术中的Android模拟器与底层虚拟环境的实现耦合度较高,因此不能提供底层的调试接口。因此,本公开提供了一种安卓动态链接库的运行方法,通过对Android和Java本地接口(Java Native Interface,JNI)运行环境的模拟,能够独立对Android动态链接库进行模拟执行,避免了Java层的限制,这使得本发明的运行代价远小于相关技术中的Android模拟器。同时,采用较为底层的模拟执行方式使用户可以改变运行环境的配置、文件***的特征等等,还可以根据需要对代码进行调用和调试,大大提高了分析和检测非正常逻辑的效率。
在一些实施例中,可首先架设一个能够在x86架构的中央处理器上模拟执行Arm指令集的模拟执行环境,例如使用Unicorn模拟执行框架来实现Arm指令集的模拟执行,在Unicorn模拟执行框架当中设置基础的堆栈地址、初始的寄存器值、映射文件***目录等等,用于运行Android应用中的动态链接库中包含的机器码。同时在模拟执行框架中添加对各类中断和函数调用的钩子(hook)接口,为模拟执行环境的堆栈分配内存,并实现基本的内存分配管理接口,为后续的环境模拟做准备。
除了指令集虚拟执行,还可对Android***内核的一些***调用进行模拟,以实现各类底层的功能。为了模拟内存管理应用程序接口的逻辑,还需要实现虚拟内存的分配接口。在保障动态链接库可正常运行之后,还需要模拟安卓本身的环境。一个文件夹可被用于模拟Android的文件***,可将映射到模拟执行环境文件***的目录进行配置,添加各个关键目录和其中必要的文件,例如/proc目录,/sys目录,还有Android***的内外部存储,/data和/storage目录等等。而Android动态链接库还会包含大量与Java层交互的逻辑,因此还需要对整个JNI和Java层被调用的一些Android常用类进行模拟,例如为动态链接库中的函数提供定制的JNIEnv和JavaVM(Java虚拟机)结构对象,用于实现其指向的各类JNI调用函数,例如CallStaticObjectMethod,FindClass等等。
图1是根据一示例性实施例示出的一种安卓动态链接库的运行方法的流程图。如图1所示的方法例如可以应用于上述虚拟执行环境。参考图1,本公开实施例提供的方法10可以包括以下步骤。
在步骤S102中,获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令。用户可将指定的安卓动态链接库、内存地址输入到模拟器模块,以便模拟器模块接收信息后会启动模拟运行环境。
在步骤S104中,基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果。可通过模拟器模块提供模拟运行环境的基础框架,用于模拟执行Arm指令集以便为将运行的安卓动态链接库分配内存,映射虚拟地址,解析并加载安卓动态链接库代码等等。为实现安卓动态链接库ELF文件的解析,需要校验ELF文件的格式,并解析其各个段(segment)头结构,以获得动态链接库的代码段、数据段等文件解析结构,以便将安卓动态链接库的代码段、数据段等内容加载到模拟运行环境中从使用者指定的内存地址开始运行。在步骤S106中,根据文件解析结果通过模拟运行环境中的模拟应用接口执行***调用命令获得***调用返回值。在模拟运行环境中,可通过Unicorn模拟执行框架提供的应用程序接口设置对***中断的hook以便进行拦截而实现模拟运行,也可通过模拟应用程序接口实现所有安卓动态链接库中会被使用的***调用,例如各类文件、socket IO的***调用,并将***调用结果返回安卓动态链接库。
在步骤S108中,基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值。在模拟运行环境中,可通过Unicorn模拟执行框架提供的应用程序接口以及对***中断的hook,实现所有安卓动态链接库中的文件读写,并将文件读写结果返回安卓动态链接库。
在步骤S110中,通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果。进一步地,根据Java层函数的命令获得Java层函数的名称信息,通过模拟Java本地接口根据文件解析结果、***调用返回值、文件读写返回值和Java层函数的名称信息执行Java层函数的命令获得Java层函数的模拟执行结果。更进一步地,根据Java层函数的名称信息通过模拟Java结构对象调用模拟Java层函数,根据文件解析结果、***调用返回值、文件读写返回值和执行模拟Java层函数获得Java层函数的模拟执行结果。
根据本公开的实施例提供的安卓动态链接库的运行方法,通过获取包括***调用命令、文件读写命令和Java层函数的命令的安卓动态链接库的信息,基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果,根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值,基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值,通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果,从而可实现在不需要运行整个应用程序情况下单独模拟运行Android动态链接库。
图2是根据一示例性实施例示出的一种安卓动态链接库的运行方法的流程图。如图2所示的方法例如可以应用于上述虚拟执行环境。参考图2,本公开实施例提供的方法20可以包括以下步骤。
在步骤S202中,模拟器模块获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令、Java层函数的命令和待调试文件。用户可将指定的安卓动态链接库、内存地址和待调试文件输入到模拟器模块,以便模拟器模块接收信息后会启动模拟执行环境。
在步骤S204中,模拟器模块基于模拟运行环境根据安卓动态链接库的信息为安卓动态链接库分配内存、映射虚拟地址以及解析安卓动态链接库获得文件解析结果。模拟器模块为将运行的安卓动态链接库分配内存,映射虚拟地址,解析并加载安卓动态链接库代码。为实现安卓动态链接库ELF文件的解析,需要校验ELF文件的格式,并解析其各个段(segment)头结构,将安卓动态链接库的代码段、数据段等内容加载到模拟运行环境中从使用者指定的内存地址开始运行。
在步骤S206中,根据文件解析结果运行安卓动态链接库,在运行***调用命令时,通过模拟运行环境中的模拟应用接口执行***调用命令获得***调用返回值,并将***调用返回值返回安卓动态链接库。模拟器模块对加载的安卓动态链接库开始运行,当运行到***调用命令时,会将需要调用的***调用号及其相应参数发送到***模块,***模块通过模拟应用接口执行***调用命令。
在步骤S208中,根据文件解析结果和***调用返回值运行安卓动态链接库,在运行文件读写命令时,基于预设模拟配置执行文件读写命令获得文件读写返回值,并将文件读写返回值返回安卓动态链接库。模拟器模块当运行到文件读写命令时,会将需要读写的文件名及其相应参数发送到***模块,***模块通过模拟应用接口执行文件读写命令。
在步骤S210中,根据文件解析结果、***调用返回值和文件读写返回值运行安卓动态链接库,在运行Java层函数的命令时,将Java层函数的类名、函数名和函数签名发送至Java模块。
在步骤S212中,Java模块通过模拟Java本地接口模拟执行Java层函数的命令获得Java层函数的模拟执行结果,并将Java层函数的模拟执行结果返回安卓动态链接库。安卓动态链接库运行时若需调用Java层的函数,则会将待调用的Java类名、函数名、函数签名发送给Java模块,由Java模块模拟此函数的执行,并将相应结果返回给安卓动态链接库。
在步骤S214中,根据待调试文件的信息、文件解析结果、***调用返回值、文件读写返回值和Java层函数的模拟执行结果对待调试文件进行调试。进一步地,待调试文件包括待调试函数的命令,根据文件解析结果、***调用返回值、文件读写返回值和Java层函数的模拟执行结果获取函数执行环境信息,根据待调试函数的信息和函数执行环境信息执行待调试函数的命令。当模拟器模块运行安卓动态链接库到使用者指定的待调试函数时,模拟器模块会将控制权转交给调试模块,并向调试模块发送当前的运行环境信息,然后调试模块通过使用者预定的调试逻辑执行待调试函数以检测非正常代码。
根据本公开的实施例提供的安卓动态链接库的运行方法,通过获取包括***调用命令、文件读写命令、Java层函数的命令和待调试文件的安卓动态链接库的信息,基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果,根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值,基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值,通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果,再根据待调试文件的信息、文件解析结果、***调用返回值、文件读写返回值和Java层函数的模拟执行结果对待调试文件进行调试,从而可实现在不需要运行整个应用程序情况下单独模拟运行Android动态链接库以检测Android动态链接库中的非正常代码。
图3是根据一示例性实施例示出的一种安卓动态链接库的运行方法的流程图。如图3所示的方法例如可以应用于上述虚拟执行环境。参考图3,本公开实施例提供的方法30可以包括以下步骤。
在步骤S302中,模拟器模块获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令和待调试地址。用户可将指定的安卓动态链接库、内存地址和待调试地址输入到模拟器模块,以便模拟器模块接收信息后会启动模拟执行环境。
在步骤S304中,模拟器模块基于模拟运行环境根据安卓动态链接库的信息为安卓动态链接库分配内存、映射虚拟地址以及解析安卓动态链接库获得文件解析结果。模拟器模块为将运行的安卓动态链接库分配内存,映射虚拟地址,解析并加载安卓动态链接库代码。为实现安卓动态链接库ELF文件的解析,需要校验ELF文件的格式,并解析其各个段(segment)头结构,将安卓动态链接库的代码段、数据段等内容加载到模拟运行环境中从使用者指定的内存地址开始运行。
在步骤S306中,模拟器模块根据文件解析结果运行安卓动态链接库,在运行***调用命令时,***模块通过模拟运行环境中的模拟应用接口执行***调用命令获得***调用返回值,并将***调用返回值返回安卓动态链接库。模拟器模块对加载的安卓动态链接库开始运行,当运行到***调用命令时,会将需要调用的***调用号及其相应参数发送到***模块,***模块通过模拟应用接口执行***调用命令。
在步骤S308中,模拟器模块根据文件解析结果和***调用返回值运行安卓动态链接库,在运行文件读写命令时,基于预设模拟配置执行文件读写命令获得读写执行环境信息,并根据待调试地址的信息将读写执行环境信息发送至调试模块。
在步骤S310中,调试模块输出读写执行环境信息。当模拟器运行安卓动态链接库到使用者指定的待调试地址时,模拟器模块会将控制权转交给调试模块,并向调试模块发送当前的运行环境信息,由调试模块执行使用者预定的逻辑,例如输出当前的运行环境信息,显示加密文件等等。
根据本公开的实施例提供的安卓动态链接库的运行方法,通过模拟器模块获取包括***调用命令、文件读写命令和待调试地址的安卓动态链接库的信息,基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果,根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值,模拟器模块根据文件解析结果和***调用返回值运行安卓动态链接库,在运行文件读写命令时,基于预设模拟配置执行文件读写命令获得读写执行环境信息,并根据待调试地址的信息将读写执行环境信息发送至调试模块,调试模块输出读写执行环境信息,从而可实现在不需要运行整个应用程序情况下单独模拟运行Android动态链接库以检测Android动态链接库中的非正常代码。
图4是根据一示例性实施例示出的一种安卓动态链接库的运行方法的流程图。如图4所示的方法例如可以应用于上述虚拟执行环境。参考图4,本公开实施例提供的方法40可以包括以下步骤。
在步骤S402中,模拟器模块获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令、安卓类Java层函数的命令和待调试函数的命令。用户可将指定的安卓动态链接库、内存地址和待调试函数输入到模拟器模块,以便模拟器模块接收信息后会启动模拟执行环境。
在步骤S404中,模拟器模块基于模拟运行环境根据安卓动态链接库的信息为安卓动态链接库分配内存、映射虚拟地址以及解析安卓动态链接库获得文件解析结果。模拟器模块为将运行的安卓动态链接库分配内存,映射虚拟地址,解析并加载安卓动态链接库代码。为实现安卓动态链接库ELF文件的解析,需要校验ELF文件的格式,并解析其各个段(segment)头结构,将安卓动态链接库的代码段、数据段等内容加载到模拟运行环境中从使用者指定的内存地址开始运行。
在步骤S406中,模拟器模块根据文件解析结果运行安卓动态链接库,在运行***调用命令时,***模块通过模拟运行环境中的模拟应用接口执行***调用命令获得***调用返回值,并将***调用返回值返回安卓动态链接库。模拟器模块对加载的安卓动态链接库开始运行,当运行到***调用命令时,会将需要调用的***调用号及其相应参数发送到***模块,***模块通过模拟应用接口执行***调用命令。
在步骤S408中,模拟器模块根据文件解析结果和***调用返回值运行安卓动态链接库,在运行文件读写命令时,***模块基于预设模拟配置执行文件读写命令获得文件读写返回值,并将文件读写返回值返回安卓动态链接库。模拟器模块当运行到文件读写命令时,会将需要读写的文件名及其相应参数发送到***模块,***模块通过模拟应用接口执行文件读写命令。
在步骤S410中,根据文件解析结果、***调用返回值和文件读写返回值运行安卓动态链接库,在运行安卓类Java层函数的命令时,将安卓类Java层函数的类名、函数名和函数签名发送至Java模块。
在步骤S412中,Java模块通过模拟Java本地接口从安卓函数模块调用安卓类Java层函数,并通过安卓函数模块模拟执行安卓类Java层函数的命令获得安卓类Java层函数的模拟执行结果,并将安卓类Java层函数的模拟执行结果返回安卓动态链接库。Android动态链接库还会包含大量与Java层交互的逻辑,因此还需要对整个JNI和Java层被调用的一些Android常用类进行模拟,例如为动态链接库中的函数提供定制的JNIEnv和JavaVM(Java虚拟机)结构对象,用于实现其指向的各类JNI调用函数,例如CallStaticObjectMethod,FindClass等等。
在步骤S414中,模拟器模块根据文件解析结果、***调用返回值、文件读写返回值和安卓类Java层函数的模拟执行结果获取待调试函数执行环境信息,并将待调试函数执行环境信息发送至调试模块。
在步骤S416中,调试模块根据待调试函数的信息和函数执行环境信息执行待调试函数的命令。当模拟器模块运行安卓动态链接库到使用者指定的待调试函数时,模拟器模块会将控制权转交给调试模块,并向调试模块发送当前的运行环境信息,然后调试模块通过使用者预定的调试逻辑执行待调试函数以检测非正常代码。采用调试模块能够简化调试特定目标的实现复杂度,帮助使用者以更高的效率完成非正常应用的动态链接库分析。
根据本公开的实施例提供的安卓动态链接库的运行方法,通过获取包括***调用命令、文件读写命令、安卓类Java层函数的命令和待调试文件的安卓动态链接库的信息,基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果,根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值,基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值,通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行安卓类Java层函数的命令获得安卓类Java层函数的模拟执行结果,再根据待调试文件的信息、文件解析结果、***调用返回值、文件读写返回值和安卓类Java层函数的模拟执行结果对待调试文件进行调试,从而可实现在不需要运行整个应用程序情况下单独模拟运行Android动态链接库以检测Android动态链接库中的非正常代码。
图5是根据一示例性实施例示出的一种装置的框图。如图5所示的装置例如可以应用于上述虚拟执行环境。
参考图5,本公开实施例提供的装置50可以包括模拟器模块502、***模块504和Java模块506。
模拟器模块502可用于获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令。
模拟器模块502还可用于基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果。
***模块504可用于根据文件解析结果通过模拟运行环境中的模拟应用接口执行***调用命令获得***调用返回值。
***模块504还可用于基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值。
Java模块506可用于通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果。
图6是根据一示例性实施例示出的一种装置的框图。如图6所示的装置例如可以应用于上述虚拟执行环境。
参考图6,本公开实施例提供的装置60可以包括模拟器模块602、***模块604、Java模块606、安卓函数模块608和调试模块610。
模拟器模块602可用于获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令、Java层函数的命令和待调试文件,Java层函数包括安卓类Java层函数,待调试文件包括待调试函数的命令和/或待调试地址。
模拟器模块602还可用于基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果。
***模块604可用于根据文件解析结果通过模拟运行环境中的模拟应用接口执行***调用命令获得***调用返回值。
***模块604还可用于基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值。
Java模块606可用于通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果。
Java模块606还可用于根据Java层函数的命令获得Java层函数的名称信息;通过模拟Java本地接口根据文件解析结果、***调用返回值、文件读写返回值和Java层函数的名称信息执行Java层函数的命令获得Java层函数的模拟执行结果。
Java模块606还可用于根据Java层函数的名称信息通过模拟Java结构对象调用模拟Java层函数;根据文件解析结果、***调用返回值、文件读写返回值和执行模拟Java层函数获得Java层函数的模拟执行结果。
安卓函数模块608可用于基于安卓模拟调用环境通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行安卓类Java层函数的命令获得安卓类Java层函数的模拟执行结果。
模拟器模块602还可用于根据文件解析结果、***调用返回值、文件读写返回值和Java层函数的模拟执行结果获取函数执行环境信息。
调试模块610可用于根据待调试函数的信息和函数执行环境信息执行待调试函数的命令。
模拟器模块602还可用于基于预设模拟配置根据待调试地址的信息、文件解析结果和***调用返回值执行文件读写命令获得读写执行环境信息。
调试模块610还可用于输出读写执行环境信息。
图7示出本公开实施例中一种电子设备的结构示意图。需要说明的是,图7示出的设备仅以计算机***为示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图7所示,设备700包括中央处理单元(CPU)701,其可以根据存储在只读存储器(ROM)702中的程序或者从存储部分708加载到随机访问存储器(RAM)703中的程序而执行各种适当的动作和处理。在RAM 703中,还存储有设备700操作所需的各种程序和数据。CPU701、ROM 702以及RAM 703通过总线704彼此相连。输入/输出(I/O)接口705也连接至总线704。
以下部件连接至I/O接口705:包括键盘、鼠标等的输入部分706;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分707;包括硬盘等的存储部分708;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分709。通信部分709经由诸如因特网的网络执行通信处理。驱动器710也根据需要连接至I/O接口705。可拆卸介质711,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器710上,以便于从其上读出的计算机程序根据需要被安装入存储部分708。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分709从网络上被下载和安装,和/或从可拆卸介质711被安装。在该计算机程序被中央处理单元(CPU)701执行时,执行本公开的***中限定的上述功能。
需要说明的是,本公开所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行***、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行***、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本公开各种实施例的***、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括模拟器模块、***模块和Java模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,模拟器模块还可以被描述为“用于模拟执行Arm指令集的模块”。
作为另一方面,本公开还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:
获取安卓动态链接库的信息,安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令;基于模拟运行环境根据安卓动态链接库的信息解析安卓动态链接库获得文件解析结果;根据文件解析结果通过模拟应用接口执行***调用命令获得***调用返回值;基于预设模拟配置根据文件解析结果和***调用返回值执行文件读写命令获得文件读写返回值;通过模拟Java本地接口根据文件解析结果、***调用返回值和文件读写返回值执行Java层函数的命令获得Java层函数的模拟执行结果。
以上具体地示出和描述了本公开的示例性实施例。应可理解的是,本公开不限于这里描述的详细结构、设置方式或实现方法;相反,本公开意图涵盖包含在所附权利要求的精神和范围内的各种修改和等效设置。
Claims (10)
1.一种安卓动态链接库的运行方法,其特征在于,包括:
获取安卓动态链接库的信息,所述安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令;
基于模拟运行环境根据所述安卓动态链接库的信息解析所述安卓动态链接库获得文件解析结果;
根据所述文件解析结果通过所述模拟运行环境中的模拟应用接口执行所述***调用命令获得***调用返回值;
基于预设模拟配置根据所述文件解析结果和所述***调用返回值执行所述文件读写命令获得文件读写返回值;
通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果。
2.根据权利要求1所述的方法,其特征在于,所述通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果包括:
根据所述Java层函数的命令获得所述Java层函数的名称信息;
通过所述模拟Java本地接口根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的名称信息执行所述Java层函数的命令获得所述Java层函数的模拟执行结果。
3.根据权利要求2所述的方法,其特征在于,所述模拟Java本地接口包括模拟Java结构对象;
所述通过所述模拟Java本地接口根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的名称信息执行所述Java层函数的命令获得所述Java层函数的模拟执行结果包括:
根据所述Java层函数的名称信息通过所述模拟Java结构对象调用模拟Java层函数;
根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和执行所述模拟Java层函数获得所述Java层函数的模拟执行结果。
4.根据权利要求1所述的方法,其特征在于,所述Java层函数包括安卓类Java层函数;
所述通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果包括:
基于安卓模拟调用环境通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述安卓类Java层函数的命令获得所述安卓类Java层函数的模拟执行结果。
5.根据权利要求1所述的方法,其特征在于,所述安卓动态链接库还包括待调试文件;
所述方法还包括:根据所述待调试文件的信息、所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的模拟执行结果对所述待调试文件进行调试。
6.根据权利要求5所述的方法,其特征在于,所述待调试文件包括待调试函数的命令;
所述根据所述待调试文件的信息、所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的模拟执行结果对所述待调试文件进行调试包括:
根据所述文件解析结果、所述***调用返回值、所述文件读写返回值和所述Java层函数的模拟执行结果获取函数执行环境信息;
根据所述待调试函数的信息和所述函数执行环境信息执行所述待调试函数的命令。
7.根据权利要求5所述的方法,其特征在于,所述待调试文件包括待调试地址;
所述基于预设模拟配置根据所述文件解析结果和所述***调用返回值执行所述文件读写命令获得文件读写返回值包括:
基于预设模拟配置根据所述待调试地址的信息、所述文件解析结果和所述***调用返回值执行文件读写命令获得读写执行环境信息;
输出所述读写执行环境信息。
8.一种安卓动态链接库的运行装置,其特征在于,包括:
模拟器模块,用于获取安卓动态链接库的信息,所述安卓动态链接库包括***调用命令、文件读写命令和Java层函数的命令;
所述模拟器模块,还用于基于模拟运行环境根据所述安卓动态链接库的信息解析所述安卓动态链接库获得文件解析结果;
***模块,用于根据所述文件解析结果通过所述模拟运行环境中的模拟应用接口执行所述***调用命令获得***调用返回值;
***模块,还用于基于预设模拟配置根据所述文件解析结果和所述***调用返回值执行所述文件读写命令获得文件读写返回值;
Java模块,用于通过模拟Java本地接口根据所述文件解析结果、所述***调用返回值和所述文件读写返回值执行所述Java层函数的命令获得所述Java层函数的模拟执行结果。
9.一种设备,包括:存储器、处理器及存储在所述存储器中并可在所述处理器中运行的可执行指令,其特征在于,所述处理器执行所述可执行指令时实现如权利要求1-7任一项所述的方法。
10.一种计算机可读存储介质,其上存储有计算机可执行指令,其特征在于,所述可执行指令被处理器执行时实现如权利要求1-7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010211148.5A CN111427782B (zh) | 2020-03-24 | 2020-03-24 | 安卓动态链接库的运行方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010211148.5A CN111427782B (zh) | 2020-03-24 | 2020-03-24 | 安卓动态链接库的运行方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111427782A CN111427782A (zh) | 2020-07-17 |
CN111427782B true CN111427782B (zh) | 2023-07-11 |
Family
ID=71548632
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010211148.5A Active CN111427782B (zh) | 2020-03-24 | 2020-03-24 | 安卓动态链接库的运行方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111427782B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112214266A (zh) * | 2020-10-12 | 2021-01-12 | 广州大学 | 欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备 |
CN113467861A (zh) * | 2021-07-16 | 2021-10-01 | 腾讯科技(深圳)有限公司 | 文件调用方法和装置、存储介质及电子设备 |
CN115951956B (zh) * | 2023-03-13 | 2023-06-06 | 中汽研软件测评(天津)有限公司 | 安卓动态链接库脱壳方法、设备和介质 |
CN116149800B (zh) * | 2023-04-18 | 2023-06-23 | 成都云祺科技有限公司 | Kvm虚拟机应用层无代理cdp方法、***及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7506321B1 (en) * | 2002-06-11 | 2009-03-17 | Unisys Corporation | Computer emulator employing direct execution of compiled functions |
JP2009252113A (ja) * | 2008-04-09 | 2009-10-29 | Canon Inc | 情報処理装置、その制御方法及びコンピュータプログラム |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9582623B2 (en) * | 2014-02-12 | 2017-02-28 | Synopsys, Inc. | Dynamically loaded system-level simulation |
TWI624783B (zh) * | 2015-09-17 | 2018-05-21 | 長茂科技股份有限公司 | 整合動態連結功能函式的行動裝置應用程式之建置系統及方法 |
CN106445630A (zh) * | 2016-08-10 | 2017-02-22 | 北京奇虎科技有限公司 | Android模拟器及实现Android模拟器的方法 |
US10310822B1 (en) * | 2017-11-30 | 2019-06-04 | Dspace Digital Signal Processing And Control Engineering Gmbh | Method and system for simulating a control program |
CN108021805A (zh) * | 2017-12-18 | 2018-05-11 | 上海众人网络安全技术有限公司 | 检测Android应用程序运行环境的方法、装置、设备及存储介质 |
-
2020
- 2020-03-24 CN CN202010211148.5A patent/CN111427782B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7506321B1 (en) * | 2002-06-11 | 2009-03-17 | Unisys Corporation | Computer emulator employing direct execution of compiled functions |
JP2009252113A (ja) * | 2008-04-09 | 2009-10-29 | Canon Inc | 情報処理装置、その制御方法及びコンピュータプログラム |
Also Published As
Publication number | Publication date |
---|---|
CN111427782A (zh) | 2020-07-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111427782B (zh) | 安卓动态链接库的运行方法、装置、设备及存储介质 | |
US11726799B2 (en) | Preventing framework conflicts for multi-OS applications | |
US7730492B1 (en) | Method and system for running multiple virtual machines in a single process | |
CN112948024B (zh) | 动态链接库的加载方法、装置、存储介质及电子设备 | |
CN111324396A (zh) | 一种区块链智能合约执行方法、装置及设备 | |
CN113961919B (zh) | 恶意软件检测方法和装置 | |
CN111984263B (zh) | 在第一***运行第二***应用的方法、装置、设备及介质 | |
CN110727476B (zh) | 一种授权配置文件的生成方法、装置、设备及存储介质 | |
CN114356779A (zh) | 编程语言调试方法、装置及终端设备 | |
CN107133169B (zh) | 应用测试包生成方法及生成装置 | |
CN112631661B (zh) | 程序安全管控方法、装置、设备及存储介质 | |
CN111385661B (zh) | 语音控制全屏播放的方法、装置、终端及存储介质 | |
CN112379967B (zh) | 模拟器检测方法、装置、设备及介质 | |
CN112256252A (zh) | 接口生成方法、装置、存储介质及电子设备 | |
CN109597662B (zh) | 移动终端中非公开库的调用方法、装置及电子设备 | |
CN113986744A (zh) | 一种分库分表组件的测试方法、装置及存储介质 | |
CN112491799A (zh) | 通信模块远程修复方法、装置、计算机设备和存储介质 | |
CN112068814A (zh) | 可执行文件的生成方法、装置、***及介质 | |
CN113778773B (zh) | Sim卡模拟方法、装置和电子设备 | |
CN111506301B (zh) | 绕过***限制反射调用的方法及相关设备 | |
CN111881015B (zh) | 应用测试方法与应用测试装置 | |
CN114513736B (zh) | 一种耳机的声学测试方法、设备、终端及存储介质 | |
CN117370140A (zh) | 应用接口检测方法、装置、电子设备及存储介质 | |
CN115688105A (zh) | 自动化堆内存池分析辅助的漏洞挖掘方法及装置 | |
CN115617675A (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 |