掌桥专利:专业的专利平台
掌桥专利
首页

欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备

文献发布时间:2023-06-19 09:32:16


欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备

【技术领域】

本发明涉及安卓加固逆向分析领域,尤其涉及一种欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备。

【背景技术】

DexHunter脱壳过程中所使用的location和fileName是其技术人员通过人工分析得到的,通过对每个加固服务的加固方式进行详细地分析和研究,选择固定的特征字符串作为脱壳开始的标志。采用这样的方法有一个明显的限制:如果加固厂商针对不同的App有不同特征的加固方法,那么DexHunter就不能再准确地定位出脱壳起点。

DexAuto的实验机型依旧是老旧的Android4.4版本而且并未开源,从实验结果上看只能关注到脱壳所消耗的时间,并未揭示脱壳后Dex的函数完整度,是否能够修复函数抽取型的加固还是有待考证的。

PackerGrind是取得了一定的效果,但是如果打包的应用程序将不同的代码加载到相同的内存中,并在不同的条件下执行它们,PackerGrind就因为缺乏语义信息从而无法判断哪些代码是真实的;由于DROIDUNPACK是建立在整个系统仿真之上的,因此,实施反仿真技术的检测将不可避免地破坏后续的分析。

但是这些工具们都无法分离自己的组件去解决更加细粒度的问题,比如DexAuto的模拟运行由于本身类加载器的生命周期限制,无法解决动态加载Dex的情况;如果某加固厂商使用无效类或垃圾类来检测是否被异常加载并直接退出杀死进程,那么DexAuto就无法应对这种情况。

可以发现,这些工具们要么是需要特殊场景下才能发挥作用,要么是没有考虑到函数抽取的情况。事实上加固情况复杂多变,时刻都在升级迭代。经我们深入研究发现它们均无法修复更深层次的函数抽取型保护,比如在解密函数调用后完成函数回填函数体本身的加固场景。

【发明内容】

有鉴于此,本发明实施例提供了一种欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备,用以获取多个脱壳点,根据需要构造欺骗调用链进行java方法在Native层调用,降低修改的成本。

一方面,本发明实施例提供了一种欺骗安卓脱壳方法,包括:

选择函数到达路径;

选择脱壳点;

构造虚拟的调用链对App内所有的函数进行调用;

App完成调用对Dex文件的解密。

可选地,选择函数到达路径具体包括:

对Quick code模式或者Interpreter模式进行选择并最终进入ExecuteSwitchImpl函数。

可选地,所述选择脱壳点具体包括:选择Execute函数、dexfile对象或ExecuteSwitchImpl作为脱壳点。

可选地,所述构造虚拟调用链对App内所有的函数进行调用具体包括:

对调用链入口进行设置;

进入Invoke函数并对Invoke函数中的参数进行构造,当主动调用链完成调用之后返回调用链入口;

进入EnterInterpreterFromInvoke函数并对EnterInterpreterFromInvoke函数进行构造,当执行完Excute之后保存结果寄存器的值并返回Invoke函数;

进入Excute函数进行构造,在调用完成之后返回寄存器并退回EnterInterpreterFromInvoke函数;

进入ExcuteSwitchImpl函数进行构造,在调用完成之后返回Execute函数;

调用解密方法,在解密完成后返回ExcuteSwitchImpl函数。

可选地,所述对调用链入口进行设置包括:构造必要参数与主动调用链标识。

另一方面,本发明实施例提供了一种欺骗调用链安卓脱壳装置,包括:

第一选择模块,用于选择函数到达路径;

第二选择模块,用于选择脱壳点;

构造模块,用于构造虚拟的调用链对App内所有的函数进行调用;

解密模块,用于App完成调用对Dex文件的解密。

可选地,第一选择模块具体用于:

对Quick code模式或者Interpreter模式进行选择并最终进入ExecuteSwitchImpl函数。

可选地,第二选择模块具体用于:

选择Execute函数、dexfile对象或ExecuteSwitchImpl作为脱壳点。

另一方面,本发明实施例提供了一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述欺骗调用链安卓脱壳方法。

另一方面,本发明实施例提供了一种计算机设备,包括存储器和处理器,所述存储器用于存储包括程序指定的信息,所述处理器用于控制程序指令的执行,其特征在于,所述程序指令被处理器加载并执行时实现上述欺骗调用链安卓脱壳方法的步骤。

本发明实施例提供的调用链安卓脱壳方法、装置、存储介质及计算机设备的技术方案中,选择函数到达路径,选择脱壳点,构造虚拟的调用链对App内所有的函数进行调用,App完成调用对Dex文件的解密实现了在复杂多变的源码环境下寻找到多个通用且更深层次的脱壳点,根据需要构造欺骗调用链进行java方法在Native层调用,降低了修改的成本。

【附图说明】

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。

图1为本发明一实施例提供的一种欺骗调用链安卓脱壳方法的流程图;

图2为本发明一实施例提供的选择脱壳点的流程图;

图3为本发明一实施例提供的构造虚拟的调用链对App内所有的函数进行调用的流程图;

图4为本发明一实施例提供的一种欺骗调用链安卓脱壳装置的结构图;

图5为本发明一实施例提供的一种计算机设备的示意图。

【具体实施方式】

为了更好的理解本发明的技术方案,下面结合附图对本发明实施例进行详细描述。

应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。

应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,甲和/或乙,可以表示:单独存在甲,同时存在甲和乙,单独存在乙这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。

图1为本发明一实施例提供的一种欺骗调用链安卓脱壳方法的流程图,如图1所示,该方法包括:

步骤101、选择函数到达路径。

步骤102、选择脱壳点。

步骤103、构造虚拟的调用链对App内所有的函数进行调用。

步骤104、App完成调用对Dex文件的解密。

本发明实施例提供的欺骗调用链安卓脱壳方法中,选择函数到达路径,选择脱壳点,构造虚拟的调用链对App内所有的函数进行调用,App完成调用对Dex文件的解密实现了在复杂多变的源码环境下寻找到多个通用且更深层次的脱壳点,根据需要构造欺骗调用链进行java方法在Native层调用,降低了修改的成本。

图2为本发明一实施例提供的选择脱壳点的流程图,如图2所示,该方法包括:

201、选择函数到达路径。

202、选择脱壳点。

本发明实施例中,选择脱壳点具体包括:选择Execute函数、dexfile对象或ExecuteSwitchImpl作为脱壳点。

本发明实施例中,Android 8.1.0版本中ART下Android执行Java的方法有两种,一个是Quick code模式,另一个则是Interpreter模式。这两种模式通过PerformCall函数中use_interpreter_entrypoint参数进行抉择,其值为true则进入Interpreter模式。Quickcode模式进入Interpreter模式需要通过art_quick_to_interpreter_bridge这个函数。使用哪种执行方法进行编译只会影响应用的运行速度,不会影响到执行程序时最终是否使用解释器。因此两种方法最终都会进入Execute函数,但是我们最终选择比它稍微晚一点进入的ExecuteSwitchImpl函数,在这里脱壳理论上可以比Execute函数执行路径程度更深。

Google在实现解释器实现的默认方式从Android7.0开始逐渐抛弃Goto跳转表,直到8.0版本以后已经看不到其踪影,开始令默认方式一直使用汇编解释器。Java方法和Native层有着很紧密的联系,其中比较重要的就是ArtMethod对象。对于有Artmethod对象的函数来说,源码中存在一个API(Application Programming Interface,缩写:API;又称为应用程序编程接口):getDexFile,可以获取到它所属的DexFile对象。这个DexFile对象,里面有Begin()方法和Size()方法,分别是获取在内存里对应的Dex文件的起始地址和文件大小。一个Java方法如果需要执行,它必须要经过解释器解释,在此过程中必经之路就是会进入解释器源码中的Execute函数。

如果加固厂商使用DexClassLoader加载壳的时候没有禁用dex2oat,那么只有初始化函数会运行在解释模式下。如果禁用了dex2oat,则初始化函数和其他函数都运行在解释模式下。因此类的初始化函数与加固厂商有无禁用dex2oat是没有关系的,它都会始终都运行在解释模式下,这么一来必然会进入ART解释器。由上文可知,类的初始化函数也会进入Execute函数。

脱壳点的选择也有好坏之分,好的脱壳点可以让所有加壳的App都进入脱壳流程当中,而坏的脱壳点只能满足部分加固厂商的。因为比如dex2oat这个流程也有dexfile对象出现,但是如果把这里当作通用的脱壳点,则这些禁用掉dex2oat流程的厂商的壳就会脱不下来。由于Execute是内联函数,很难以hook的形式修改Execute的逻辑的,所以这就是可以应对所有厂商的加固方案的最基础的条件。

在进入Execute之前是由EnterInterpreterFromInvoke函数完成对Execute函数的调用的,这个函数会在native stack上创建Java方法的Native部分的栈帧;然后,这个函数调用alloca方法在Native栈帧上额外分配出一块空间来存ShadowFrame栈帧。于是Java方法和栈帧就联系起来了:一个Java方法被解释器执行时,其所属解释器栈帧ShadowFrame是被包含在其Native栈帧里的。ShadowFrame栈帧是安卓源码当中比较常见的指针变量,因此我们可以由此栈帧追溯回原来的Java方法。在Android8.0版本以后Dex对象当中,我们就可以获取到一些非常关键的信息,如:Begin、Size等,如何得到Dex对象,找到源码中有dexfile对象的位置其实都可以当作“脱壳点”,作为一种可选方案可以通过零步直接法:参数当中出现、返回值当中出现、执行过程当中出现。作为一种可选方案,可以通过一步间接法:通过已有ArtMethod对象获取dexfile对象。作为一种可选方案,可以通过两步间接法:通过已有shadowframe获取ArtMethod,再获取dexfile对象。

本发明实施例中,ExecuteSwitchImpl函数这个脱壳点是Execute函数之后的Switch模式下的主要处理逻辑函数,这个点是我们选择的主要脱壳点。由于当函数进入这里时已经代表着解释器开始工作,函数也真正地在执行,因此就这个脱壳时机来说,执行的路径要比Execute函数更深。

本发明实施例提供的选择脱壳点的技术方案中,通过对函数到达路径与脱壳点的选择,实现了在复杂多变的源码环境下寻找到多个通用且更深层次的脱壳点,使得寻找脱壳点更加高效。

图3为本发明一实施例提供的构造虚拟的调用链对App内所有的函数进行调用的流程图,如图3所示,该方法包括:

301、对调用链入口进行设置。

本发明实施例中,对调用链入口进行设置包括:构造必要参数与主动调用链标识。

本发明实施例中,此步骤是构造虚拟的调用链来“欺骗”壳,App以为正常地在调用它的函数,我们就可以自然地让app完成调用前解密Dex文件的操作。JNI提供了一系列Java层函数与Native层函数交互的接口。当需要在Native层中的c/c++函数中调用位于Java层的函数时,需要先获取到该函数的method_id然后再通过诸如JNI中提供的CallObjectMethod函数来完成对Java层中函数的调用。我们关注到一个细节,这个method_id参数会在调用过程中转换成ArtMethod对象指针。进而层层递进地通过ArtMethod对象调用ArtMethod类中的Invoke函数完成对Java层中的函数的调用。由此,我们可以看到Invoke方法在JNI中扮演着重要枢纽的角色,也可以说是欺骗调用的入口方法。在源码中构造出定制的Invoke函数逻辑的方法已经渐渐清晰:首先在该函数中进行判断,当通过传递的参数发现是我们自己的调用方法时就进行ArtMethod的dump并直接返回。其次在我们自己的Invoke方法中设置好相关的参数,并调用artmethod->Invoke使其通过识别参数变成我们想要的加载所有类的调用逻辑。

这里我们需要构造必要的参数,比如self和shorty,分别代表当前线程和当前所调用方法的跟踪标号,因为在后续的执行流中需要它们两个保持有效,同时另外设置我们的主动调用链标识,为后续判断是否为进入调用链的函数提供必要的识别条件,在进行函数构造前的第一步都是需要判断欺骗调用链标识。最后调用ArtMethod的Invoke方法来开始“欺骗”调用

步骤302、进入Invoke函数并对Invoke函数中的参数进行构造,当主动调用链完成调用之后返回调用链入口。

本发明实施例中,RT的运行模式属于预先编译AOT(Ahead-Of-Time,简称AOT),在Apk安装的时候,每个Java方法都会由dex2oat编译成目标代码,而不再是虚拟机执行的字节码但同时Dex字节码仍然还在OAT过程里存在,所以ART的代码执行既支持QuickCompiledCode模式,也同时支持解释器模式以及JIT执行模式。Invoke可以进入OAT优化,Interpreter模式执行方法。如果当前是Interpreter模式,就调用art::interpreter::EnterInterpreterFromInvoke;如果是OAT模式,就调用art_quick_invoke_stub(简称,stub)。EnterInterpreterFromInvoke函数里会判断是Native还是解释器执行,而解释器又分为解释模式和quick模式。

从Android源码中LinkCode部分可以知道,无论一个类方法是通过解释器执行,还是直接以本地机器指令执行,均要通过ArtMethod类的成员函数GetEntryPointFromCompiledCode获得其Entry点,并且该Entry点不为NULL。不过,Invoke并没有直接在该点设置一个地址值,而是通过stub来间接调用。这是因为ART需要设置一些特殊的寄存器。

由于可以提前设置解释器运行在Swtich模式下,需要恢复的函数必然会在解释模式下执行,因此我们只关注这一部分区域。主动调用链的加深构造首先一定要把握好一个重要原则——“不真实执行”,一些参数可以设置为空,但关键的参数还是得构造,比如我们将receiver参数的位置置空,由于其他位置需要有意义,所以都需要根据执行程度进行构造,例如self参数是currentThread、ArtMethod参数的位置是this以及参数个数的位置是args静态函数和args+1。而且在构造的同时,我们在函数的最前方加入了识别主动调用链到来的标志。

由于为了加深主动调用链,我们将继续进入解释模式下的EnterInterpreterFromInvoke函数,并且当主动调用链完成调用之后我们直接返回到调用链最初的入口中,不让它继续真实执行。若不想加深,则在Invoke函数直接根据ArtMethod的API——GetDexFile函数去回溯Dex文件并进行转储即可。

本发明实施例中,dex2oat为ART中对Dex文件的提前编译操作,结果是生成一个本地可执行的ELF文件,可以直接被本地处理器执行。

步骤303、进入EnterInterpreterFromInvoke函数并对EnterInterpreterFromInvoke函数进行构造,当执行完Excute之后保存结果寄存器的值并返回Invoke函数。

本发明实施例中,EnterInterpreterFromInvoke这个函数前面部分都在做参数压栈操作,最后几行才真正进入主题:①如果不是Native,那么调用Execute执行,Execute就是ART的解释器入口函数,Dex的字节码是通过ArtMethod::GetCodeItem函数获得,由Execute逐条执行。②Native函数则调用InterpreterJni。InterpreterJni通过GetEntryPointFromJni来获得native的函数的Entry点,跳转并执行。

在构造EnterInterpreterFromInvoke这个函数内部逻辑的时候,首先自定义传递的参数有一些是NULL或者因无法实际获取其真实的内容而随意构造的参数。因为不能让参数真正地解引用,即不能执行其中的SetVRegReference方法,所以我们选择使用SetVReg来替代。原理是源码在非解引用的情况中均使用SetVReg和SetVRegLong来进行参数的传递,而不去解引用我们构造的参数。前面也讲到,通过进入主动调用链而到达此处的函数并非Native函数且最终将会进入Execute,因此我们都需要保留Execute前的执行逻辑并保证它完整地执行完成。当执行完Execute之后保存结果寄存器的值,然后抛出栈帧打印Log并顺利返回欺骗调用链的Invoke。

步骤304、进入Excute函数进行构造,在调用完成之后返回寄存器并退回EnterInterpreterFromInvoke函数。

本发明实施例中,Execute函数中如果有即时编译(Just-In-Time,简称JIT),ART中JIT与AOT会配合使用,并且JIT编译出了对应method的quick code,那么选择通过ArtInterpreterToCompiledCodeBridge这个去执行对应的quick code。如果这些条件不满足,那么根据kInterpreterImplKind选择Mterp或者Switch类型的解释器实现来解释执行对应的Dalvik字节码。ART默认使用Mterp类型的解释器实现,所以大多数情况下会调用ExecuteMterpImpl()函数来解释执行Dalvik字节码。Mterp底层是由汇编语言编写,虽然执行效率很高,但是改动异常繁琐。因此在构造时选择解释器的类型为Swtich方式,原因是它的底层由C++代码实现,可读性高且可操作空间大。

构造时使用GetDexPC()获取初始时候的执行步数,我们选择在栈帧刚开始要执行指令的时候就跳转到ExecuteSwitchImpl里执行。ExecuteSwitchImpl是由Switch实现的解释器函数,C++实现的特性使得对它进行改动是非常方便的。当调用完成之后就返回我们欺骗调用链标识的寄存器,并退回到EnterInterpreterFromInvoke相应的位置。

步骤305、进入ExcuteSwitchImpl函数进行构造,在调用完成之后返回Execute函数。

本发明实施例中,Interpreter的工作目的就是将传进来的Java方法使用机器能理解的语言去解释将会执行的操作。Switch实现方式是通过计步器逐条执行指令。ExecuteSwitchImpl中首先通过GetDexPC()获取初始时候的执行步数;Instruction::At(insns+dex_pc)获得将要执行的指令语句;再根据指令选择将要执行的case条件;执行完相应操作之后通过Next_?xx函数跳转到下一次将要执行的指令,本次执行的指令占几个字节,?就为几;每次执行完一个循环,重新设置计步器。

这里构造时就需要分析一款App的加固思路,比如某加固下的函数刚进入壳代码时最先执行的是goto指令,随后是准备解密所需参数和使用invoke-static指令调用解密方法。由于很多加固厂商为了考虑提高效率,当真正调用一个函数的时候其CodeItem肯定是已经还原好了的,不会再将其加密回去。因此如果此时在invoke-static执行完后再对ArtMethod对象进行追溯Dex并转储,就可以将其内部所有函数体完整地保留下来。同时也考虑到如果某个Java方法转成汇编后第一条指令并非执行goto命令,那就意味着这个方法是没有执行壳逻辑的,可以直接转储下来并返回Execute。

步骤306、调用解密方法,在解密完成后返回ExcuteSwitchImpl函数。

本发明实施例中,Java方法转化成汇编语言后的每一种指令处理,都有一个PREAMBLE宏,即调用instrumentation的DexPcMovedEvent函数来实现前文所描述计步器相关的逻辑。我们在解释执行的时候,实际上是取出一条指令,通过opcode在Switch选项中找到对应的汇编实现,然后运行。大部分opcode中都会包含取出下一条指令、然后跳转执行的操作,并最终形成一个循环。然而,有一些带有特殊调用操作的opcode将会开启一种Java调用。这个Java调用就是DoInvoke函数来完成的,随后记录dex指令执行的位置并更新到shadow_frame中。Dolnvoke是一个模板函数,能处理invoke-directinvoke/static/super/

Virtual/interface等指令,事实上这就是从原Dex中的某个方法A去调用加固壳当中某个方法B的一个跳板。

这里使用前文的App加固思路来完成最终的欺骗调用链,从某一个函数转汇编后的goto命令之后我们进入invoke-static命令,并在这里调用DoInvoke函数去真正地执行解密操作的这个Java方法,并注释它原本取下一条指令的操作:将其执行流程中断在解密操作完成之后,不再继续令其执行后面的goto、nop或其他命令。调用解密方法后马上转储Java方法唯一对应ArtMethod的CodeItem并在完成后返回。这时候程序流程就会中断Switch返回到ExecuteSwitchImpl中,最后连续退回到最初传入调用链入口的位置等待下一个Java方法传递进来。

本发明实施例提供的构造虚拟的调用链对App内所有的函数进行调用的技术方案中,对调用链入口进行设置,进入Invoke函数并对Invoke函数中的参数进行构造,当主动调用链完成调用之后返回调用链入口,进入EnterInterpreterFromInvoke函数并对EnterInterpreterFromInvoke函数进行构造,当执行完Excute之后保存结果寄存器的值并返回Invoke函数,进入Excute函数进行构造,在调用完成之后返回寄存器并退回EnterInterpreterFromInvoke函数,进入ExcuteSwitchImpl函数进行构造,在调用完成之后返回Execute函数,调用解密方法,在解密完成后返回ExcuteSwitchImpl函数。实现了对不同加固方法的使用来实现在不同场景下的加固,对Java方法在Native层的调用加深。

本发明一实施例提供了一种欺骗调用链安卓脱壳装置,装置应用于计算机设备,图4为本发明一实施例提供的一种欺骗调用链安卓脱壳装置的结构示意图,如图4所示,该装置包括:第一选择模块11用于选择函数到达路径,第二选择模块12用于选择脱壳点,构造模块13用于构造虚拟的调用链对App内所有的函数进行调用,解密模块14用于App完成调用对Dex文件的解密。

本发明实施例中,第一选择模块11具体用于对Quick code模式或者Interpreter模式进行选择并最终进入ExecuteSwitchImpl函数。

本发明实施例中,第二选择模块12具体用于选择Execute函数、dexfile对象或ExecuteSwitchImpl作为脱壳点。

本实施例提供的欺骗调用链安卓脱壳装置可用于实现上述图1、图2和图3中的欺骗调用链安卓脱壳方法,具体描述可参见上述欺骗调用链安卓脱壳方法的实施例,此处不再重复描述。

本发明实施例提供的技术方案中,选择函数到达路径,选择脱壳点,构造虚拟的调用链对App内所有的函数进行调用,App完成调用对Dex文件的解密实现了在复杂多变的源码环境下寻找到多个通用且更深层次的脱壳点,根据需要构造欺骗调用链进行java方法在Native层调用,降低了修改的成本。

图5为本发明实施例提供的一种计算机设备的示意图。如图5所示,该实施例的计算机设备20包括:处理器21、存储器22以及存储在存储22中并可在处理器21上运行的计算机程序23,该计算机程序23被处理器21执行时实现实施例中的应用于欺骗调用链安卓脱壳方法,为避免重复,此处不一一赘述。或者,该计算机程序被处理器21执行时实现实施例中应用于欺骗调用链安卓脱壳装置中各模型/单元的功能,为避免重复,此处不一一赘述。

计算机设备20包括,但不仅限于,处理器21、存储器22。本领域技术人员可以理解,5仅仅是计算机设备20的示例,并不构成对计算机设备20的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如计算机设备还可以包括输入输出设备、网络接入设备、总线等。

所称处理器21可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

存储器22可以是计算机设备20的内部存储单元,例如计算机设备20的硬盘或内存。存储器22也可以是计算机设备20的外部存储设备,例如计算机设备20上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,存储器22还可以既包括计算机设备20的内部存储单元也包括外部存储设备。存储器22用于存储计算机程序以及计算机设备所需的其他程序和数据。存储器22还可以用于暂时地存储已经输出或者将要输出的数据。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机装置(可以是个人计算机,服务器,或者网络装置等)或处理器(Processor)执行本发明各个实施例方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

以上仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

相关技术
  • 欺骗调用链安卓脱壳方法、装置、存储介质及计算机设备
  • 一种安卓脱壳加速方法、装置、存储介质及计算机设备
技术分类

06120112204903