CN115114610A - 一种基于安卓系统通过Root调用服务的模块及方法 - Google Patents
一种基于安卓系统通过Root调用服务的模块及方法 Download PDFInfo
- Publication number
- CN115114610A CN115114610A CN202211044025.2A CN202211044025A CN115114610A CN 115114610 A CN115114610 A CN 115114610A CN 202211044025 A CN202211044025 A CN 202211044025A CN 115114610 A CN115114610 A CN 115114610A
- Authority
- CN
- China
- Prior art keywords
- program
- binder object
- binder
- application program
- remote
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/30—Authentication, i.e. establishing the identity or authorisation of security principals
- G06F21/44—Program or device authentication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/604—Tools and structures for managing or administering access control systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/629—Protecting access to data via a platform, e.g. using keys or access control rules to features or functions of an application
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/21—Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/2141—Access rights, e.g. capability lists, access control lists, access tables, access matrices
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- General Health & Medical Sciences (AREA)
- Bioethics (AREA)
- Health & Medical Sciences (AREA)
- Automation & Control Theory (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种基于安卓系统通过Root调用服务的模块及方法,包括执行特权操作的应用程序,和以Root用户身份运行的特权进程;应用程序包括Shell进程和ContentProvider单元;特权进程包括su程序、app_process程序和dex程序;应用程序配置为通过Shell进程调用su程序,建立链接;应用程序通过命令Shell进程执行特权进程的app_process程序;特权进程配置为进行初始化并创建远程Binder对象,将远程Binder对象通过应用程序注册的ContentProvider单元发送至应用程序。其具有授予撤销应用指定权限、静默安装应用、配置默认应用等功能。
Description
技术领域
本发明涉及通信数据处理技术领域,特别是涉及一种基于安卓系统通过Root调用服务的模块及方法。
背景技术
Android操作系统由于开放源代码、应用程序开发简单等原因,在工控设备中应用广泛,如:汽车中控、自助售货机、智能大屏等。软件厂商会寻找主板厂商采购搭载Android操作系统的主板,并将自研的软件搭载到主板中。
而由于工控设备的特性,软件厂商开发的应用程序多需要实现如:与各类硬件通信、静默安装软件、监控系统状态、控制设备网络、静默授予运行时权限、定制系统UI等功能。这显然是普通应用程序无法实现的。
针对上述问题,常见的解决方案有两个。
一是通过主板厂商定制安卓固件。主板厂商大多会提供一套通用的基础Android固件,软件厂商如需对固件定制,则需要向主板厂商提出需求并付出额外的金钱成本与时间周期,且最终输出到消费者端的产品多为软件厂商发行,而主板厂商修改系统的细节不受软件厂商管控,容易带来额外的产品质量问题与测试周期。
另一种方案是使用主板厂商提供的platform证书给软件包签名,该方法可以使应用程序以System用户身份调用系统接口,实现部分需求功能,如:静默安装软件。但由于权限身份单一,仅能实现部分需求,且需要依赖主板厂商提供的证书,签名产物也仅能运行在单一固件中,缺乏灵活性。
安卓操作系统的Root权限继承于Linux(Root,也称为根用户,是Unix(如Solaris、AIX、BSD)和类UNIX系统(如Linux、QNX等),及Android和iOS移动设备系统中的唯一的超级用户,因其可对根目录执行读写和执行操作而得名),其代表系统根账户的权限,对系统拥有完全的访问、修改能力,在提供Root权限的安卓设备中包含一个su程序,执行该程序可以打开一个Root身份的Shell进程。使用特权Shell进程可以轻易访问Linux命令,但难以利用特权通过Binder对象方式调用安卓系统服务或其他App。而通过service程序可以由命令行完成对安卓Service的调用,但命令行仅支持输入输出基本类型变量,无法传递复杂数据结构;且每一次调用会新开一个进程,消耗过多性能;标准输入输出流通过管道传输数据需要两次内存拷贝,而Binder对象仅需要一次。
Android Framework(安卓操作系统应用框架)通过Binder对象提供的服务来完成对系统调用,它们注册在ServiceManager(服务管理器)中,运行在SystemServer进程(进程名为system_server)中;应用程序日常所调用的系统API(应用程序编程接口)都是对这些服务的封装或代理。
发明内容
本发明为了克服上述现有技术存在的问题,提供一种基于安卓系统通过Root调用服务的模块及方法,该方法使应用程序通过su进程建立Root进程后,不仅限于调用Shell命令,还可以便捷地通过Binder对象调用系统服务。在安卓设备应用开发过程中,该方法可以在不定制系统的情况下调用系统来实现;其具有授予撤销应用指定权限、变更SystemUI、静默安装应用、配置默认应用、配置网络连接、安装系统更新等功能。
为了达到上述目的,本发明采用以下技术方案:
一种基于安卓系统通过Root调用服务的模块,包括执行特权操作的应用程序,和以Root用户身份运行的特权进程;其中:
所述应用程序包括Shell进程和ContentProvider单元;所述特权进程包括su程序、app_process程序和dex程序;
所述应用程序配置为通过Shell进程调用su程序,建立链接;所述应用程序通过命令Shell进程直接或间接执行特权进程的app_process程序,以运行dex程序初始化特权进程;
所述特权进程配置为进行初始化并创建远程Binder对象,且将远程Binder对象通过应用程序注册的ContentProvider单元发送至应用程序。
以上的,所述ContentProvider单元配置为用于接收来自特权进程发送的远程Binder对象。
优选地,所述ContentProvider单元使用应用程序包名和固定字符串组合而成的字符串作为authorities;覆写ContentProvider单元中的call方法,所述call方法的Bundle参数可以从中取出由特权进程发送的远程Binder对象。
以上的,应用程序配置为通过执行su程序,以获取特权Shell进程。
以上的,所述应用程序为本地需要特权执行的原Binder对象创建代理Binder对象,并将代理Binder对象配置为实际接口对象等待调用。
以上的,所述应用程序配置为调用代理Binder对象时,将调用参数与原Binder对象合并作为打包参数,对远程Binder对象发起调用,将远程Binder对象的执行结果返回给应用程序。
以上的,所述特权进程配置为进行初始化并创建远程Binder对象包括:远程Binder对象被代理Binder对象调用时,从打包参数中取出原参数与原Binder对象,再使用原参数对原Binder对象发起调用,将结果返回至代理Binder对象。
以上的,所述特权进程将远程Binder对象通过应用程序注册的ContentProvider单元发送至应用程序包括:特权进程通过使用应用程序包名和固定字符串组合而成的字符串作为authority;特权进程通过IActivityManager接口调用activity服务的getContentProviderExternal方法,使用authority作为String参数,以获取可调用到应用程序提供的ContentProvider单元的IContentProvider对象;将远程Binder对象装入Bundle参数调用IContentProvider对象中的call方法。
具体的,getContentProviderExternal方法获取到的为ContentProviderHolder对象,再从中取出名为provider的IContentProvider对象。
本发明还提供了一种基于安卓系统通过Root调用服务的方法,应用于如前述的一种基于安卓系统通过Root调用服务的模块,包括以下步骤:
S1:创建远程Binder对象并等待调用:使用Java语言编写dex程序,启动dex程序并创建远程Binder对象;所述远程Binder对象配置为处理应用程序发送的调用请求,并配置为常驻后台等待调用;当特权进程初始化完成后,将所述远程Binder对象通过ContentProvider发送给应用程序;
S2:创建子进程并启动dex程序:使用编程语言编写可执行程序,该可执行程序配置为运行后,调用fork函数并创建子进程;所述主进程退出,以使所述子进程脱离主进程运行;所述子进程启动后使用execvp函数调用app_process进程,以启动所述步骤S1创建的dex程序;
S3:建立应用程序与特权进程通信:在AndroidManifest.xml文件中注册ContentProvider,并创建对应的类,覆写ContentProvider中的call方法;所述call方法的Bundle参数配置为携带特权进程发送的Binder对象;
S4:发送可执行程序及dex程序:将可执行程序与dex程序发送至安卓操作系统的应用程序apk中,程序apk启动后将可执行程序、dex程序释放至程序所属cache目录;
S5:启动特权进程的Shell进程:应用程序启动后,使用Runtime.getRuntime().exec()函数调用su程序,启动Shell进程;
S6:添加执行权限:应用程序向特权进程的Shell进程写入命令,将释放得到的cache目录的两个文件复制到目标目录中,并使用chmod()函数给可执行程序添加执行权限;
S7:初始化特权进程:应用程序向特权进程的Shell进程写入命令执行可执行程序,并传入dex程序路径作为参数;可执行程序配置为使用app_process启动该参数指定的dex程序,完成特权进程初始化;
S8:发送远程Binder对象:所述特权进程启动后,创建步骤S1中所述远程Binder对象,并通过ContentProvider发送至应用程序;
S9:代理Binder对象转换为接口对象:应用程序收到远程Binder对象后,为本地每一个请求使用特权身份调用的原Binder对象创建代理Binder对象,将代理Binder对象使用原Binder对象对应接口的asInterface()函数转换为可调用的接口对象;
S10:发送打包参数:对接口对象进行调用时,触发代理Binder对象的onTransact方法,该方法将调用参数与原Binder对象组合为打包参数发送给特权进程;
S11:对原Binder对象发起调用:特权进程被调用时,代理Binder对象的onTransact方法被触发,从打包参数中分离出原Binder对象与调用参数,并使用调用参数对原Binder对象发起调用;
S12:返回执行结果:特权进程调用完毕后,执行结果依次返回到接口对象,特权调用完成。
具体的,在所述步骤S1中,dex程序是Android平台上(即安卓操作系统)可执行文件的类型。ContentProvider为数据提供者,其是安卓操作系统内应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法。ContentProvider是Android的四大组件之一,以标准化的方式在Android 应用间共享数据。ContentProvider封装的数据存储以及增删改查等,并且必须实现一个对外统一的接口。
以上的,在所述步骤S2中,所述编程语言为C语言或C++语言。
具体的,在所述步骤S2中,通过execvp函数将进程替换为app_process,来启动编写好的dex程序;dex程序为Java语言编写,通过调用安卓操作系统的Binder对象 API来与应用程序通信,代替应用程序完成特权工作。Binder对象同时提供了Java语言与C++语言的API,考虑Java编写比较简单,所以在该步骤采用了先使用C++语言编程以调用fork函数,创建子进程,再通过execvp函数调用app_process程序,来启动dex程序来执行Java语言代码的方式。
具体的,在所述步骤S3中,AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。
具体的,在所述步骤S3中,call方法具有四个参数类型,分别为(String,String,String,Bundle),其中,参数4的类型为Bundle,可存放Binder对象。特权进程可将远程Binder对象创建好后放入Bundle中,通过访问应用程序的ContentProvider的call方法,将Bundle传递到应用程序;应用程序的ContentProvider的call方法被调用后,从Bundle中取出远程Binder对象,即可建立与特权进程通信。
以上的,在所述步骤S6中,所述目标目录为/data/local/tmp目录。
以上的,在所述步骤S11中,实际调用过程发生在特权进程,其中UID=0,以使系统服务通过对调用者的权限进行检查。
具体的,在上述方法中,原Binder对象指的是应用程序本来需要调用的服务,以activity服务为例:Context.getSystemService("activity")返回一个ActivityManager对象,内部封装了对远程服务的实际调用,实际调用过程如下:
ServiceManager.getService("activity")
返回一个系统服务的Binder代理对象,调用activity服务实际为调用该Binder,该Binder即为原Binder。
IActivityManager.Stub.asInterface(原Binder)即可得到IActivityManager接口
应用程序直接调用原Binder,由于调用方是应用程序,系统服务通过Binder.getCallingUid()获取调用方UID为普通应用程序,会拒绝一些特权调用行为。
现创建一个代理Binder,该代理Binder将代替原Binder处理调用请求,并将所有调用与原Binder打包转发至远程Binder,由远程Binder来发起对原Binder的调用,再将调用结果返回。
IActivityManager.Stub.asInterface(代理Binder)即可得到代理过的IActivityManager接口
现调用该接口实为调用代理Binder,代理Binder转发请求至远程Binder,远程Binder实际执行调用。
系统服务通过Binder.getCallingUid()获取到的UID为实际调用方:特权进程(远程Binder所在)。获取到UID为0,即为Root用户,于是通过权限检查。
本发明的有益效果:
本发明提供一种基于安卓系统通过Root调用服务的模块及方法,该方法使应用程序通过su进程建立Root进程后,不仅限于调用Shell命令,还可以便捷地通过Binder对象调用系统服务。在安卓设备应用开发过程中,该方法可以在不定制系统的情况下调用系统来实现;硬件厂商仅需开放Root授权,应用程序即可利用Root权限来访问安卓系统中需要System权限或以上权限才能访问的服务,实现对系统行为的变更。其具有授予撤销应用指定权限、变更SystemUI、静默安装应用、配置默认应用、配置网络连接、安装系统更新等功能。
附图说明
图1为本发明提供的调用Binder对象服务的方法流程图;
图2为现有技术中应用程序常规调用服务的流程示意图;
图3为本发明提供的调用Binder对象服务的利用特权进程调用服务的流程示意图;
图4为本发明提供的调用Binder对象服务的模块结构示意图。
具体实施方式
下面结合附图对本发明的具体实施方式作进一步说明。
如图1所示,本实施例提供了一种基于安卓系统通过Root调用服务的方法,但由于直接调用系统服务的Binder对象的接口(如IActivityManager、IPackageManager等)与一些类(如ServiceManager等)没有包含在安卓SDK中,本方法中提到的程序需要在包含以上类的环境中通过编译,如安卓源码环境。 本方法的实现通过编译的过程采用了一个特殊的方法作为前置步骤:
在gradle项目中创建一个library模块,命名为hidden_api,将欲使用的且不存在安卓SDK中的类或接口在本模块中创建一个同名文件,并将需要调用的方法在文件中声明且空实现。
在需要调用hidden_api的模块的依赖清单中写入compileOnly project(path:‘hidden_api’),则开发过程中可完成调用非SDK API,且能通过编译。
具体的,在将需要调用的方法在文件中声明且空实现的过程中,调用的对象包括但不限于Binder对象。这是由于本发明实现过程需要直接对系统服务调用,而不是采用Context.getSystemService()返回的已封装的API。所用到的一些API部分不包含在Android SDK中,或者在其中但被标记为hide。但实际程序运行中这些类是包含在runtime中的。也就是说这些类在编译时缺少,但在运行时是可以调用的,所以需要一些手段解决编译时没有这些类的问题。因此,通过创建一个module称为hidden_api,将其设置为compileOnly。由于该模块只是为了通过编译期的依赖检查,并不需要打包到编译产物中(runtime中有这些类)。故将编译期缺少的类和方法写在该模块中,仅需声明无需实现。
在实施上述前置步骤后,本发明提供的一种基于安卓系统通过Root调用服务的方法,实施以下步骤:
S1:创建远程Binder对象并等待调用:使用Java语言编写dex程序,启动dex程序并创建远程Binder对象;所述远程Binder对象配置为处理应用程序发送的调用请求,并配置为常驻后台等待调用;当特权进程初始化完成后,将所述远程Binder对象通过ContentProvider发送给应用程序;
S2:创建子进程并启动dex程序:使用编程语言编写可执行程序,该可执行程序配置为运行后,调用fork函数并创建子进程;所述主进程退出,以使所述子进程脱离主进程运行;所述子进程启动后使用execvp函数调用app_process进程,以启动所述步骤S1创建的dex程序;
S3:建立应用程序与特权进程通信:在AndroidManifest.xml文件中注册ContentProvider,并创建对应的类,覆写ContentProvider中的call方法;所述call方法的Bundle参数配置为携带特权进程发送的Binder对象;
S4:发送可执行程序及dex程序:将可执行程序与dex程序发送至安卓操作系统的应用程序apk中,程序apk启动后将可执行程序、dex程序释放至程序所属cache目录;
S5:启动特权进程的Shell进程:应用程序启动后,使用Runtime.getRuntime().exec()函数调用su程序,启动Shell进程;
S6:添加执行权限:应用程序向特权进程的Shell进程写入命令,将释放得到的cache目录的两个文件复制到目标目录中,并使用chmod()函数给可执行程序添加执行权限;
S7:初始化特权进程:应用程序向特权进程的Shell进程写入命令执行可执行程序,并传入dex程序路径作为参数;可执行程序配置为使用app_process启动该参数指定的dex程序,完成特权进程初始化;
S8:发送远程Binder对象:所述特权进程启动后,创建步骤S1中所述远程Binder对象,并通过ContentProvider发送至应用程序;
S9:代理Binder对象转换为接口对象:应用程序收到远程Binder对象后,为本地每一个请求使用特权身份调用的原Binder对象创建代理Binder对象,将代理Binder对象使用原Binder对象对应接口的asInterface()函数转换为可调用的接口对象;
S10:发送打包参数:对接口对象进行调用时,触发代理Binder对象的onTransact方法,该方法将调用参数与原Binder对象组合为打包参数发送给特权进程;
S11:对原Binder对象发起调用:特权进程被调用时,代理Binder对象的onTransact方法被触发,从打包参数中分离出原Binder对象与调用参数,并使用调用参数对原Binder对象发起调用;
S12:返回执行结果:特权进程调用完毕后,执行结果依次返回到接口对象,特权调用完成。
具体的,在所述步骤S1中,dex程序是Android平台上(即安卓操作系统)可执行文件的类型。ContentProvider为数据提供者,其是安卓操作系统内应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法。ContentProvider是Android的四大组件之一,以标准化的方式在Android 应用间共享数据。ContentProvider封装的数据存储以及增删改查等,并且必须实现一个对外统一的接口。
在本实施例中,在所述步骤S2中,所述编程语言为C语言或C++语言。通过execvp函数将进程替换为app_process,来启动编写好的dex程序;dex程序为Java语言编写,通过调用安卓操作系统的Binder对象 API来与应用程序通信,代替应用程序完成特权工作。Binder对象同时提供了Java语言与C++语言的API,考虑Java编写比较简单,所以在该步骤采用了先使用C++语言编程以调用fork函数,创建子进程,再通过execvp函数调用app_process程序,来启动dex程序来执行Java语言代码的方式。
具体的,在所述步骤S3中,AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。在所述步骤S3中,call方法具有四个参数类型,分别为(String,String,String,Bundle),其中,参数4的类型为Bundle,可存放Binder对象。特权进程可将远程Binder对象创建好后放入Bundle中,通过访问应用程序的ContentProvider的call方法,将Bundle传递到应用程序;应用程序的ContentProvider的call方法被调用后,从Bundle中取出远程Binder对象,即可建立与特权进程通信。
在本实施例中,在所述步骤S6中,所述目标目录为/data/local/tmp目录。
在本实施例中,如图2~3所示,IActivityManager为例,图2为现有技术中,应用程序常规调用服务的流程图,图3为应用程序使用本方法利用特权进程调用服务的流程示意图。在所述步骤S11中,实际调用过程发生在特权进程,其中UID=0,以使系统服务通过对调用者的权限进行检查。在上述方法中,原Binder对象指的是应用程序本来需要调用的服务,以activity服务为例:Context.getSystemService("activity")返回一个ActivityManager对象,内部封装了对远程服务的实际调用,实际调用过程如下:
ServiceManager.getService("activity")
返回一个系统服务(本实施例中为IActivityManagerService)的Binder代理对象,调用activity服务实际为调用该Binder,该Binder即为原Binder。
IActivityManager.Stub.asInterface(原Binder)即可得到IActivityManager接口
应用程序直接调用原Binder,由于调用方是应用程序,系统服务通过Binder.getCallingUid()获取调用方UID为普通应用程序,会拒绝一些特权调用行为。
现创建一个代理Binder,该代理Binder将代替原Binder处理调用请求,并将所有调用与原Binder打包转发至远程Binder,由远程Binder来发起对原Binder的调用,再将调用结果返回。
IActivityManager.Stub.asInterface(代理Binder)即可得到代理过的IActivityManager接口
现调用该接口实为调用代理Binder,代理Binder转发请求至远程Binder,远程Binder实际执行调用。
系统服务通过Binder.getCallingUid()获取到的UID为实际调用方:特权进程(远程Binder所在)。获取到UID为0,即为Root用户,于是通过权限检查。
如图4所示,本实施例还提供了一种基于安卓系统通过Root调用服务的模块,该模块上应用前述的调用Binder对象服务的方法,所述模块包括执行特权操作的应用程序,和以Root用户身份运行的特权进程;其中:
所述应用程序包括Shell进程和ContentProvider单元;所述特权进程包括su程序、app_process程序和dex程序;
所述应用程序配置为通过Shell进程调用su程序,建立链接;所述应用程序通过命令Shell进程直接或间接执行特权进程的app_process程序,以运行dex程序初始化特权进程;
所述特权进程配置为进行初始化并创建远程Binder对象,且将远程Binder对象通过应用程序注册的ContentProvider单元发送至应用程序。
在本实施例中,所述ContentProvider单元配置为用于接收来自特权进程发送的远程Binder对象。所述ContentProvider单元使用应用程序包名和固定字符串组合而成的字符串作为authorities;覆写ContentProvider单元中的call方法,所述call方法的Bundle参数可以从中取出由特权进程发送的远程Binder对象。
在本实施例中,应用程序配置为通过执行su程序,以获取特权Shell进程。
在本实施例中,所述应用程序为本地需要特权执行的原Binder对象创建代理Binder对象,并将代理Binder对象配置为实际接口对象等待调用。所述应用程序配置为调用代理Binder对象时,将调用参数与原Binder对象合并作为打包参数,对远程Binder对象发起调用,将远程Binder对象的执行结果返回给应用程序。所述特权进程配置为进行初始化并创建远程Binder对象包括:远程Binder对象被代理Binder对象调用时,从打包参数中取出原参数与原Binder对象,再使用原参数对原Binder对象发起调用,将结果返回至代理Binder对象。
在本实施例中,所述特权进程将远程Binder对象通过应用程序注册的ContentProvider单元发送至应用程序包括:特权进程通过使用应用程序包名和固定字符串组合而成的字符串作为authority;特权进程通过IActivityManager接口调用activity服务的getContentProviderExternal方法,使用authority作为String参数,以获取可调用到应用程序提供的ContentProvider单元的IContentProvider对象;将远程Binder对象装入Bundle参数调用IContentProvider对象中的call方法。
基于本发明描述的方法,主板厂商仅需要将Android系统内置的Root权限开放给软件厂商,软件厂商就能在不修改固件的情况下以Root用户的身份调用系统服务,实现软件业务需求。
根据上述说明书的揭示和教导,本发明所属领域的技术人员还可以对上述实施方式进行变更和修改。因此,本发明并不局限于上面揭示和描述的具体实施方式,对发明的一些修改和变更也应当落入本发明的权利要求的保护范围内。此外,尽管本说明书中使用了一些特定的术语,但这些术语只是为了方便说明,并不对本发明构成任何限制。
Claims (10)
1.一种基于安卓系统通过Root调用服务的模块,其特征在于,包括执行特权操作的应用程序,和以Root用户身份运行的特权进程;其中:
所述应用程序包括Shell进程和ContentProvider单元;所述特权进程包括su程序、app_process程序和dex程序;
所述应用程序配置为通过Shell进程调用su程序,建立链接;所述应用程序通过命令Shell进程直接或间接执行特权进程的app_process程序,以运行dex程序初始化特权进程;
所述特权进程配置为进行初始化并创建远程Binder对象,且将远程Binder对象通过应用程序注册的ContentProvider单元发送至应用程序。
2.根据权利要求1所述的一种基于安卓系统通过Root调用服务的模块,其特征在于,所述ContentProvider单元配置为用于接收来自特权进程发送的远程Binder对象;
所述ContentProvider单元使用应用程序包名和固定字符串组合而成的字符串作为authorities;覆写ContentProvider单元中的call方法,所述call方法的Bundle参数从中取出由特权进程发送的远程Binder对象。
3.根据权利要求1所述的一种基于安卓系统通过Root调用服务的模块,其特征在于,应用程序配置为通过执行su程序,以获取特权Shell进程。
4.根据权利要求1所述的一种基于安卓系统通过Root调用服务的模块,其特征在于,所述应用程序为本地需要特权执行的原Binder对象创建代理Binder对象,并将代理Binder对象配置为实际接口对象等待调用。
5.根据权利要求1所述的一种基于安卓系统通过Root调用服务的模块,其特征在于,所述应用程序配置为调用代理Binder对象时,将调用参数与原Binder对象合并作为打包参数,对远程Binder对象发起调用,将远程Binder对象的执行结果返回给应用程序。
6.根据权利要求5所述的一种基于安卓系统通过Root调用服务的模块,其特征在于,所述特权进程配置为进行初始化并创建远程Binder对象包括:远程Binder对象被代理Binder对象调用时,从打包参数中取出原参数与原Binder对象,再使用原参数对原Binder对象发起调用,将结果返回至代理Binder对象。
7.根据权利要求1所述的一种基于安卓系统通过Root调用服务的模块,其特征在于,所述特权进程通过使用应用程序包名和固定字符串组合而成的字符串作为authority;特权进程通过IActivityManager接口调用activity服务的getContentProviderExternal方法,使用authority作为String参数,以获取可调用到应用程序提供的ContentProvider单元的IContentProvider对象;将远程Binder对象装入Bundle参数调用IContentProvider对象中的call方法。
8.一种基于安卓系统通过Root调用服务的方法,其特征在于,应用于如权利要求1~7任一项的所述一种基于安卓系统通过Root调用服务的模块,所述方法包括以下步骤:
S1:创建远程Binder对象并等待调用:使用Java语言编写dex程序,启动dex程序并创建远程Binder对象;所述远程Binder对象配置为处理应用程序发送的调用请求,并配置为常驻后台等待调用;当特权进程初始化完成后,将所述远程Binder对象通过ContentProvider发送给应用程序;
S2:创建子进程并启动dex程序:使用编程语言编写可执行程序,该可执行程序配置为运行后,调用fork函数并创建子进程;主进程退出,以使所述子进程脱离主进程运行;所述子进程启动后使用execvp函数调用app_process进程,以启动步骤S1创建的dex程序;
S3:建立应用程序与特权进程通信:在AndroidManifest.xml文件中注册ContentProvider,并创建对应的类,覆写ContentProvider中的call方法;所述call方法的Bundle参数配置为携带特权进程发送的Binder对象;
S4:发送可执行程序及dex程序:将可执行程序与dex程序发送至安卓操作系统的应用程序apk中,程序apk启动后将可执行程序、dex程序释放至程序所属cache目录;
S5:启动特权进程的Shell进程:应用程序启动后,使用Runtime.getRuntime().exec()函数调用su程序,启动Shell进程;
S6:添加执行权限:应用程序向特权进程的Shell进程写入命令,将释放得到的cache目录的两个文件复制到目标目录中,并使用chmod()函数给可执行程序添加执行权限;
S7:初始化特权进程:应用程序向特权进程的Shell进程写入命令执行可执行程序,并传入dex程序路径作为参数;可执行程序配置为使用app_process启动该参数指定的dex程序,完成特权进程初始化;
S8:发送远程Binder对象:所述特权进程启动后,创建步骤S1中所述远程Binder对象,并通过ContentProvider发送至应用程序;
S9:代理Binder对象转换为接口对象:应用程序收到远程Binder对象后,为本地每一个请求使用特权身份调用的原Binder对象创建代理Binder对象,将代理Binder对象使用原Binder对象对应接口的asInterface()函数转换为可调用的接口对象;
S10:发送打包参数:对接口对象进行调用时,触发代理Binder对象的onTransact方法,该方法将调用参数与原Binder对象组合为打包参数发送给特权进程;
S11:对原Binder对象发起调用:特权进程被调用时,代理Binder对象的onTransact方法被触发,从打包参数中分离出原Binder对象与调用参数,并使用调用参数对原Binder对象发起调用;
S12:返回执行结果:特权进程调用完毕后,执行结果依次返回到接口对象,特权调用完成。
9.根据权利要求8所述的一种基于安卓系统通过Root调用服务的方法,其特征在于,在步骤S2中,所述编程语言为C语言或C++语言。
10.根据权利要求8所述的一种基于安卓系统通过Root调用服务的方法,其特征在于,在步骤S3中,特权进程可将远程Binder对象创建好后放入Bundle中,通过访问应用程序的ContentProvider的call方法,将Bundle传递到应用程序;应用程序的ContentProvider的call方法被调用后,从Bundle中取出远程Binder对象,建立与特权进程通信。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211044025.2A CN115114610B (zh) | 2022-08-30 | 2022-08-30 | 一种基于安卓系统通过Root调用服务的模块及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211044025.2A CN115114610B (zh) | 2022-08-30 | 2022-08-30 | 一种基于安卓系统通过Root调用服务的模块及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115114610A true CN115114610A (zh) | 2022-09-27 |
CN115114610B CN115114610B (zh) | 2022-12-09 |
Family
ID=83335856
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211044025.2A Active CN115114610B (zh) | 2022-08-30 | 2022-08-30 | 一种基于安卓系统通过Root调用服务的模块及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115114610B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103646215A (zh) * | 2013-12-23 | 2014-03-19 | 北京奇虎科技有限公司 | 一种应用程序的安装控制方法、相关系统及装置 |
US20140137183A1 (en) * | 2012-11-13 | 2014-05-15 | Auckland Uniservices Ltd. | Security system and method for the android operating system |
CN106886715A (zh) * | 2015-12-15 | 2017-06-23 | 北京奇虎科技有限公司 | 权限请求响应方法及相应的装置 |
CN107068150A (zh) * | 2017-05-03 | 2017-08-18 | 安利军 | 一种Android智能语音控制方法及系统 |
-
2022
- 2022-08-30 CN CN202211044025.2A patent/CN115114610B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140137183A1 (en) * | 2012-11-13 | 2014-05-15 | Auckland Uniservices Ltd. | Security system and method for the android operating system |
CN103646215A (zh) * | 2013-12-23 | 2014-03-19 | 北京奇虎科技有限公司 | 一种应用程序的安装控制方法、相关系统及装置 |
CN106886715A (zh) * | 2015-12-15 | 2017-06-23 | 北京奇虎科技有限公司 | 权限请求响应方法及相应的装置 |
CN107068150A (zh) * | 2017-05-03 | 2017-08-18 | 安利军 | 一种Android智能语音控制方法及系统 |
Non-Patent Citations (1)
Title |
---|
MX东芝: "Android安全之使用root权限绕过检测机制,强行自动允许应用的悬浮窗/应用后台弹出界面等权限", 《HTTPS://BLOG.CSDN.NET/U014418171/ARTICLE/DETAILS/103868878》 * |
Also Published As
Publication number | Publication date |
---|---|
CN115114610B (zh) | 2022-12-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11354144B2 (en) | Java native interface and windows universal app hooking | |
Richter | CLR via C | |
US7725888B2 (en) | Systems and methods for dynamically linking application software into a running operating system kernel | |
KR101246967B1 (ko) | 어플리케이션 호스트 환경에서 유닛 테스트를 실행하기 위한 방법 및 장치 | |
US20080222160A1 (en) | Method and system for providing a program for execution without requiring installation | |
US20160232017A1 (en) | System and Method for Reloading Constructors | |
US7720671B2 (en) | Method and system for child-parent mechanism emulation via a general interface | |
JP2000517085A (ja) | 安全な装置アドレス指定のための装置および方法 | |
KR20020085872A (ko) | 객체지향 컴퓨터 프로그램의 번역 및 실행방법 | |
KR102023223B1 (ko) | 실행 중인 프로세스로의 동적 코드 주입 기법 | |
US6834391B2 (en) | Method and apparatus for automated native code isolation | |
CN112189187B (zh) | 统一平台的可扩展性 | |
CN106066803B (zh) | 应用程序运行控制的方法及装置 | |
CN111880987A (zh) | 应用程序的动态监测方法、装置、存储介质以及电子装置 | |
CN113688186B (zh) | 智能合约执行方法、引擎及区块链节点 | |
CN112416453B (zh) | 一种面向信创环境下国产化外部设备统一数据集成的方法和存储设备 | |
JP2004503866A (ja) | モジュラーコンピュータシステムおよび関連方法 | |
US20040172407A1 (en) | Method and system of processing an encapsulated file at a management computer | |
CN115114610B (zh) | 一种基于安卓系统通过Root调用服务的模块及方法 | |
CN112416418A (zh) | 应用组件的生成方法、装置、计算机设备和可读存储介质 | |
CN113168320A (zh) | 用类选择性替换遗留加载模块程序以在java虚拟机中执行 | |
CN115994004A (zh) | 一种应用程序接口调用方法及装置 | |
CN114416202B (zh) | 一种移动端sdk调用方法及系统 | |
Welch et al. | Dalang-A reflective extension for java | |
Brandt | Dynamic Adaptation of Mobile Code in Heterogeneous Environments |
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 |