CN112860224A - 一种函数执行环境构建方法、装置、电子设备及存储介质 - Google Patents
一种函数执行环境构建方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN112860224A CN112860224A CN201911195297.0A CN201911195297A CN112860224A CN 112860224 A CN112860224 A CN 112860224A CN 201911195297 A CN201911195297 A CN 201911195297A CN 112860224 A CN112860224 A CN 112860224A
- Authority
- CN
- China
- Prior art keywords
- calling
- library file
- function
- execution
- target
- 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
- 238000010276 construction Methods 0.000 title claims description 26
- 230000006870 function Effects 0.000 claims abstract description 184
- 238000000034 method Methods 0.000 claims abstract description 113
- 230000008569 process Effects 0.000 claims abstract description 87
- 238000011161 development Methods 0.000 claims description 44
- 238000012545 processing Methods 0.000 claims description 13
- 238000013507 mapping Methods 0.000 claims description 6
- 238000004088 simulation Methods 0.000 abstract description 104
- 238000012795 verification Methods 0.000 description 10
- 238000004590 computer program Methods 0.000 description 3
- 230000001419 dependent effect Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000005034 decoration Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000011269 treatment regimen Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- 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/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- 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)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开提供了一种函数执行环境构建方法、装置、电子设备及存储介质,相比传统的在安卓系统环境下的漏洞发现方法来说,在模拟环境运行库文件可以在执行分析过程中方便的修改寄存器和内存参数,动态修改指令执行路径和动态添加执行指令,提高执行分析的效率。
Description
技术领域
本公开涉及软件技术领域,尤其涉及一种函数执行环境构建方法。
背景技术
近年来,手机应用产业急速发展,每年产量呈指数型增长,据统计,我国主要应用商店中的应用软件数量已累计超过1000万。手机应用在给大众生活带来方便的同时,也给不法分子提供了可乘之机。
目前来说,针对安卓系统应用进行漏洞发掘时,主要是在安卓系统环境下对库文件进行执行分析,这种执行分析需要多次运行库文件中相同的代码片段,且在安卓环境中,若需要执行时动态修改内存参数,添加执行指令,步骤十分繁琐,分析效率较低。
发明内容
针对上述技术问题,本公开实施例提供一种函数执行环境构建方法,技术方案如下:
根据本公开实施例的第一方面,提供一种函数执行环境构建方法,包括:
解析目标库文件以获取目标函数代码块,执行所述目标函数;
若接收到执行过程中产生的调用信号,则根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号所需的返回值,以继续本次模拟执行流程;
若接收到执行过程中产生的调用错误信息,则停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程;
若本次执行流程正常执行至结束,且执行过程未接收到调用错误信息,则判定所述目标函数的执行环境构建完成。
可选的,所述获取解析目标库文件以获取目标函数代码块,执行所述目标函数,包括:
根据预先编写的库文件解析逻辑对目标库文件进行解析,根据解析结果在所述目标库文件中提取出目标函数代码块,所述解析结果至少包括所述目标库文件的符号表和依赖树;
将所述目标函数代码块映射到内存中,通过读取所述内存对目标函数代码块进行执行。
可选的,所述执行所述目标函数后,还包括:
接收到执行过程中产生的对相关库文件的依赖信号后,在预先封装的库文件集合中查找本次依赖的库文件;
若查找到本次依赖的库文件,则加载并执行所述本次依赖的库文件,以继续目标函数的执行环境构建流程;
若未查找到本次依赖的库文件,则上报错误信息,以根据所述错误信息在预先封装的库文件集合中增加本次依赖的库文件。
可选的,所述根据所述调用信号的类型在对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号的返回值,包括:
判断本次调用信号的调用类型,若所述调用类型为系统调用,则继续判断本次系统调用为通用型系统调用或文件读写型系统调用;
在所述调用类型为通用型系统调用的情况下,在通用系统调用逻辑集合中获取并返回本次调用所需的调用结果,所述通用系统调用逻辑集合预先通过hook方式封装;
在所述调用类型为文件读写型系统调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的文件读写接口获取针对本次文件读写的实现逻辑,并基于所述实现逻辑返回所需的调用结果。
可选的,所述根据所述调用信号的类型在对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号的返回值,包括:
判断本次调用信号的调用类型,若所述调用类型为JNI调用,则继续判断本次JNI调用为签名验证调用或特定函数调用;
在所述调用类型为签名验证调用的情况下,通过hook方式返回预先获取的真实签名值;
在所述调用类型为特定函数调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的JNI接口获取针对本次特定函数调用的实现逻辑,并基于所述实现逻辑返回所需的调用结果。
可选的,所述接收到执行过程中产生的调用错误信息后,停止所述执行流程,解析所述调用错误信息并根据解析结果增加针对本次调用的实现逻辑,包括:
接收到执行过程中产生的调用错误信息后,停止所述执行流程,并解析所述调用错误信息;
在所述调用错误类型为文件读写型系统调用,且不存在对应文件读写型系统的实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特文件读写型调用的实现逻辑,并将所述实现逻辑通过Java开发工具的文件读写接口开放调用;
在所述调用错误类型为特定函数调用,且不存在对应本次特定函数调用的实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特定函数调用的实现逻辑,并将所述实现逻辑通过Java开发工具的JNI接口开放调用。
可选的,所述方法还包括:
利用Java开发工具中预定义的调试接口,通过hook方式在目标函数的关键代码段增加断点;
执行所述目标函数,在执行到断点处暂停时,获取工具内存中的目标函数运行数据,通过分析所述运行数据,实现对所述函数的调试。
根据本公开实施例的第二方面,提供一种函数执行环境构建装置,包括:
目标函数获取单元,被配置为解析目标库文件以获取目标函数代码块,执行所述目标函数;
调用实现单元,被配置为接收到执行过程中产生的调用信号后,根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号的返回值,以继续本次执行流程;
调用错误处理单元,被配置为接收到执行过程中产生的调用错误信息后,停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程
环境构建单元,被配置为确定本次执行流程正常执行至结束,且执行过程未接收到调用错误信息的情况下,判定所述目标函数的执行环境构建完成。
可选的,所述目标函数获取单元,具体用于:
根据预先编写的库文件解析逻辑对目标库文件进行解析,根据解析结果在所述目标库文件中提取出目标函数代码块,所述解析结果至少包括所述目标库文件的符号表和依赖树;
将所述目标函数代码块映射到工具的内存中,以通过读取所述内存对目标函数代码块进行执行。
可选的,所述函数执行环境构建装置,还包括:
依赖实现单元,被配置为接收到执行过程中产生的对相关库文件的依赖信号后,在预先封装的库文件集合中查找本次依赖的库文件;
若查找到本次依赖的库文件,则加载并执行所述本次依赖的库文件,以继续目标函数的执行环境构建流程;
若未查找到本次依赖的库文件,则上报错误信息,以根据所述错误信息在预先封装的库文件集合中增加本次依赖的库文件。
可选的,所述调用实现单元,具体用于:
判断本次调用信号的调用类型,若所述调用类型为系统调用,则继续判断本次系统调用为通用型系统调用或文件读写型系统调用;
在所述调用类型为通用型系统调用的情况下,在通用系统调用逻辑集合中获取并返回本次调用所需的调用结果,所述通用系统调用逻辑集合预先通过hook方式封装;
在所述调用类型为文件读写型系统调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的文件读写接口获取针对本次文件读写的实现逻辑,并基于所述实现逻辑返回所需的调用结果。
可选的,所述调用实现单元,具体用于:
判断本次调用信号的调用类型,若所述调用类型为JNI调用,则继续判断本次JNI调用为签名验证调用或特定函数调用;
在所述调用类型为签名验证调用的情况下,通过hook方式返回预先获取的真实签名值;
在所述调用类型为特定函数调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的JNI接口获取针对本次特定函数调用的实现逻辑,并基于所述实现逻辑返回所需的调用结果。
可选的,所述调用错误处理单元,具体用于:
接收到执行过程中产生的调用错误信息后,停止所述执行流程,并解析所述调用错误信息;
在所述调用错误类型为文件读写型系统调用,且不存在对应文件读写型系统的实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特文件读写型调用的实现逻辑,并将所述实现逻辑通过Java开发工具的文件读写接口开放调用;
在所述调用错误类型为特定函数调用,且不存在对应本次特定函数调用的实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特定函数调用的实现逻辑,并将所述实现逻辑通过Java开发工具的JNI接口开放调用。
可选的,所述装置还包括:
断点增加单元,被配置为利用Java开发工具中预定义的调试接口,通过hook方式在目标函数的关键代码段增加断点;
函数调试单元,被配置为执行所述目标函数,在执行到断点处暂停时,获取内存中的运行数据,通过分析所述运行数据实现对所述函数的调试。
根据本公开实施例的第三方面,提供一种电子设备,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如第一方面所述的函数执行环境构建方法。
根据本公开实施例的第四方面,提供一种存储介质,当所述存储介质中的指令由调试电子设备的处理器执行时,使得调试装置/电子设备/服务器能够执行如第一方面所述的函数执行环境构建方法。
本公开实施例提供了一种函数执行环境构建方法。相比传统的在安卓系统环境下的漏洞发现方法来说,在模拟环境运行库文件可以在执行分析过程中方便的修改寄存器和内存参数,动态修改指令执行路径和动态添加执行指令,提高执行分析的效率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开实施例。
此外,本公开实施例中的任一实施例并不需要达到上述的全部效果。
附图说明
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1是本公开一示例性实施例示出的函数模拟执行环境构建方法一种流程图;
图2是本公开一示例性实施例示出的解析目标库文件以获取目标函数代码块的一种流程图;
图3是本公开一示例性实施例示出的基于模拟实现逻辑处理调用信号的一种流程图;
图4是本公开一示例性实施例示出的基于模拟实现逻辑处理调用信号的另一种流程图;
图5是本公开一示例性实施例示出的库文件依赖信号处理方式的一种流程图;
图6是本公开一示例性实施例示出的模拟执行环境构建整体框架的一种示意图;
图7是本公开一示例性实施例示出的函数模拟执行环境构建装置一种示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
近年来,手机应用产业急速发展,每年产量呈指数型增长,据统计,我国主要应用商店中的APP应用已累计超过1000万。手机应用在给大众生活带来方便的同时,也给不法分子提供了可乘之机。
目前来说,针对安卓系统应用进行漏洞发掘时,主要是在安卓系统环境下对库文件进行执行分析,这种执行分析需要多次运行库文件中相同的代码片段,且在安卓环境中,若需要执行时动态修改内存参数,添加执行指令,步骤十分繁琐,分析效率较低。
针对以上问题,本公开提供了一种函数执行环境构建方法。相比传统的在安卓系统环境下的漏洞发现方法来说,在模拟环境运行库文件可以在执行分析过程中方便的修改寄存器和内存参数,动态修改指令执行路径和动态添加执行指令,提高执行分析的效率。
下面通过几个实施例说明函数模拟执行环境构建方法。首先参见图1,包括以下步骤:
S101,解析目标库文件以获取目标函数代码块;
S102,执行所述目标函数,如果接收到执行过程中产生的调用信号,则执行步骤S103,如果接收到执行过程中产生的调用错误信号,则执行步骤S105;
S103,根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号所需的返回值,以继续本次执行流程;
S104,若执行流程正常执行至结束,且执行过程未接收到调用错误信息,判定所述目标函数的模拟执行环境构建完成。
S105,停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新执行步骤S102;
对本实施例的步骤S101进行说明,在大部分安卓应用开发过程中,都会将应用中的函数使用C进行开发,并封装到库文件中供java调用,该库文件一般为后缀为.so的文件,也可称为so文件。构建模拟执行环境的过程,也就是使库文件中的各个函数能够脱离安卓环境,在模拟环境中顺利运行至结束的过程。
首先介绍本实施例中提到的模拟工具,一般情况下,应用软件在安卓环境下通过设备的arm CPU实现执行。因此,可使用相关的可模拟arm CPU执行的工具作为本实施例的模拟工具。举例说明:可使用unicorn框架作为模拟工具,实现库文件的模拟执行。
unicorn框架运行在x86linux环境中。由于库文件在正常情况下需通过安卓系统预先进行解析,未经解析的库文件无法定位其中的函数代码,即无法加载库文件中包含的任一函数。而模拟工具所在的x86linux环境不具备安卓系统解析库文件的功能。因此,在模拟工具加载目标函数之前,还需要额外对库文件进行解析。
具体而言,通过模拟工具解析目标库文件以获取目标函数代码块,参见图2,还可分为下列步骤:
S1011,根据预先编写的库文件解析逻辑对目标库文件进行解析,根据解析结果在所述目标库文件中提取出目标函数代码块,所述解析结果至少包括所述目标库文件的符号表和依赖树;
S1012,将所述目标函数代码块映射到模拟工具的模拟内存中,以使所述模拟工具通过读取所述模拟内存对目标函数代码块进行模拟执行。
其中,通过文件解析获得的符号表与依赖树可以对应定位库文件中包含的各个函数,并在定位到的各个函数中选择目标函数,将所述目标函数的代码块映射到模拟工具的模拟内存中。
可以知道,该模拟工具还包括模拟内存,一方面,目标函数的代码段被映射到模拟内存中,模拟工具可通过对模拟内存的读取对应执行目标函数;另一方面,在针对目标函数的模拟执行环境构建完成后,可通过读取模拟内存中的运行信息,对运行过程做出对应的分析调试,根据分析调试结果对应优化应用软件,或发掘应用运行中的漏洞。
对本实施例的步骤S102进行说明,模拟执行所述目标函数,如果接收到模拟执行过程中产生的调用信号,则执行步骤S103,如果接收到模拟执行过程中产生的调用错误信号,则执行步骤S105;
在对目标函数的模拟执行过程中,可能会遇到多次中断,中断通常是由目标函数代码段中包含对外调用代码所致。可以将中断视为目标函数在执行过程中产生的调用信号。
该调用信号可分为多种类型,在本实施例中,将调用信号分为SVC系统调用类型,和JNI调用类型。并针对不同的调用类型提供了对应的处理策略,使当次调用能够获取正确的返回值,以继续本次目标函数的模拟执行流程。具体处理策略可详见下文。
不管采用哪种处理策略,通常都需要通过Hook的方式进行执行,Hook是一种替换“中断”的处理机制,在对特定的事件进行hook后,一旦发生已hook事件,对该事件进行hook的子程序就会收到通知,此时子程序就能在第一时间对该事件做出响应。
具体而言,应用程序可以在设置子程以监视指定窗口的某种消息,当消息到达后,在目标窗口处理函数之前处理它。Hook机制允许应用程序截获处理window消息或特定事件。
Hook实际上是一个处理消息的程序段,将其挂入目标函数中。每当特定消息发出,在没有到达目的窗口前,Hook函数就先捕获该消息,先得到控制权。这时Hook函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
对本实施例的步骤S103进行说明,在步骤S103中,根据所述调用信号的类型,通过对应的模拟实现接口获取针对本次调用的模拟实现逻辑,基于所述模拟实现逻辑获取所述调用信号所需的返回值,以继续本次模拟执行流程。
其中,模拟实现逻辑可分为通用模拟实现逻辑与非通用模拟实现逻辑,具体来说,通用模拟实现逻辑为预先封装在模拟工具中的模拟实现逻辑,如系统调用类模拟实现逻辑;非通用模拟实现逻辑为根据不同库文件的个性化模拟实现逻辑,一般地,非通用模拟实现逻辑可封装在Java层面,以函数形式存在。即通过Java开发工具执行该函数,获取针对调用信号的返回值。
对步骤S104和步骤S105进行说明,在针对目标函数的模拟执行过程中,若接收到调用错误信息,则说明该次调用无法模拟返回正确值。即不存在与该次调用对应的模拟实现逻辑。
即,目标函数中可能存在多次对外调用,在存在对应模拟实现逻辑的情况下,可顺利得到该次调用的返回值,自动继续向下执行;在不存在应模拟实现逻辑的情况下,将接收到报错信息。
接收到报错信息后,停止本次对目标函数的模拟执行流程,根据对报错信息的分析添加对应的模拟实现逻辑,并重新从步骤S102开始执行,直到该目标函数可以从开始正常执行到结束,不再产生报错信息,则说明本次针对目标函数的模拟执行环境已经构建完成。
如上文所述,本实施例将调用类型具体分为系统调用类型和JNI调用类型。下面对于这两种不同的调用类型,进行具体说明。
参见图3,上述根据所述调用信号的类型在对应的模拟实现接口获取针对本次调用的模拟实现逻辑,基于所述模拟实现逻辑获取所述调用信号的返回值,可包括以下步骤:
S301,确定本次调用类型为系统调用;
S302,继续判断本次系统调用为通用型系统调用或文件读写型系统调用;
S303,在所述调用类型为通用型系统调用的情况下,在通用系统调用逻辑集合中获取并返回本次调用所需的调用结果,所述通用系统调用逻辑集合预先通过hook方式封装在模拟工具中;
通用型系统调用就是调用操作系统自带的一些服务,比如获取当前的时间。由于当前为模拟执行,如果不做任何处理必然无法正确获取时间。
不管是获取进程号,还是获取当前时间等,大部分通用型系统调用本身不会对目标函数运行结果产生影响,因此将这些通用系统调用逻辑集合通过hook方式封装到模拟工具层面,在通用系统调用逻辑集合中获取并返回本次调用所需的调用结果。
S304,在所述调用类型为文件读写型系统调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的文件读写接口获取针对本次文件读写的模拟实现逻辑,并基于所述模拟实现逻辑返回所需的调用结果。
对于文件读写型系统调用,不同的应用app需要读写的文件大都不同,因此将这些该次调用暴露给java层,在java开发工具针对不同的目标函数单独添加其对应的模拟实现逻辑。
本实施例可以解决在模拟执行过程中遇到的各种类型的系统调用,避免系统造成的执行中断,完善目标函数的模拟执行环境。
参见图4,上述根据所述调用信号的类型在对应的模拟实现接口获取针对本次调用的模拟实现逻辑,基于所述模拟实现逻辑获取所述调用信号的返回值,还可包括以下步骤:
S401,确定本次调用类型为JNI调用;
S402,继续判断本次JNI调用为签名验证调用或特定函数调用;
S403,在所述调用类型为签名验证调用的情况下,通过hook方式返回预先获取的真实签名值;
具体地,java中签名验证的方式较为单一,当调用类型签名验证时,只需要预先获取并存储该应用APP的真实签名值,通过hook的方式将真实签名值直接返回为JNI调用结果,即可使目标函数继续执行,如此可以解决在模拟执行过程中遇到的JNI调用,完善目标函数的模拟执行环境。
S404,在所述调用类型为特定函数调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的JNI接口获取针对本次特定函数调用的模拟实现逻辑,并基于所述模拟实现逻辑返回所需的调用结果。
其余的JNI调用即是调用除签名以外的其他函数,且不同的应用app调用的函数大都不同,因此将这些该次调用暴露给java层,在java开发工具针对不同的目标函数单独添加其对应的模拟实现逻辑。
在本公开提出的其中一种实施例中,在构建模拟执行环境的过程中,还需针对模拟执行过程中产生的库文件依赖信号进行对应处理,参见图5,包括以下步骤:
S501,接收到模拟执行过程中产生的对相关库文件的依赖信号后,在模拟工具预先封装的库文件集合中查找本次依赖的库文件;
S502,判断是否查找到本次依赖的库文件,若找到本次依赖的库文件,则执行步骤S504,若没有找到本次依赖的库文件,则执行步骤S503;
S503,加载并模拟执行所述本次依赖的库文件,以继续目标函数的模拟执行环境构建流程;
S504,上报错误信息,以根据所述错误信息在预先封装的库文件集合中增加本次依赖的库文件。
当本次执行的目标函数依赖其他s库文件时,动态加载其他库文件并模拟执行,模拟工具预先封装可常用库文件集合,在遇到模拟工具不存在的库文件时,可以根据提示手动添加该库文件。
本实施例可以解决在模拟执行过程中遇到的对其他库文件的依赖调用,避免系统造成的执行中断,完善目标函数的模拟执行环境。
参加图6,为本公开提供的模拟执行环境构建的整体框架,其中,图中的UNICORN(1)为模拟工具;模拟内存(9)映射目标函数,供UNICORN(1)读取,Java开发接口(9)包括文件接口和JNI接口,用于向模拟工具提供上文所述的模拟实现函数。
其中,基于报错信息,在Java开发工具中添加对应的模拟实现函数,具体如下:
接收到模拟执行过程中产生的调用错误信息后,停止所述模拟执行流程,并解析所述调用错误信息;
在所述调用错误类型为文件读写型系统调用,且不存在对应文件读写型系统的模拟实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特文件读写型调用的模拟实现逻辑,并将所述模拟实现逻辑通过Java开发工具的文件读写接口开放给模拟工具调用;
在所述调用错误类型为特定函数调用,且不存在对应本次特定函数调用的模拟实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特定函数调用的模拟实现逻辑,并将所述模拟实现逻辑通过Java开发工具的JNI接口开放给模拟工具调用。
在针对目标函数的模拟执行环境构建完成后,可基于该模拟执行环境进行目标函数的调试,具体地,可利用Java开发工具中预定义的调试接口,通过hook方式在目标函数的关键代码段增加断点;模拟执行所述目标函数,在执行到断点处暂停时,获取模拟工具内存中的目标函数运行数据,通过分析所述运行数据,实现对所述函数的调试。
Java开发接口对外暴露调试功能可包括设置断点(利用unciron提供的地址hook实现),查看内存(直接读取底层虚拟内存中的数据),查看寄存器(直接读取底层unicorn中寄存器)等等。在调试过程中,可对目标函数的运行过程做出对应的分析,根据分析结果对应优化应用软件,或发掘应用运行中的漏洞。
相应于上述方法实施例,本公开实施例还提供一种函数模拟执行环境构建装置,参见图7所示,所述装置可以包括:目标函数获取单元710、模拟调用实现单元720、调用错误处理单元730和模拟环境构建单元740。
目标函数获取单元710,被配置为控制工具解析目标库文件以获取目标函数代码块,执行所述目标函数;
调用实现单元720,被配置为接收到执行过程中产生的调用信号后,根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号的返回值,以继续本次执行流程;
调用错误处理单元730,被配置为接收到执行过程中产生的调用错误信息后,停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程
环境构建单元740,被配置为确定本次执行流程正常执行至结束,且执行过程未接收到调用错误信息的情况下,判定所述目标函数的执行环境构建完成。
进一步地,所述目标函数获取单元,具体用于:
根据预先编写的库文件解析逻辑对目标库文件进行解析,根据解析结果在所述目标库文件中提取出目标函数代码块,所述解析结果至少包括所述目标库文件的符号表和依赖树;
将所述目标函数代码块映射到工具的内存中,以使所述工具通过读取所述内存对目标函数代码块进行执行。
进一步地,所述函数执行环境构建装置,还包括:
依赖实现单元,被配置为接收到执行过程中产生的对相关库文件的依赖信号后,在工具预先封装的库文件集合中查找本次依赖的库文件;
若查找到本次依赖的库文件,则加载并执行所述本次依赖的库文件,以继续目标函数的执行环境构建流程;
若未查找到本次依赖的库文件,则上报错误信息,以根据所述错误信息在预先封装的库文件集合中增加本次依赖的库文件。
进一步地,所述调用实现单元,具体用于:
判断本次调用信号的调用类型,若所述调用类型为系统调用,则继续判断本次系统调用为通用型系统调用或文件读写型系统调用;
在所述调用类型为通用型系统调用的情况下,在通用系统调用逻辑集合中获取并返回本次调用所需的调用结果,所述通用系统调用逻辑集合预先通过hook方式封装在工具中;
在所述调用类型为文件读写型系统调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的文件读写接口获取针对本次文件读写的实现逻辑,并基于所述实现逻辑返回所需的调用结果。
进一步地,所述调用实现单元,具体用于:
判断本次调用信号的调用类型,若所述调用类型为JNI调用,则继续判断本次JNI调用为签名验证调用或特定函数调用;
在所述调用类型为签名验证调用的情况下,通过hook方式返回预先获取的真实签名值;
在所述调用类型为特定函数调用的情况下,将本次调用信号上报给Java开发工具,通过java开发工具设置的JNI接口获取针对本次特定函数调用的实现逻辑,并基于所述实现逻辑返回所需的调用结果。
进一步地,所述调用错误处理单元,具体用于:
接收到执行过程中产生的调用错误信息后,停止所述执行流程,并解析所述调用错误信息;
在所述调用错误类型为文件读写型系统调用,且不存在对应文件读写型系统的实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特文件读写型调用的实现逻辑,并将所述实现逻辑通过Java开发工具的文件读写接口开放调用;
在所述调用错误类型为特定函数调用,且不存在对应本次特定函数调用的实现逻辑的情况下,基于报错信息在java开发工具中添加对应本次特定函数调用的实现逻辑,并将所述实现逻辑通过Java开发工具的JNI接口开放调用。
本公开实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现前述函数执行环境构建方法,所述方法包括:
解析目标库文件以获取目标函数代码块,执行所述目标函数;
若接收到执行过程中产生的调用信号,则根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号所需的返回值,以继续本次执行流程;
若接收到执行过程中产生的调用错误信息,则停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程;
若本次执行流程正常执行至结束,且执行过程未接收到调用错误信息,则判定所述目标函数的执行环境构建完成。
本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述的函数执行环境构建方法,所述方法包括:
工具解析目标库文件以获取目标函数代码块,执行所述目标函数;
若接收到执行过程中产生的调用信号,则根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号所需的返回值,以继续本次执行流程;
若接收到执行过程中产生的调用错误信息,则停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程;
若本次执行流程正常执行至结束,且执行过程未接收到调用错误信息,则判定所述目标函数的执行环境构建完成。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本公开方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
以上所述仅是本公开实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开实施例的保护范围。
Claims (10)
1.一种函数执行环境构建方法,其特征在于,包括:
解析目标库文件以获取目标函数代码块,执行所述目标函数;
若接收到执行过程中产生的调用信号,则根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号所需的返回值,以继续本次执行流程;
若接收到执行过程中产生的调用错误信息,则停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程;
若本次执行流程正常执行至结束,且执行过程未接收到调用错误信息,则判定所述目标函数的执行环境构建完成。
2.如权利要求1所述的函数执行环境构建方法,其特征在于,所述获取解析目标库文件以获取目标函数代码块,执行所述目标函数,包括:
根据预先编写的库文件解析逻辑对目标库文件进行解析,根据解析结果在所述目标库文件中提取出目标函数代码块,所述解析结果至少包括所述目标库文件的符号表和依赖树;
将所述目标函数代码块映射到内存中,通过读取所述内存对目标函数代码块进行执行。
3.如权利要求1所述的函数的执行环境构建方法,其特征在于,所述执行所述目标函数后,还包括:
接收到执行过程中产生的对相关库文件的依赖信号后,在预先封装的库文件集合中查找本次依赖的库文件;
若查找到本次依赖的库文件,则加载并执行所述本次依赖的库文件,以继续目标函数的执行环境构建流程;
若未查找到本次依赖的库文件,则上报错误信息,以根据所述错误信息在预先封装的库文件集合中增加本次依赖的库文件。
4.一种基于权利要求1所述的函数的执行环境的函数调试方法,其特征在于,所述方法还包括:
利用Java开发工具中预定义的调试接口,通过hook方式在目标函数的关键代码段增加断点;
执行所述目标函数,在执行到断点处暂停时,获取工具内存中的目标函数运行数据,通过分析所述运行数据,实现对所述函数的调试。
5.一种函数执行环境构建装置,其特征在于,包括:
目标函数获取单元,被配置为解析目标库文件以获取目标函数代码块,执行所述目标函数;
调用实现单元,被配置为接收到执行过程中产生的调用信号后,根据所述调用信号的类型,通过对应的实现接口获取针对本次调用的实现逻辑,基于所述实现逻辑获取所述调用信号的返回值,以继续本次执行流程;
调用错误处理单元,被配置为接收到执行过程中产生的调用错误信息后,停止本次执行流程,并根据所述调用错误信息,在执行环境中添加针对本次调用的实现逻辑,在添加完毕后重新开始本次执行流程
环境构建单元,被配置为确定本次执行流程正常执行至结束,且执行过程未接收到调用错误信息的情况下,判定所述目标函数的执行环境构建完成。
6.如权利要求5所述的函数执行环境构建装置,其特征在于,所述目标函数获取单元,具体用于:
根据预先编写的库文件解析逻辑对目标库文件进行解析,根据解析结果在所述目标库文件中提取出目标函数代码块,所述解析结果至少包括所述目标库文件的符号表和依赖树;
将所述目标函数代码块映射到工具的内存中,以通过读取所述内存对目标函数代码块进行执行。
7.如权利要求5所述的函数的执行环境构建装置,其特征在于,所述函数执行环境构建装置,还包括:
依赖实现单元,被配置为接收到执行过程中产生的对相关库文件的依赖信号后,在预先封装的库文件集合中查找本次依赖的库文件;
若查找到本次依赖的库文件,则加载并执行所述本次依赖的库文件,以继续目标函数的执行环境构建流程;
若未查找到本次依赖的库文件,则上报错误信息,以根据所述错误信息在预先封装的库文件集合中增加本次依赖的库文件。
8.一种基于权利要求5所述的函数的执行环境的函数调试装置,其特征在于,所述装置还包括:
断点增加单元,被配置为利用Java开发工具中预定义的调试接口,通过hook方式在目标函数的关键代码段增加断点;
函数调试单元,被配置为执行所述目标函数,在执行到断点处暂停时,获取内存中的运行数据,通过分析所述运行数据实现对所述函数的调试。
9.一种电子设备,其特征在于,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如权利要求1至7中任一项所述的函数执行环境构建方法。
10.一种存储介质,当所述存储介质中的指令由调试电子设备的处理器执行时,使得调试装置/电子设备/服务器能够执行如权利要求1至7中任一项所述的函数执行环境构建方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911195297.0A CN112860224B (zh) | 2019-11-28 | 2019-11-28 | 一种函数执行环境构建方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911195297.0A CN112860224B (zh) | 2019-11-28 | 2019-11-28 | 一种函数执行环境构建方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112860224A true CN112860224A (zh) | 2021-05-28 |
CN112860224B CN112860224B (zh) | 2023-12-12 |
Family
ID=75995899
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911195297.0A Active CN112860224B (zh) | 2019-11-28 | 2019-11-28 | 一种函数执行环境构建方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112860224B (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101770551A (zh) * | 2008-12-30 | 2010-07-07 | 中国科学院软件研究所 | 一种基于硬件模拟器的处理隐藏进程的方法 |
CN103885814A (zh) * | 2014-03-20 | 2014-06-25 | 百度在线网络技术(北京)有限公司 | 在x86架构上运行ARM APK的模拟器装置和方法 |
CN106203120A (zh) * | 2016-07-15 | 2016-12-07 | 北京邮电大学 | 一种针对Android加固应用的多点Hook逆向方法 |
CN106650452A (zh) * | 2016-12-30 | 2017-05-10 | 北京工业大学 | 一种Android系统内置应用漏洞挖掘方法 |
CN106803028A (zh) * | 2017-01-18 | 2017-06-06 | 西安电子科技大学 | 一种防止安卓手机短信验证码被窃取的方法 |
CN108304230A (zh) * | 2018-02-01 | 2018-07-20 | 腾讯科技(深圳)有限公司 | 调整应用属性的实现方法、装置及可读存储介质 |
WO2018192025A1 (zh) * | 2017-04-19 | 2018-10-25 | 北京洋浦伟业科技发展有限公司 | 安卓平台上可执行程序的保护方法 |
CN108762815A (zh) * | 2018-05-16 | 2018-11-06 | 北京麟卓信息科技有限公司 | 一种基于非虚拟化体系架构的Android运行环境实现方法 |
CN108932406A (zh) * | 2017-05-18 | 2018-12-04 | 北京梆梆安全科技有限公司 | 虚拟化软件保护方法和装置 |
CN109522097A (zh) * | 2018-10-11 | 2019-03-26 | 天津大学 | 一种基于自适应随机测试的并发缺陷检测方法 |
US20190205543A1 (en) * | 2018-01-03 | 2019-07-04 | Beijing Jingdong Shangke Information Technology Co., Ltd. | System and method for java deserialization vulnerability detection |
-
2019
- 2019-11-28 CN CN201911195297.0A patent/CN112860224B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101770551A (zh) * | 2008-12-30 | 2010-07-07 | 中国科学院软件研究所 | 一种基于硬件模拟器的处理隐藏进程的方法 |
CN103885814A (zh) * | 2014-03-20 | 2014-06-25 | 百度在线网络技术(北京)有限公司 | 在x86架构上运行ARM APK的模拟器装置和方法 |
CN106203120A (zh) * | 2016-07-15 | 2016-12-07 | 北京邮电大学 | 一种针对Android加固应用的多点Hook逆向方法 |
CN106650452A (zh) * | 2016-12-30 | 2017-05-10 | 北京工业大学 | 一种Android系统内置应用漏洞挖掘方法 |
CN106803028A (zh) * | 2017-01-18 | 2017-06-06 | 西安电子科技大学 | 一种防止安卓手机短信验证码被窃取的方法 |
WO2018192025A1 (zh) * | 2017-04-19 | 2018-10-25 | 北京洋浦伟业科技发展有限公司 | 安卓平台上可执行程序的保护方法 |
CN108932406A (zh) * | 2017-05-18 | 2018-12-04 | 北京梆梆安全科技有限公司 | 虚拟化软件保护方法和装置 |
US20190205543A1 (en) * | 2018-01-03 | 2019-07-04 | Beijing Jingdong Shangke Information Technology Co., Ltd. | System and method for java deserialization vulnerability detection |
CN108304230A (zh) * | 2018-02-01 | 2018-07-20 | 腾讯科技(深圳)有限公司 | 调整应用属性的实现方法、装置及可读存储介质 |
CN108762815A (zh) * | 2018-05-16 | 2018-11-06 | 北京麟卓信息科技有限公司 | 一种基于非虚拟化体系架构的Android运行环境实现方法 |
CN109522097A (zh) * | 2018-10-11 | 2019-03-26 | 天津大学 | 一种基于自适应随机测试的并发缺陷检测方法 |
Non-Patent Citations (1)
Title |
---|
颜慧颖;周振吉;吴礼发;洪征;孙贺;: "基于符号执行的Android原生代码控制流图提取方法", 网络与信息安全学报, no. 07 * |
Also Published As
Publication number | Publication date |
---|---|
CN112860224B (zh) | 2023-12-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9256517B1 (en) | Display of aggregated stack traces in a source code viewer | |
CN110941528B (zh) | 一种基于故障的日志埋点设置方法、装置及系统 | |
CN111158741A (zh) | 监控业务模块对第三方类库依赖关系变化的方法及装置 | |
CN110716845A (zh) | 一种Android系统的日志信息读取的方法 | |
US20100077385A1 (en) | Debugger exception filtering with target-based rules | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 | |
CN107463485B (zh) | 基于方法栈的日志获取方法、装置和终端 | |
CN112905449B (zh) | 目标测试方法、装置、设备和存储介质 | |
CN110688198B (zh) | 系统调用方法、装置和电子设备 | |
CN115729724B (zh) | 故障注入方法、故障测试系统、电子设备及可读存储介质 | |
WO2017076244A1 (zh) | 一种动态修复应用程序的方法、装置及相关系统 | |
CN110471828B (zh) | 一种操作系统测试方法、装置及其设备 | |
CN115617668A (zh) | 一种兼容性测试方法、装置及设备 | |
CN112860224B (zh) | 一种函数执行环境构建方法、装置、电子设备及存储介质 | |
CN112631949B (zh) | 一种调试方法、装置、计算机设备及存储介质 | |
CN114691496A (zh) | 单元测试方法、装置、计算设备及介质 | |
US9483241B2 (en) | Method ranking based on code invocation | |
CN111045891B (zh) | 基于java多线程的监控方法、装置、设备以及存储介质 | |
JP2008090699A (ja) | トレースロギング方法、装置及びプログラム | |
CN111381836A (zh) | 应用程序部署环境的切换方法及装置 | |
CN115858012B (zh) | 程序变量配置方法、装置、电子设备及存储介质 | |
CN109308256A (zh) | 一种java程序动态分析方法、设备和存储介质 | |
CN113220334B (zh) | 程序故障定位方法、终端设备及计算机可读存储介质 | |
CN111625463B (zh) | 一种程序状态检测方法和装置 | |
CN112527660B (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 |