一种在安卓系统中的应用调试方法和应用调试装置转让专利

申请号 : CN201610424537.X

文献号 : CN106126415B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 桂敬文位广军陈鑫马家智王博通王晓卿李想想常磊张宇龙郭超秦松张治李新开唐友谊

申请人 : 百度在线网络技术(北京)有限公司

摘要 :

本发明提供了一种在安卓系统中的应用调试方法和应用调试装置,通过hook方式获取启动的应用的应用上下文;根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息,其中,所述代理应用已获取输入的待调试应用信息;若所述启动的应用为待调试应用,通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用;当所述调试器被附加至所述待调试应用时,调试所述待调试应用。能够打印指定的任意函数参数,并能够实现在任意指定函数的入口或者出口等待附加调试器,使得安卓系统应用调试和逆向分析更加高效。

权利要求 :

1.一种在安卓系统中的应用调试方法,其中,该应用调试方法包括以下步骤:通过hook方式获取启动的应用的应用上下文;

根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息,其中,所述代理应用已获取输入的待调试应用信息;

若所述启动的应用为待调试应用,通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用;

当所述调试器被附加至所述待调试应用时,调试所述待调试应用。

2.根据权利要求1所述的应用调试方法,其中,所述通过hook方式获取启动的应用的应用上下文的步骤包括:启动所述应用后加载与所述启动的应用对应的模块,所述模块通过hook所述启动的应用的方法获取所述启动的应用的应用上下文。

3.根据权利要求2所述的应用调试方法,其中,该应用调试方法包括:若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块修改flag标识,通过hook所述待调试应用的方法调试所述待调试应用,并打印所述待调试应用信息或者添加相应的动作。

4.根据权利要求1至3中任一项所述的应用调试方法,其中,所述待调试应用的方法满足以下条件:所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用。

5.根据权利要求1至3中任一项所述的应用调试方法,其中,所述代理应用获取输入的待调试应用信息的方式包括以下至少任一项:获取用户输入的待调试应用信息;

获取安卓调试桥所广播的待调试应用信息。

6.根据权利要求1至3中任一项所述的应用调试方法,其中,打印所述待调试应用信息的方法包括以下至少任一项:将所述待调试应用信息显示于调试界面;

将所述待调试应用信息以文档的形式存储。

7.根据权利要求1至3中任一项所述的应用调试方法,其中,所述待调试应用信息包括应用标识和以下至少任一项:要被打印参数的函数;

等待调试器的函数;

其中,所述应用标识包括以下至少任一项:应用进程名称;

应用名称;

应用包名。

8.根据权利要求1至3中任一项所述的应用调试方法,其中,所述应用调试方法未对所述安卓系统的安卓应用安装包作任何修改。

9.一种在安卓系统中的应用调试装置,其中,该应用调试装置包括:用于通过hook方式获取启动的应用的应用上下文的装置;

用于根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息的装置,其中,所述代理应用已获取输入的待调试应用信息;

用于若所述启动的应用为待调试应用,通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用的装置;

用于当所述调试器被附加至所述待调试应用时,调试所述待调试应用的装置。

10.根据权利要求9所述的应用调试装置,其中,所述用于通过hook方式获取启动的应用的应用上下文的装置用于:启动所述应用后加载与所述启动的应用对应的模块,所述模块通过hook所述启动的应用的方法获取所述启动的应用的应用上下文。

11.根据权利要求10所述的应用调试装置,其中,该应用调试装置用于:若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块修改flag标识,通过hook所述待调试应用的方法调试所述待调试应用,并打印所述待调试应用信息或者添加相应的动作。

12.根据权利要求9至11中任一项所述的应用调试装置,其中,所述待调试应用的方法满足以下条件:所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用。

13.根据权利要求9至11中任一项所述的应用调试装置,其中,所述代理应用获取输入的待调试应用信息的方式包括以下至少任一项:获取用户输入的待调试应用信息;

获取安卓调试桥所广播的待调试应用信息。

14.根据权利要求9至11中任一项所述的应用调试装置,其中,打印所述待调试应用信息的方法包括以下至少任一项:将所述待调试应用信息显示于调试界面;

将所述待调试应用信息以文档的形式存储。

15.根据权利要求9至11中任一项所述的应用调试装置,其中,所述待调试应用信息包括应用标识和以下至少任一项:要被打印参数的函数;

等待调试器的函数;

其中,所述应用标识包括以下至少任一项:应用进程名称;

应用名称;

应用ID。

16.根据权利要求9至11中任一项所述的应用调试装置,其中,所述安卓系统的安卓应用安装包未作任何修改。

说明书 :

一种在安卓系统中的应用调试方法和应用调试装置

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种在安卓系统中的应用调试技术。

背景技术

[0002] 现有技术中,在调试某一应用时,需要首先检查该应用是否能被调试,例如,通过打开安卓设备监视器或者通过检查安卓安装包(APK)文件中的AndroidManifest.xml文件来确定应用是否可以调试,如果该应用可以被调试,则把该应用解包,编辑AndroidManifest.xml文件,修改Manifest属性,然后增加debugable属性,使得debugable的属性为“true”,再重新打包创建APK文件。这种调试技术不能实现查看指定函数的参数和在任意指定函数的入口或者出口等待调试器,而且如果代码中有验证签名机制,会导致重新打包后的程序不能运行。
[0003] 因此,如何提供一种在安卓系统中既能实现查看指定函数的参数,又能在任意指定函数的入口或者出口等待调试器的应用调试技术,成为本领域技术人员亟需解决的问题之一。

发明内容

[0004] 本发明的目的是提供一种在安卓系统中的应用调试的方法和应用调试装置。
[0005] 根据本发明的一个方面,提供一种在安卓系统中的应用调试的方法,其中,该方法包括以下步骤:
[0006] 通过hook方式获取启动的应用的应用上下文;
[0007] 根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息,其中,所述代理应用已获取输入的待调试应用信息;
[0008] 若所述启动的应用为待调试应用,通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用;
[0009] 当所述调试器被附加至所述待调试应用时,调试所述待调试应用。
[0010] 优选地,所述通过hook方式获取启动的应用的应用上下文的步骤包括:
[0011] 启动所述应用后加载与所述启动的应用对应的模块,所述模块通过hook所述启动的应用的方法获取所述启动的应用的应用上下文。
[0012] 优选地,该应用调试方法包括:
[0013] 若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块修改flag标识,通过hook所述待调试应用的方法调试所述待调试应用,并打印所述待调试应用信息或者添加相应的动作。
[0014] 优选地,所述待调试应用的方法满足以下条件:
[0015] 所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用。
[0016] 优选地,所述代理应用获取输入的待调试应用信息的方式包括以下至少任一项:
[0017] 获取用户输入的待调试应用信息;
[0018] 获取安卓调试桥所广播的待调试应用信息。
[0019] 优选地,打印所述待调试应用信息的方法包括以下至少任一项:
[0020] 将所述待调试应用信息显示于调试界面;
[0021] 将所述待调试应用信息以文档的形式存储。
[0022] 优选地,所述待调试应用信息包括应用标识和以下至少任一项:
[0023] 要被打印参数的函数;
[0024] 等待调试器的函数;
[0025] 其中,所述应用标识包括以下至少任一项:
[0026] 应用进程名称;
[0027] 应用名称;
[0028] 应用包名。
[0029] 优选地,所述应用调试方法未对所述安卓系统的安卓应用安装包作任何修改。
[0030] 根据本发明的另一个方面,还提供了一种在安卓系统中的应用调试装置,其中,该装置包括以下装置:
[0031] 用于通过hook方式获取启动的应用的应用上下文的装置;
[0032] 用于根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息的装置,其中,所述代理应用已获取输入的待调试应用信息;
[0033] 用于若所述启动的应用为待调试应用,通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用的装置;
[0034] 用于当所述调试器被附加至所述待调试应用时,调试所述待调试应用的装置。
[0035] 优选地,所述用于通过hook方式获取启动的应用的应用上下文的装置用于:
[0036] 启动所述应用后加载与所述启动的应用对应的模块,所述模块通过hook所述启动的应用的方法获取所述启动的应用的应用上下文。
[0037] 优选地,该应用调试装置用于:
[0038] 若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块修改flag标识,通过hook所述待调试应用的方法调试所述待调试应用,并打印所述待调试应用信息或者添加相应的动作。
[0039] 优选地,所述待调试应用的方法满足以下条件:
[0040] 所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会调用。
[0041] 优选地,所述代理应用获取输入的待调试应用信息的方式包括以下至少任一项:
[0042] 获取用户输入的待调试应用信息;
[0043] 获取安卓调试桥所广播的待调试应用信息。
[0044] 优选地,打印所述待调试应用信息的方法包括以下至少任一项:
[0045] 将所述待调试应用信息显示于调试界面;
[0046] 将所述待调试应用信息以文档的形式存储。
[0047] 优选地,所述待调试应用信息包括应用标识和以下至少任一项:
[0048] 要被打印参数的函数;
[0049] 等待调试器的函数;
[0050] 其中,所述应用标识包括以下至少任一项:
[0051] 应用进程名称;
[0052] 应用名称;
[0053] 应用ID。
[0054] 优选地,所述安卓系统的安卓应用安装包未作任何修改。
[0055] 与现有技术相比,本发明具有以下优点:
[0056] 所述应用调试装置1在不对安卓系统的应用Android安装(apk)包做任何修改的情况下,通过hook方式获取启动的应用的应用上下文,根据该应用上下文查询所述启动的应用是否为待调试应用,以及要打印哪些函数的参数或者在哪些函数入口或者出口附加等待调试器等待调试应用信息,当待调试应用运行到被hook的函数时,打印参数,附加调试器进行调试。从而实现如下功能:调试所述待调试应用,打印指定的任意函数参数,并能够实现在任意指定函数的入口或者出口等待附加调试器,进入到待调试应用的内部,查看待调试应用内部实现的逻辑,获得有关待调试应用的关键信息或敏感算法,例如在加密前拦截数据流,获取加密密钥、密码以及其他敏感数据等,应用调试装置1使得安卓系统应用调试和逆向分析更加高效,节约开发人员的时间成本。

附图说明

[0057] 通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
[0058] 图1示出根据本发明一个方面的一种在安卓系统中的应用调试装置的结构示意图;
[0059] 图2示出根据本发明另一个方面的一种在安卓系统中的应用调试方法的流程示意图。
[0060] 附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

[0061] 在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
[0062] 在上下文中所称“计算机设备”,也称为“电脑”,是指可以通过运行预定程序或指令来执行数值计算和/或逻辑计算等预定处理过程的智能电子设备,其可以包括处理器与存储器,由处理器执行在存储器中预存的存续指令来执行预定处理过程,或是由ASIC、FPGA、DSP等硬件执行预定处理过程,或是由上述二者组合来实现。计算机设备包括但不限于服务器、个人电脑、笔记本电脑、平板电脑、智能手机等。
[0063] 所述计算机设备包括用户设备与网络设备。其中,所述用户设备包括但不限于电脑、智能手机、PDA等;所述网络设备包括但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(Cloud Computing)的由大量计算机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。其中,所述计算机设备可单独运行来实现本发明,也可接入网络并通过与网络中的其他计算机设备的交互操作来实现本发明。其中,所述计算机设备所处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络等。
[0064] 需要说明的是,所述用户设备、网络设备和网络等仅为举例,其他现有的或今后可能出现的计算机设备或网络如可适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。
[0065] 后面所讨论的方法(其中一些通过流程图示出)可以通过硬件、软件、固件、中间件、微代码、硬件描述语言或者其任意组合来实施。当用软件、固件、中间件或微代码来实施时,用以实施必要任务的程序代码或代码段可以被存储在机器或计算机可读介质(比如存储介质)中。(一个或多个)处理器可以实施必要的任务。
[0066] 这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本发明的示例性实施例的目的。但是本发明可以通过许多替换形式来具体实现,并且不应当被解释成仅仅受限于这里所阐述的实施例。
[0067] 应当理解的是,虽然在这里可能使用了术语“第一”、“第二”等等来描述各个单元,但是这些单元不应当受这些术语限制。使用这些术语仅仅是为了将一个单元与另一个单元进行区分。举例来说,在不背离示例性实施例的范围的情况下,第一单元可以被称为第二单元,并且类似地第二单元可以被称为第一单元。这里所使用的术语“和/或”包括其中一个或更多所列出的相关联项目的任意和所有组合。
[0068] 应当理解的是,当一个单元被称为“连接”或“耦合”到另一单元时,其可以直接连接或耦合到所述另一单元,或者可以存在中间单元。与此相对,当一个单元被称为“直接连接”或“直接耦合”到另一单元时,则不存在中间单元。应当按照类似的方式来解释被用于描述单元之间的关系的其他词语(例如“处于...之间”相比于“直接处于...之间”,“与...邻近”相比于“与...直接邻近”等等)。
[0069] 这里所使用的术语仅仅是为了描述具体实施例而不意图限制示例性实施例。除非上下文明确地另有所指,否则这里所使用的单数形式“一个”、“一项”还意图包括复数。还应当理解的是,这里所使用的术语“包括”和/或“包含”规定所陈述的特征、整数、步骤、操作、单元和/或组件的存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单元、组件和/或其组合。
[0070] 还应当提到的是,在一些替换实现方式中,所提到的功能/动作可以按照不同于附图中标示的顺序发生。举例来说,取决于所涉及的功能/动作,相继示出的两幅图实际上可以基本上同时执行或者有时可以按照相反的顺序来执行。
[0071] 下面结合附图对本发明作进一步详细描述。
[0072] 图1示出根据本发明一个方面的一种在安卓系统中的应用调试装置的结构示意图。应用调试装置1包括:1)用于通过hook方式获取启动的应用的应用上下文的装置,以下简称获取装置101;2)用于根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息的装置,其中,所述代理应用已获取输入的待调试应用信息,以下简称查询装置102;3)用于若所述启动的应用为待调试应用,通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用的装置,以下简称调试准备装置103;4)用于当所述调试器被附加至所述待调试应用时,调试所述待调试应用的装置,以下简称调试执行装置104。
[0073] 在此,应用调试装置1例如可以位于用户设备中。所述用户设备包括但不限于任何应用安卓系统的计算机设备,例如便携式电脑、平板电脑、智能手机、PDA等。本领域技术人员应能理解上述用户设备仅为举例,现有的或者今后可能出现的用户设备如可适用于本发明也应包含在本发明保护范围内,并以引用的方式包含于此。
[0074] 其中,获取装置101通过hook方式获取启动的应用的应用上下文。具体地,获取装置101通过hook方式,例如在安卓系统中安装hook框架,利用该hook框架hook启动的应用的方法获取启动的应用的应用上下文,其中,所述应用上下文描述的是一个应用程序环境的信息,是操作应用相关数据的基础条件,通过应用上下文可以获取应用程序的资源和类以及该应用程序相关的其他信息,也包括一些应用级别操作,可以通过应用上下文判断与其对应的应用是否为待调试应用。例如,若开发人员要调试安卓系统中的应用,首先获取安卓系统的root权限,某一应用启动时,安卓系统通过hook框架hook该启动的应用的方法,获取装置101通过该方法的this指针获取启动的所述应用的应用上下文,以便根据所述应用上下文查询所述应用是否为待调试的应用。
[0075] 在此,应用调试装置1使用hook的方式获取启动的应用的应用上下文,欺骗安卓系统,让安卓系统以为所述启动的应用是可以调试的,从而可以保证调试的正常进行。
[0076] 本领域技术人员应能理解,hook框架仅为hook方式的一种举例,现有的或者今后可能出现其他hook方式,如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0077] 查询装置102根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息,其中,所述代理应用已获取输入的待调试应用信息。具体地,查询装置102根据所述应用上下文例如从代理应用的内容提供器(ContentProvider)查询到所述启动的应用是否为待调试应用,并获取待调试应用信息。在此,该代理应用为该用户设备中所实现的一个应用,其用于获取输入的待调试应用信息,并在当应用调试装置1向其请求时,为其提供该待调试应用信息。其中,所述代理应用获取输入的待调试应用信息的方式包括但不限于:1)获取用户输入的待调试应用信息,例如用户通过某一输入接口手动输入待调试信息,或者,用户通过添加存储有待调试应用信息的文档的方式输入待调试应用信息,该代理应用读取该文档从而获取该待调试应用信息;2)获取安卓调试桥(Android Debug Bridge,ADB)所广播的待调试应用信息,例如安卓调试桥发送广播消息广播待调试应用信息,代理应用获取所述广播消息。例如,用户可以按照需求指定待调试应用信息的一部分:需要打印参数的函数,或者在哪个函数的入口或者出口等待附加调试器,然后将所述待调试应用信息提供给代理应用,代理应用通过上述方式获取所述待调试应用信息。
[0078] 例如,获取装置101通过hook框架hook应用Application类的onCreate方法,获取启动的应用的应用上下文,查询装置102根据所述应用上下文获取所述启动的应用的应用信息,将所述该启动的应用的信息与代理应用的ContentProvider中的待调试应用信息进行匹配,查询所述启动的应用是否为待调试应用,并通过查询获取所述已经被代理应用获取的待调试应用的应用信息。
[0079] 在此,查询装置102根据获取装置101获取到的所述应用上下文查询所述启动的应用是否为待调试应用,并查询待调试应用的具体信息,以便调试应用时正确地定位需要调试的函数和需要查看的函数参数。
[0080] 优选地,所述待调试应用信息包括应用标识和以下至少任一项:
[0081] 要被打印参数的函数;
[0082] 等待调试器的函数。
[0083] 具体地,当待调试应用信息包括要被打印参数的函数,该待调试应用信息用于定位待调试应用中需要被打印的函数,查询装置102可以根据所述待调试应用信息,查询得知待调试应用中哪些函数要被打印,以便在调试所述待调试应用时打印对应的函数的参数。
[0084] 当待调试应用信息包括等待调试器的函数,该待调试应用信息用于定位待调试应用中需要等待附加调试器的函数,查询装置102可以根据所述待调试应用信息,查询获知需要在所述待调试应用的哪些函数等待附加调试器进行调试,以便当所述待调试应用运行到该函数时附加调试器执行调试动作。
[0085] 其中,所述应用标识包括以下至少任一项:
[0086] 应用进程名称;
[0087] 应用名称;
[0088] 应用包名。
[0089] 在此,所述应用标识用于定位应用,标识所述待调试应用。
[0090] 在此,用户可以指定待调试应用信息中的具体信息,例如,指定任意函数的参数进行打印,或者指定任意函数的入口或者出口等待附加调试器。
[0091] 本领域技术人员应能理解上述待调试应用信息仅为举例,现有的或者今后可能出现的待调试应用信息如可适用于本发明,满足上述条件都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0092] 若所述启动的应用为待调试应用,调试准备装置103通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用。具体地,获取装置101通过hook方式获取启动的应用的应用上下文,然后查询装置102根据所述应用上下文,向已获取输入的待调试应用信息的代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息。若从代理应用的内容服务器(ContentProvider)查询得到所述启动的应用为待调试应用,调试准备装置103hook所述待调试应用的Process类的方法,例如start方法,hook将要被调试的函数,添加打印动作,打印所述待调试应用信息,例如打印被指定函数的参数,并添加等待调试器动作,为调试所述待调试应用做好执行调试准备,当所述待调试应用运行到hook的函数时,将调试器附加至所述待调试应用的对应函数。
[0093] 其中,所述待调试应用的方法满足以下条件:
[0094] 所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用。具体地,所述待调试应用的方法在满足上述条件时被hook才能调试所述待调试装置,例如Application类的OnCreate方法、Process类的start方法、ContextWrapper类的attachBaseContext方法等。
[0095] 在此,若所述启动的应用为待调试应用,调试准备装置103通过hook所述待调试应用的方法使得所述待调试应用能够被调试,能够使所述待调试应用在被指定的函数处等待调试器,也能够打印被指定函数的参数。
[0096] 本领域技术人员应能理解上述待调试应用的方法仅为举例,现有的或者今后可能出现的待调试应用的方式如可适用于本发明,满足上述条件都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0097] 优选地,获取装置101用于:启动所述应用后加载与所述启动的应用对应的模块,所述模块通过hook所述启动的应用的方法获取所述启动的应用的应用上下文。例如,某一应用启动时,安卓系统加载与所述启动的应用对应的某一模块A,其中,模块A可以是一个jar包,通过hook框架加载到所述安卓系统安装的应用进程中,实现大部分的hook逻辑,模块A例如通过hook框架hook该启动的应用中Application类的方法,例如onCreate方法,获取装置101通过该方法的this指针获取启动的所述应用的应用上下文,其中,所述模块A的功能是在被调试应用的被hook方法的开始和结束添加自己的代码逻辑,在每个应用加载的时候,模块A都会hook应用中Application类的方法,所述hook框架的作用是任意一个应用启动的时候都会加载该模块A。所述Application类的方法满足:所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用,而且越早被调用越好。
[0098] 本领域技术人员应能理解,上述Application类onCreate方法仅为举例,现有的或者今后可能出现的方法如可适用于本发明,都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0099] 优选地,若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块修改flag标识,通过hook所述待调试应用的方法调试所述待调试应用,并打印所述待调试应用信息或者添加相应的动作。具体地,若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块,如前述所例举的模块A,hook待调试应用的函数,hook住Process类的方法,例如start方法,修改其flag标识,增加debug属性,添加打印动作,并等待调试器被附加,当被调试应用运行到被hook的函数的时候,附加调试器进行调试。
[0100] 当所述调试器被附加至所述待调试应用时,调试执行装置104调试所述待调试应用。具体地,调试准备装置103通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用,当被调试应用运行到被hook的函数时,将调试器附加至所述待调试应用,开始执行调试。在此,当所述待调试应用附加有所述调试器之后,其继续运行。
[0101] 其中,打印所述待调试应用信息的方法包括以下至少任一项:将所述待调试应用信息显示于调试界面;将所述待调试应用信息以文档的形式存储。具体地,所述打印所述待调试应用信息的方法不限于传统意义上的将电子文档显示于纸质文档上的油墨打印方法,泛指能够将所述待调试应用信息,例如,函数的参数等信息,向开发者或者调试人员显示的行为,用于将所述函数的参数对开发人员或者调试人员来说可视化,方便开发人员对所述函数进行分析,例如,将所述待调试应用信息通过对应的接口调用至调试界面进行显示,或者将所述待调试应用信息存储为文档形式,便于查看和保存。
[0102] 本领域技术人员应能理解,上述打印所述待调试应用信息的方法仅为举例,现有的或者今后可能出现的打印所述待调试应用信息的方法,如可使用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0103] 其中,所述安卓系统的安卓应用安装包未作任何修改,但是能方便的对待调试应用进行调试,供开发人员或者调试人员在调试时研究和学习,使得所述待调试应用中的相关参数变得可视化,并能够自由转存,便于研究和查找。
[0104] 在此,所述应用调试装置1在不对安卓系统的应用Android安装(apk)包做任何修改的情况下,通过hook方式获取启动的应用的应用上下文,根据该应用上下文查询所述启动的应用是否为待调试应用,以及要打印哪些函数的参数,或者在哪些函数入口或者出口附加等待调试器等待调试应用信息,当待调试应用运行到被hook的函数时,打印参数,附加调试器进行调试。从而实现如下功能:调试所述待调试应用,打印指定的任意函数参数,并能够实现在任意指定函数的入口或者出口等待附加调试器,进入到待调试应用的内部,查看待调试应用内部实现的逻辑,获得有关待调试应用的关键信息或敏感算法,例如在加密前拦截数据流,获取加密密钥、密码以及其他敏感数据等,应用调试装置1使得安卓系统应用调试和逆向分析更加高效,节约开发人员的时间成本。
[0105] 以下用一实施例对上述装置的操作进行详细描述:
[0106] 例如,首先将安卓系统进行root,并且安装hook框架,开发人员通过直接在代理应用中输入或通过adb广播等方式输入被调试应用信息,例如,在哪里打印参数,在哪里等待附加调试器,代理应用获得该信息。当任意一个应用启动时,都会加载与启动的应用对应的模块,该模块在每个应用加载的时候,hook应用Appliocation类的onCreate方法,获取装置101通过该方法的this指针获取应用上下文(ApplicationContext),使用该应用上下文,查询装置102从代理应用的内容提供器(ContentProvider)获取该启动的应用是否为待调试应用,以及调试时哪些函数要被打印参数,哪些函数的入口或者出口附加等待调试器。如果从内容提供器查询得到该启动的应用为待调试应用,调试准备装置103hook住Process类的start方法,修改其flag标识,增加debug属性,hook将要被调试的函数,并且打印参数、等待附加调试器等,当被调试的应用运行到被hook的函数时,调试执行装置104附加调试器进行调试,其中所述安卓系统的安卓应用安装包未作任何修改。
[0107] 图2示出根据本发明一个方面的一种在安卓系统中的应用调试方法的流程示意图。
[0108] 在步骤S201中,应用调试装置1通过hook方式获取启动的应用的应用上下文。具体地,在步骤S201中,应用调试装置1通过hook方式,例如在安卓系统中安装hook框架,利用该hook框架hook启动的应用的方法获取启动的应用的应用上下文,其中,所述应用上下文描述的是一个应用程序环境的信息,是操作应用相关数据的基础条件,通过应用上下文可以获取应用程序的资源和类以及该应用程序相关的其他信息,也包括一些应用级别操作,可以通过应用上下文判断与其对应的应用是否为待调试应用。例如,若开发人员要调试安卓系统中的应用,首先获取安卓系统的root权限,某一应用启动时,安卓系统通过hook框架hook该启动的应用的方法,在步骤S201中,应用调试装置1通过该方法的this指针获取启动的所述应用的应用上下文,以便根据所述应用上下文查询所述应用是否为待调试的应用。
[0109] 在此,应用调试装置1使用hook的方式获取启动的应用的应用上下文,欺骗安卓系统,让安卓系统以为所述启动的应用是可以调试的,从而可以保证调试的正常进行。
[0110] 本领域技术人员应能理解,hook框架仅为hook方式的一种举例,现有的或者今后可能出现其他hook方式,如可适用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0111] 在步骤S202中,应用调试装置1根据所述应用上下文向代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息,其中,所述代理应用已获取输入的待调试应用信息。具体地,在步骤S202中,应用调试装置1根据所述应用上下文例如从代理应用的内容提供器(ContentProvider)查询到所述启动的应用是否为待调试应用,并获取待调试应用信息。在此,该代理应用为该用户设备中所实现的一个应用,其用于获取输入的待调试应用信息,并在当应用调试装置1向其请求时,为其提供该待调试应用信息。其中,所述代理应用获取输入的待调试应用信息的方式包括但不限于:1)获取用户输入的待调试应用信息,例如用户通过某一输入接口手动输入待调试信息,或者,用户通过添加存储有待调试应用信息的文档的方式输入待调试应用信息,该代理应用读取该文档从而获取该待调试应用信息;2)获取安卓调试桥(Android Debug Bridge,ADB)所广播的待调试应用信息,例如安卓调试桥发送广播消息广播待调试应用信息,代理应用获取所述广播消息。例如,用户可以按照需求指定待调试应用信息的一部分:需要打印参数的函数,或者在哪个函数的入口或者出口等待附加调试器,然后将所述待调试应用信息提供给代理应用,代理应用通过上述方式获取所述待调试应用信息。
[0112] 例如,在步骤S201中,应用调试装置1通过hook框架hook应用Application类的onCreate方法,获取启动的应用的应用上下文,在步骤S202中,应用调试装置1根据所述应用上下文获取所述启动的应用的应用信息,将所述该启动的应用的信息与代理应用的ContentProvider中的待调试应用信息进行匹配,查询所述启动的应用是否为待调试应用,并通过查询获取所述已经被代理应用获取的待调试应用的应用信息。
[0113] 在此,在步骤S202中,应用调试装置1根据获取到的所述应用上下文,查询所述启动的应用是否为待调试应用,并查询待调试应用的具体信息,以便调试应用时正确地定位需要调试的函数,以及需要查看的函数参数。
[0114] 优选地,所述待调试应用信息包括应用标识和以下至少任一项:
[0115] 要被打印参数的函数;
[0116] 等待调试器的函数。
[0117] 具体地,当待调试应用信息包括要被打印参数的函数,该待调试应用信息用于定位待调试应用中需要被打印的函数,在步骤S202中,应用调试装置1可以根据所述待调试应用信息,查询得知待调试应用中哪些函数要被打印,以便在调试所述待调试应用时打印对应的函数的参数。
[0118] 当待调试应用信息包括等待调试器的函数,该待调试应用信息用于定位待调试应用中需要等待附加调试器的函数,在步骤S202中,应用调试装置1可以根据所述待调试应用信息,查询获知需要在所述待调试应用的哪些函数等待附加调试器进行调试,以便当所述待调试应用运行到该函数时附加调试器执行调试动作。
[0119] 其中,所述应用标识包括以下至少任一项:
[0120] 应用进程名称;
[0121] 应用名称;
[0122] 应用包名。
[0123] 在此,所述应用标识用于定位应用,标识所述待调试应用。
[0124] 在此,用户可以指定待调试应用信息中的具体信息,例如,指定任意函数的参数进行打印,或者指定任意函数的入口或者出口等待附加调试器。
[0125] 本领域技术人员应能理解上述待调试应用信息仅为举例,现有的或者今后可能出现的待调试应用信息如可适用于本发明,满足上述条件都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0126] 若所述启动的应用为待调试应用,在步骤S203中,应用调试装置1通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用。具体地,在步骤S201中,应用调试装置1通过hook方式获取启动的应用的应用上下文,然后在步骤S202中,应用调试装置1根据所述应用上下文,向已获取输入的待调试应用信息的代理应用查询所述启动的应用是否为待调试应用,以及查询待调试应用信息。若从代理应用的内容服务器(ContentProvider)查询得到所述启动的应用为待调试应用,在步骤S203中,应用调试装置1hook所述待调试应用的Process类的方法,例如start方法,hook将要被调试的函数,添加打印动作,打印所述待调试应用信息,并添加等待调试器动作,为调试所述待调试应用做好执行调试准备,当所述待调试应用运行到hook的函数时,将调试器附加至所述待调试应用的对应函数。
[0127] 其中,所述待调试应用的方法满足以下条件:
[0128] 所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用。具体地,所述待调试应用的方法在满足上述条件时被hook才能调试所述待调试装置,例如Application类的OnCreate方法、Process类的start方法、ContextWrapper类的attachBaseContext方法等。
[0129] 在此,若所述启动的应用为待调试应用,在步骤S203中,应用调试装置1通过hook所述待调试应用的方法使得所述待调试应用能够被调试,能够使所述待调试应用在被指定的函数处等待调试器,也能够打印被指定函数的参数。
[0130] 本领域技术人员应能理解上述待调试应用的方法仅为举例,现有的或者今后可能出现的待调试应用的方式如可适用于本发明,满足上述条件都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0131] 优选地,在步骤S201中,应用调试装置1启动所述应用后加载与所述启动的应用对应的模块,所述模块通过hook所述启动的应用的方法获取所述启动的应用的应用上下文。例如,某一应用启动时,安卓系统加载与所述启动的应用对应的某一模块A,其中,模块A可以是一个jar包,通过hook框架加载到所述安卓系统安装的应用进程中,实现大部分的hook逻辑,模块A例如通过hook框架hook该启动的应用中Application类的方法,例如onCreate方法,在步骤S201中,应用调试装置1通过该方法的this指针获取启动的所述应用的应用上下文,其中,所述模块A的功能是在被调试应用的被hook方法的开始和结束添加自己的代码逻辑,在每个应用加载的时候,模块A都会hook应用中Application类的方法,所述hook框架的作用是任意一个应用启动的时候都会加载该模块A。所述Application类的方法满足:所述待调试应用的方法的返回值或者参数具有应用上下文,并且所述待调试应用的方法会被调用,而且越早被调用越好。
[0132] 本领域技术人员应能理解,上述Application类onCreate方法仅为举例,现有的或者今后可能出现的方法如可适用于本发明,都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0133] 优选地,若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块修改flag标识,通过hook所述待调试应用的方法调试所述待调试应用,并打印所述待调试应用信息或者添加相应的动作。具体地,若所述启动的应用为待调试应用,所述待调试应用中加载的所述模块,如前述所例举的模块A,hook待调试应用的函数,hook住Process类的方法,例如start方法,修改其flag标识,增加debug属性,添加打印动作,并等待调试器被附加,当被调试应用运行到被hook的函数的时候,附加调试器进行调试。
[0134] 当所述调试器被附加至所述待调试应用时,在步骤S204中,应用调试装置1调试所述待调试应用。具体地,在步骤S203中,应用调试装置1通过hook所述待调试应用的方法使得所述待调试应用能够被调试,打印所述待调试应用信息,并等待调试器被附加至所述待调试应用,当被调试应用运行到被hook的函数时,将调试器附加至所述待调试应用,开始执行调试。在此,当所述待调试应用附加有所述调试器之后,其继续运行。
[0135] 其中,打印所述待调试应用信息的方法包括以下至少任一项:将所述待调试应用信息显示于调试界面;将所述待调试应用信息以文档的形式存储。具体地,所述打印所述待调试应用信息的方法不限于传统意义上的将电子文档显示于纸质文档上的油墨打印方法,泛指能够将所述待调试应用信息,例如,函数的参数等信息,向开发者或者调试人员显示的行为,用于将所述函数的参数对开发人员或者调试人员来说可视化,方便开发人员对所述函数进行分析,例如,将所述待调试应用信息通过对应的接口调用至调试界面进行显示,或者将所述待调试应用信息存储为文档形式,便于查看和保存。
[0136] 本领域技术人员应能理解,上述打印所述待调试应用信息的方法仅为举例,现有的或者今后可能出现的打印所述待调试应用信息的方法,如可使用于本发明都应包含在本发明的保护范围内,并在此以引用的方式包含于此。
[0137] 其中,所述安卓系统的安卓应用安装包未作任何修改,但是能方便的对待调试应用进行调试,供开发人员或者调试人员在调试时研究和学习,使得所述待调试应用中的相关参数变得可视化,并能够自由转存,便于研究和查找。
[0138] 在此,所述应用调试装置1在不对安卓系统的应用Android安装(apk)包做任何修改的情况下,通过hook方式获取启动的应用的应用上下文,根据该应用上下文查询所述启动的应用是否为待调试应用,以及要打印哪些函数的参数,或者在哪些函数入口或者出口附加等待调试器等待调试应用信息,当待调试应用运行到被hook的函数时,打印参数,附加调试器进行调试。从而实现如下功能:调试所述待调试应用,打印指定的任意函数参数,并能够实现在任意指定函数的入口或者出口等待附加调试器,进入到待调试应用的内部,查看待调试应用内部实现的逻辑,获得有关待调试应用的关键信息或敏感算法,例如在加密前拦截数据流,获取加密密钥、密码以及其他敏感数据等,应用调试装置1使得安卓系统应用调试和逆向分析更加高效,节约开发人员的时间成本。
[0139] 以下用一实施例对上述应用调试装置的操作进行详细描述:
[0140] 例如,首先将安卓系统进行root,并且安装hook框架,开发人员通过直接在代理应用中输入或通过adb广播等方式输入被调试应用信息,例如,在哪里打印参数,在哪里等待附加调试器,代理应用获得该信息。当任意一个应用启动时,都会加载与启动的应用对应的模块,该模块在每个应用加载的时候,hook应用Appliocation类的onCreate方法,在步骤S201中,应用调试装置1通过该方法的this指针获取应用上下文(ApplicationContext),使用该应用上下文,在步骤S202中,应用调试装置1从代理应用的内容提供器(ContentProvider)获取该启动的应用是否为待调试应用,以及调试时哪些函数要被打印参数,哪些函数的入口或者出口附加等待调试器。如果从内容提供器查询得到该启动的应用为待调试应用,在步骤S203中,应用调试装置1hook住Process类的start方法,修改其flag标识,增加debug属性,hook将要被调试的函数,并且打印参数、等待附加调试器等,当被调试的应用运行到被hook的函数时,在步骤S204中,应用调试装置1附加调试器进行调试,其中所述安卓系统的安卓应用安装包未作任何修改。
[0141] 需要注意的是,本发明可在软件和/或软件与硬件的组合体中被实施,例如,本发明的各个装置可采用专用集成电路(ASIC)或任何其他类似硬件设备来实现。在一个实施例中,本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
[0142] 对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。