首页> 中国专利> 应用程序启动鉴权方法及装置

应用程序启动鉴权方法及装置

摘要

本发明提供一种应用程序启动鉴权方法,该方法主要包括以下步骤:接收预设的后台服务发送的启动事件通知,所述启动事件通知基于后台服务拦截的应用程序的启动行为而生成;响应于该启动事件通知,启动锁定界面以接收用户的密码输入,对该应用程序的启动行为进行鉴权;依据鉴权结果通知所述后台服务放行或禁止启动该应用程序。此外还提供一种应用程序启动鉴权装置。本发明可以在应用程序自启动之前进行锁定,通过用户鉴权确定是否启动,解决锁定时画面闪现现象,避免CPU定时轮询造成的时间浪费,实现更好用户体验的程序锁功能。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-07-29

    专利权的转移 IPC(主分类):G06F21/51 专利号:ZL2015103828530 登记生效日:20220718 变更事项:专利权人 变更前权利人:北京奇虎科技有限公司 变更后权利人:北京奇虎科技有限公司 变更事项:地址 变更前权利人:100088 北京市西城区新街口外大街28号D座112室(德胜园区) 变更后权利人:100015 北京市朝阳区酒仙桥路6号院2号楼1至19层104号内8层801 变更事项:专利权人 变更前权利人:奇智软件(北京)有限公司 变更后权利人:

    专利申请权、专利权的转移

  • 2018-06-19

    授权

    授权

  • 2015-12-23

    实质审查的生效 IPC(主分类):G06F21/51 申请日:20150702

    实质审查的生效

  • 2015-11-25

    公开

    公开

说明书

技术领域

本发明涉及智能终端安全领域,具体而言,本发明涉及一种应用程序 启动鉴权方法及装置。

背景技术

随着智能终端技术的快速发展,各种功能的应用程序如雨后春笋般涌 现而出,占据着市场。不可否认多种多样的应用程序在生产生活的各个方 面不同程度满足着人们的需求,但同时也为用户的隐私保护带来了不小的 风险。

智能移动设备上的安全软件很多都提供软件锁功能以保护用户的隐 私信息,基本都是通过调用android的系统服务ActivityManagerService中 的接口getTasks(intmaxNum,intflags,IThumbnailReceiverreceiver)方法 查询当前屏幕最上方的画面是否属于指定的应用,如果是则直接显示一个 画面覆盖在屏幕最上方以达到锁定应用的目的。

现有技术在实现这个功能时,安全软件定时检查指定的应用程序的主 画面是否已经显示在屏幕最上方,一旦发现显示,安全软件就立即弹出画 面覆盖在屏幕上方,需要用户输入密码或通过其他手段获得授权才能进入 软件主画面。由于现有技术实现方式是定时轮询,一方面会无谓地浪费 CPU时间,另一方面是由于时间差导致的用户体验差和隐私泄露问题,因 为只有检测到了应用程序画面的相关数据,才弹出锁定画面,所以应用程 序启动和锁定画面的启动之间的时间差可能导致应用的主画面闪现一下 才被覆盖锁定。

发明内容

本发明的目的旨在解决上述至少一个问题,提供一种应用程序启动鉴 权方法及装置。

为了实现上述目的,本发明所述一种应用程序启动鉴权方法具体步骤 如下:接收预设的后台服务发送的启动事件通知,所述启动事件通知基于 后台服务拦截的应用程序的启动行为而生成;

响应于该安装事件通知,启动锁定界面以接收用户的密码输入指令, 对该应用程序的启动行为进行鉴权;

依据鉴权结果通知所述后台服务放行或禁止启动该应用程序。

具体的,所述后台服务运行于系统的framework层,将所述启动事件 通知发送到系统的App层。

具体的,所述后台服务将所述待启动应用程序的包名作为参数调用回 调函数以发送所述启动事件通知。

进一步的,启动锁定界面进行鉴权的步骤中,仅当接收到应用程序的 启动事件通知时显示所述锁定界面。

具体的,所述后台服务采用钩子函数对待启动应用程序的启动函数挂 钩以实现对其启动行为的拦截。

具体的,由所述后台服务根据其接收的放行或结束启动应用程序的通 知,允许或禁止活动管理服务执行对所述应用程序的启动操作。

进一步的,所述活动管理服务具体指执行应用程序启动操作的 ActivityManagerService。

具体的,所述锁定界面为接收到应用程序的启动事件通知时显示,并 提供密码输入框的用户交互界面。

进一步的,进行鉴权时,验证用户在锁定界面输入的密码以完成所述 对应用程序的鉴权。

具体的,当鉴权成功时,直接通知所述后台服务放行启动应用程序; 当鉴权失败时,显示告警信息以提示用户鉴权失败,禁止或暂停启动该应 用程序。

具体的,启动锁定界面进行鉴权之前,还包括以下步骤:

通过远程接口提交获取允许启动的应用程序包名列表的远程请求;

接收云端服务器反馈的允许启动的应用程序包名列表;

进一步的,还包括步骤:当待启动的应用程序存在于所述允许启动的 应用程序包名列表中时,直接通知所述后台服务放行启动该些应用程序。

具体的,启动锁定界面进行鉴权之前,查询存储于本地的允许启动的 应用程序包名列表,当待启动的应用程序存在于所述列表中时,直接通知 后台服务放行启动所述列表中的应用程序。

还提供一种应用程序启动鉴权装置,该装置包括以下单元:

接收单元:用于接收预设的后台服务发送的启动事件通知,所述启动 事件通知基于后台服务拦截的应用程序的启动行为而生成;

响应单元:响应于该安装事件通知,用于启动锁定界面以接收用户的 密码输入指令,对该应用程序的启动行为进行鉴权;

执行单元:用于依据鉴权结果通知所述后台服务放行或禁止启动该应 用程序。

具体的,所述后台服务运行于系统的framework层,将所述启动事件 通知发送到系统的App层。

具体的,所述后台服务将所述待启动应用程序的包名作为参数调用回 调函数以发送所述启动事件通知。

进一步的,所述响应单元中,仅当接收到应用程序的启动事件通知时 显示所述锁定界面。

具体的,所述后台服务采用钩子函数对待启动应用程序的启动函数挂 钩以实现对其启动行为的拦截。

具体的,由所述后台服务根据其接收的放行或结束启动应用程序的通 知,允许或禁止活动管理服务执行对所述应用程序的启动操作。

进一步的,所述活动管理服务具体指执行应用程序启动操作的 ActivityManagerService。

具体的,所述锁定界面为接收到应用程序的启动事件通知时显示,并 提供密码输入框的用户交互界面。

进一步的,所述响应单元鉴权时,验证用户在锁定界面输入的密码以 完成所述对应用程序的鉴权。

具体的,所述执行单元进一步被配置为:当鉴权成功时,直接通知所 述后台服务放行启动应用程序;当鉴权失败时,显示告警信息以提示用户 鉴权失败,禁止或暂停启动该应用程序。

具体的,还包括远程交互单元,被配置为执行如下功能:

通过远程接口提交获取允许启动的应用程序包名列表的远程请求;

接收云端服务器反馈的允许启动的应用程序包名列表;

进一步的,当待启动的应用程序存在于所述允许启动的应用程序包名 列表中时,直接通知所述后台服务放行启动该些应用程序。

具体的,所述响应单元被配置为在启动锁定界面进行鉴权之前,查询 存储于本地的允许启动的应用程序包名列表,当待启动的应用程序存在于 所述列表中时,直接通知后台服务放行启动所述列表中的应用程序。

相比现有技术,本发明的方案具有以下优点:

1、本发明在Android系统的Framework层的应用启动接口中加入钩 子函数,中断原来的直接启动过程,先回调安全软件的接口以发送应用程 序启动的通知事件,然后根据用户授权结果,确定是否继续执行应用程序 的启动流程。通过用钩子函数对应用程序启动的相关函数进行挂钩,并在 应用程序显示其主界面前启动锁定界面,从而可以解决应用程序启动界面 和锁定界面显示速度之间的时间差问题,使得锁定界面显示时无画面闪现 现象,提高用户体验度。同时,通过该锁定界面接收用户的授权指令,允 许启动获得启动权限的应用程序,从而避免用户的隐私泄露,实现更好用 户体验的程序锁功能;

2、本发明在应用程序启动主界面之前,对其启动行为进行拦截,并 显示锁定界面,以接收用户的密码输入指令,对应用程序的启动行为进行 鉴权。仅当拦截到应用程序的启动行为时才启动锁定界面,不同于现有技 术检测到应用程序界面相关数据时才弹出锁定界面。由此避免了CPU在 对应用程序界面相关数据进行检测时的定时轮询造成的资源浪费,使得智 能设备运行更加流畅。

本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面 的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描 述中将变得明显和容易理解,其中:

图1为本发明所述应用程序启动鉴权方法原理示意图;

图2为本发明所述应用程序启动鉴权装置原理框图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其 中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似 功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本 发明,而不能解释为对本发明的限制。

本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式 “一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是, 本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操 作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整 数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件 被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或 者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线 连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出 项的全部或任一单元和全部组合。

本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语 (包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员 的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术 语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除 非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。

本技术领域技术人员可以理解,这里所使用的“终端”、“终端设备”既 包括无线信号接收器的设备,其仅具备无发射能力的无线信号接收器的设 备,又包括接收和发射硬件的设备,其具有能够在双向通信链路上,执行 双向通信的接收和发射硬件的设备。这种设备可以包括:蜂窝或其他通信 设备,其具有单线路显示器或多线路显示器或没有多线路显示器的蜂窝或 其他通信设备;PCS(PersonalCommunicationsService,个人通信系统), 其可以组合语音、数据处理、传真和/或数据通信能力;PDA(Personal DigitalAssistant,个人数字助理),其可以包括射频接收器、寻呼机、互 联网/内联网访问、网络浏览器、记事本、日历和/或GPS(GlobalPositioning System,全球定位系统)接收器;常规膝上型和/或掌上型计算机或其他设 备,其具有和/或包括射频接收器的常规膝上型和/或掌上型计算机或其他 设备。这里所使用的“终端”、“终端设备”可以是便携式、可运输、安装在 交通工具(航空、海运和/或陆地)中的,或者适合于和/或配置为在本地 运行,和/或以分布形式,运行在地球和/或空间的任何其他位置运行。这 里所使用的“终端”、“终端设备”还可以是通信终端、上网终端、音乐/视频 播放终端,例如可以是PDA、MID(MobileInternetDevice,移动互联网设 备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视、机顶 盒等设备。

本技术领域技术人员可以理解,这里所使用的远端网络设备,其包括 但不限于计算机、网络主机、单个网络服务器、多个网络服务器集或多个 服务器构成的云。在此,云由基于云计算(CloudComputing)的大量计算 机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦 合的计算机集组成的一个超级虚拟计算机。本发明的实施例中,远端网络 设备、终端设备与WNS服务器之间可通过任何通信方式实现通信,包括 但不限于,基于3GPP、LTE、WIMAX的移动通信、基于TCP/IP、UDP 协议的计算机网络通信以及基于蓝牙、红外传输标准的近距无线传输方 式。

为了更好地阐述本发明所述的方法,以Android操作系统为例,对基 于Android系统的活动管理服务操作流程做简单介绍:

活动管理服务ActivityManagerService(简称AMS)是Android的系 统服务之一,也可以说是Android上层系统最核心的模块之一,其主要完 成管理应用进程的生命周期以及进程的Activity,Service,Broadcast和 Provider等主要功能。活动管理服务在系统启动阶段由系统服务 systemserver启动,它的构造以及运行都是在SystemServer当中进行。从 系统运行的角度看,AMS可以分为Client端和Service端:Client端运行 在各个app进程,app进程实现了具体的Activity,Service等,并且调用 系统接口来完成显示;Service端运行在SystemServer进程,是系统级别 的ActivityManagerService的具体实现,其响应Client端的系统调用请求, 并且管理Client端各个app进程的生命周期。在Client端,Application, Service和Activity都是Context的子类,Context理解为环境,也就是它能 够告诉系统当前运行的Activity,Service的情况,包括显示、进程等。 Context是一个abstract类,定义的方法具体实现在ContextImpl中, ContextWrapper作为Context的装饰类,里面的成员变量mBase指向 ContextImpl。

IActivityManager接口定义了app访问AMS的接口,主要是应用请求 AMS要完成某些操作,比如启动或结束Activity,启动、或暂停Service。 ActivityManagerService实现了IActivityManager中定义的接口,该类可以 说是AMS的核心,AMS的所有具体工作基本上都在该类中或者通过该类 控制,ActivityManagerService的实例在进程SystemServer刚启动时初始 化。IApplicationThread接口定义了AMS可以访问app的接口,AMS通过 这些接口控制app进程以及完成app的响应,ApplicationThread是 IApplicationThread接口的具体实现,ApplicationThread的实例是在app进 程启动时创建ActivityThread对象时初始化,ActivityThread的成员变量 mAppThread就是ApplicationThread对象。另外为了实现跨进程调用, ActivityManagerProxy和ApplicationThreadProxy分别实现了 IActivityManager和IApplicationThread接口,其作为各自的代理供client 和server使用。

AMS也是作为一个系统服务,通过ActivityManager定义了一些接口 可以供app使用,ActivityManager中访问AMS的接口都是通过 ApplicationThreadProxy实现的。

为了实施对系统的活动管理服务(AMS)的监控,本发明需要基于 Root权限(除非Root权限已开放)在系统的Framework层设置后台服务, 使得该后台服务基于Binder机制与系统实现通信。

众所周知,Root权限是指Unix类操作系统(包括Linux、Android) 的系统管理员权限,类似于Windows(视窗)系统中的Administrator(管 理员)权限;Root权限可以访问和修改用户的移动设备中几乎所有的文件 (Android系统文件及用户文件,不包括ROM)。鉴于此,业内提供了 多种多样的提权方案用于获取Android系统的Root权限,实现用户权限 提升,达致全面控制操作系统的目的。这些提权方案,依提权后权限作用 的生命周期来看,包括永久Root权限和临时Root权限,顾名思义,永久 Root权限情况下,应用程序一经Root授权,以后可不必再进行Root提权; 而临时Root权限情况下,权限作用的生命周期只是操作系统的一次从开 机到关机的过程,下次开机依然需要进行Root。

无论采用何种Root方式,提权的基本原理均是通过向系统植入用于 接收权限请求的su,再结合SuperUser.apk应用程序实现人机交互,通过 su与SuperUser.apk在运行时的相互配合,来实现有效的权限管理。本发 明获取Root权限以便于在系统的Framework层设置后台服务对应用程序 的安装行为进行监控,但采用何种Root方式不作为对本发明的限制。

基于上述原理,以Android系统为例,对本发明提供的一种应用程序 启动鉴权方法做详细说明,参考图1所示,具体步骤如下:

步骤S11:接收预设的后台服务发送的启动事件通知,所述启动事件 通知基于后台服务拦截的应用程序的启动行为而生成。

本实施例所称的后台服务,是指由以本方法所预先实现的一个程序模 块,运行于内存中,通过内存中的相应主进程实现如前所述的提权操作后, 向系统注册的一个通信服务进程。所述后台服务基于Android系统所提供 的Binder机制,向SystemManager注册,通过Android提供的固有的Binder 机制,在后台服务与其监听的活动管理服务(AMS)进程之间建立C/S架 构的沟通管道。具体而言,当获取到系统的Root权限后,为了便于后续 实现对系统中其它进程的监听以及相关操作功能,本发明首先启动具有已 经获得Root权限的由本方法实例化后得以运行而形成的主进程,通过主 进程在系统中插入所述后台服务,例如具体可通过系统调用函数 ServiceManager.addService()来实现插入操作,由此实现对本方法实例化程 序所构造的后台服务的成功注册,所述后台服务由此成为系统底层级别的 服务进程。需要注意的是,所述后台服务进程通过上述的配置,已经成为 系统级别的服务进程,其权限显然高于其他用户层服务进程或应用进程的 权限,因此该后台服务进程可以作为通信基础,为其他调用它的进程提供 通信保障,完成系统与其他调用它的进程之间的通信连接。因此,所述的 后台服务进程,具有与其监听的活动管理服务进程进行通信的能力,两者 之间基于Binder机制进行通信,这种通信方式具有快速稳定的特点。所述 后台服务进程主要用于实施对系统活动管理服务进程的监控,以便拦截活 动管理服务进程用于启动某一应用程序的行为,这一行为主要是指通过函 数调用激起的指令操作事件行为。

在具体实施例中,获取系统的Root权限后,向系统注册一个后台服 务SecurityService,该后台服务运行于系统的Framework层,用于监控待 启动应用程序的启动行为,所述启动行为具体为当AMS执行启动操作时, 调用任意执行启动操作的函数接口的行为。

具体而言,在App层注册监听器,用于接收所述后台服务发送的应用 程序启动的事件通知。在具体实施例中,App层安全软件定义回调函数接 口QihooPkgStartListener.checkPkgStart(),并提供一个自定义的接口函数Q ihooAppManager.setPkgStartListener(StringpackageName,QihooPkgStartLis tenerlistener)用于向系统中注册监听器。其中,参数packageName表征待 启动应用程序的包名。同时,在系统框架层添加一个名为SecurityService 的安全服务,当应用启动时,framework层的后台服务提供的接口函数ch eckPkgStartForUser()会调用App层安全软件的回调函数接口checkPkgStar t(StringpackageName),将应用程序的启动事件通知由框架层发送到应用 层,以便在应用层提供可视化界面对该启动事件进行鉴权。需要说明的是, 此时应用程序的实际启动动作还未触发。其中,所述checkPkgStartForUs er()函数如下:

publicbooleancheckPkgStartForUser(StringpackageName,

IBindercaller,Intentintent,

StringresolvedType,IBinderresultTo,

StringresultWho,intrequestCode,

intstartFlags,StringprofileFile,

ParcelFileDescriptorprofileFd,

Bundleoptions,intuserId)

运行checkPkgStartForUser()函数检测是否有应用程序启动,其中,所 述函数参数包括应用程序包名packageName、启动事件相关信息的描述信 息intent等。

在调用该应用程序启动检测函数之前,先通过由后台服务预先注入框 架层的钩子函数监控应用程序的启动行为并获取相关参数信息,其中,所 述钩子函数可以对startActivity()函数进行挂钩以实现对启动行为的拦截。 所述函数接口startActivity()为启动应用程序Activity的一种方式,通过调 用该函数接口创建应用程序主界面的一个实例,以调用显示Activity栈中 的应用程序主界面。故而,对函数接口startActivity()进行挂钩,以实现对 应用程序启动事件的拦截,生成启动事件通知。

当然,以上只是对挂钩函数的一个列举,也可以是应用程序启动过程 执行的任意可挂钩的操作,本领域人员应该理解相应的挂钩操作。

其中,术语“钩子”涵盖了用于通过拦截在软件组件之间传递的函数 调用、消息、或事件来改变或增加操作系统、应用程序、或其他软件组件 的行为的技术。而处理这种被拦截的函数调用、事件或消息的代码就被称 为钩子函数。钩子通常用于各种目标,包括对功能进行调试和对功能进行 扩展。其示例可以包括在键盘或鼠标事件传递到应用程序之前拦截它们, 或者拦截系统调用(systemcall)、或者系统函数行为、函数执行结果等, 以监视或修改应用程序或其他组件的功能等等。本实施例即可采用钩子函 数接管所述应用程序启动时执行的任意可挂钩接口函数的操作。

所述运行于系统的framework层后台服务SecurityService,一旦发现 有应用程序自行启动,立即将该待启动应用程序的程序包名packageName 作为参数调用App层安全软件提供的回调函数,将所述启动事件通知发送 到系统的App层。

步骤S12:响应于该启动事件通知,启动锁定界面以接收用户的密码 输入指令,对该应用程序的启动行为进行鉴权。

所述后台服务通过调用回调函数,将应用程序的包名作为参数从 Framework层传到App层,以通知应用程序的启动行为。在本步骤中便可 以基于接收到的该应用程序包名参数,对相应的应用程序的启动行为进行 鉴权。

具体而言,响应于应用程序的启动事件通知,依据应用程序的包名 packageName确定要锁定的应用程序,暂停该应用程序的启动行为,并启 动锁定界面。所述锁定界面仅当接收到应用程序的启动事件通知时显示, 具体为提供密码输入框的用户交互界面,所述密码输入框具体可以为简单 的文本编辑框、数字密码键盘、图案密码键盘、指纹识别区等任何用于接 收密码输入的界面形式。接收用户的密码输入指令,验证输入的密码,以 对应用程序的启动行为进行鉴权。

在其他实施例中,在启动锁定界面进行鉴权之前,还可以通过向云端 服务器请求允许启动的应用程序包名列表,以确定获得启动授权的应用程 序包名,具体步骤如下:

1、通过远程接口提交获取允许启动的应用程序包名列表的运程请求;

基于设备的身份信息或第三方账户通过远程接口提交远程请求,请求 获取允许启动的应用程序包名列表。其中,所述允许启动的应用程序包名 列表由云端服务器预先统计生成,客户端接收用户设定的允许应用程序启 动的指令,将相应的应用程序的包名封装成数据包,发送给云端服务器, 云端服务器将该应用程序包名与该设备的身份信息或第三方的账户关联 存储。在其他实施例中,所述允许启动的应用程序包名列表也可以由云端 服务器统计应用程序允许启动的用户数量生成,云端服务器将用户数量超 过一定阈值的应用程序记录于所述允许启动的应用程序包名列表中。

2、接收云端服务器反馈的允许启动的应用程序包名列表。

接收反馈的包含允许启动的应用程序包名列表的应答数据包,对其进 行解析,获取相应的允许启动的应用程序包名。

在启动锁定界面之前,查询当前启动的应用程序包名是否属于所述云 端服务器反馈的允许启动的应用程序包名列表,如果属于则判断该应用程 序获得启动权限;如果不属于则判断该应用程序未获得启动权限,以便于 根据该鉴权结果执行后续步骤。

在其他实施例中,所述允许启动的应用程序包名列表也可以存储于本 地,即客户端提供一用于设定允许启动应用程序的可视化界面,接收用户 的设定指令,记录用户设定的允许启动的应用程序包名并存储于本机,生 成所述允许启动的应用程序包名列表。在启动锁定界面之前,查询当前启 动的应用程序包名是否属于所述本地存储的允许启动的应用程序包名列 表,如果属于则判断该应用程序获得启动权限;如果不属于则判断该应用 程序未获得启动权限,以便于根据该鉴权结果执行后续步骤。

步骤S13:依据鉴权结果通知所述后台服务放行或禁止启动该应用程 序。

上述步骤验证用户输入的密码信息以对应用程序的启动行为鉴权,由 此得知待启动应用程序是否有启动权限,依据该鉴权结果通知所述后台服 务放行或禁止启动该应用程序。具体实施例中,App层的安全软件调用接 口函数QihooAppManager.resumeOrAbortPackage(StringpackageName,bo oleanabort),并由该函数调用所述后台服务SecurityService提供的接口函 数resumeOrAbortPackage(StringpackageName,booleanabort),将鉴权结 果由App层传到framework层,以通知framework放行或禁止启动相应的 应用程序。其中,当鉴权成功时,第二个参数abort设置为false,否则设 置为true。

如果鉴权成功,即鉴权结果为允许该应用程序启动,,则后台服务 SecurityService接收到允许启动应用程序的事件通知,对该应用程序的启 动行为放行,恢复被中断的app启动过程,即对拦截的启动接口函数放行, 使得活动管理服务继续从原挂钩函数的跳转处执行后续代码,静默执行应 用程序的启动过程。

如果鉴权失败,即鉴权结果为禁止该应用程序启动,,则后台服务 SecurityService接收到禁止启动应用程序的事件通知,结束该应用程序的 启动行为。具体可由钩子函数调用Process.killProcess(pid)函数结束应用程 序的进程或调用forcestopPackage()函数强制关闭应用程序的进程。同时, App层安全软件提供一用户界面,显示告警信息以提示用户鉴权失败。

在本发明的另一种实施方案中,系统接收了启动事件通知之后,在启 动锁定界面进行鉴权之前,先查询存储于本地的允许启动的应用程序包名 列表。对照待启动应用程序包名与存储于本地的允许启动的应用程序包名 列表,当待启动的应用程序存在于本地存储的允许启动的应用程序包名列 表中时,无需用户输入密码鉴权,直接通知所述后台服务放行启动该些应 用程序,即由后台服务对拦截的启动接口函数放行,使得活动管理服务继 续从原挂钩函数的跳转处执行后续代码,静默执行应用程序的启动过程。

在本发明的另一种实施方案中,系统接收了启动事件通知之后,在启 动锁定界面进行鉴权之前,先通过远程接口向云端服务器提交获取允许启 动的应用程序包名列表的远程请求,然后接收云端服务器反馈的允许启动 的应用程序包名列表。对照待启动应用程序包名与云端服务器反馈的允许 启动的应用程序包名列表,当待启动的应用程序存在于云端服务器反馈的 允许启动的应用程序包名列表时,无需用户输入密码鉴权,直接通知所述 后台服务放行启动该些应用程序,即由后台服务对拦截的启动接口函数放 行,使得活动管理服务继续从原挂钩函数的跳转处执行后续代码,静默执 行应用程序的启动过程。

以下基于模块化思维,进一步揭示依照本发明所述的应用程序启动鉴 权方法所实现的实施方式。

请参阅图2,本发明所提供的应用程序启动鉴权装置,包含接收单元 11、响应单元12、执行单元13。结合上述应用程序启动鉴权方法,以下 详细揭示各模块所实现的具体功能:

接收单元11:用于接收预设的后台服务发送的基于后台服务拦截的 应用程序的启动行为而生成的启动事件通知。

本实施例所称的后台服务,是指由以本发明所预先实现的一个程序模 块,运行于内存中,通过内存中的相应主进程实现如前所述的提权操作后, 向系统注册的一个通信服务进程。所述后台服务基于Android系统所提供 的Binder机制,向SystemManager注册,通过Android提供的固有的Binder 机制,在后台服务与其监听的活动管理服务(AMS)进程之间建立C/S架 构的沟通管道。具体而言,当获取到系统的Root权限后,为了便于后续 实现对系统中其它进程的监听以及相关操作功能,本发明首先启动具有已 经获得Root权限的由本方法实例化后得以运行而形成的主进程,通过主 进程在系统中插入所述后台服务,例如具体可通过系统调用函数 ServiceManager.addService()来实现插入操作,由此实现对本方法实例化程 序所构造的后台服务的成功注册,所述后台服务由此成为系统底层级别的 服务进程。需要注意的是,所述后台服务进程通过上述的配置,已经成为 系统级别的服务进程,其权限显然高于其他用户层服务进程或应用进程的 权限,因此该后台服务进程可以作为通信基础,为其他调用它的进程提供 通信保障,完成系统与其他调用它的进程之间的通信连接。因此,所述的 后台服务进程,具有与其监听的活动管理服务进程进行通信的能力,两者 之间基于Binder机制进行通信,这种通信方式具有快速稳定的特点。所述 后台服务进程主要用于实施对系统活动管理服务进程的监控,以便拦截活 动管理服务进程用于启动某一应用程序的行为,这一行为主要是指通过函 数调用激起的指令操作事件行为。

在具体实施例中,获取系统的Root权限后,向系统注册一个后台服 务SecurityService,该后台服务运行于系统的Framework层,用于监控待 启动应用程序的启动行为,所述启动行为具体为当AMS执行启动操作时, 调用任意执行启动操作的函数接口的行为。

具体而言,在App层的接收单元11注册监听器,用于接收所述后台 服务发送的应用程序启动的事件通知。在具体实施例中,本发明所述接收 单元11定义回调函数接口QihooPkgStartListener.checkPkgStart(),并提供 一个自定义的接口函数QihooAppManager.setPkgStartListener(Stringpacka geName,QihooPkgStartListenerlistener)用于向系统中注册监听器。其中, 参数packageName表征待启动应用程序的包名。同时,在系统框架层添加 一个名为SecurityService的安全服务,当应用启动时,framework层的后 台服务提供的接口函数checkPkgStartForUser()会调用App层安全软件的 回调函数接口checkPkgStart(StringpackageName),将应用程序的启动事 件通知由框架层发送到应用层,以便在应用层提供可视化界面对该启动事 件进行鉴权。需要说明的是,此时应用程序的实际启动动作还未触发。其 中,所述checkPkgStartForUser()函数如下:

publicbooleancheckPkgStartForUser(StringpackageName,

IBindercaller,Intentintent,

StringresolvedType,IBinderresultTo,

StringresultWho,intrequestCode,

intstartFlags,StringprofileFile,

ParcelFileDescriptorprofileFd,

Bundleoptions,intuserId)

运行checkPkgStartForUser()函数检测是否有应用程序启动,其中,所 述函数参数包括应用程序包名packageName、启动事件相关信息的描述信 息intent等。

在调用该应用程序启动检测函数之前,先通过由后台服务预先注入框 架层的钩子函数监控应用程序的启动行为并获取相关参数信息,其中,所 述钩子函数可以对startActivity()函数进行挂钩以实现对启动行为的拦截。 所述函数接口startActivity()为启动应用程序Activity的一种方式,通过调 用该函数接口创建应用程序主界面的一个实例,以调用显示Activity栈中 的应用程序主界面。故而,对函数接口startActivity()进行挂钩,以实现对 应用程序启动事件的拦截,生成启动事件通知。

当然,以上只是对挂钩函数的一种列举,也可以是应用程序启动过程 执行的任意可挂钩的操作,本领域人员应该理解相应的挂钩操作。

其中,术语“钩子”涵盖了用于通过拦截在软件组件之间传递的函数 调用、消息、或事件来改变或增加操作系统、应用程序、或其他软件组件 的行为的技术。而处理这种被拦截的函数调用、事件或消息的代码就被称 为钩子函数。钩子通常用于各种目标,包括对功能进行调试和对功能进行 扩展。其示例可以包括在键盘或鼠标事件传递到应用程序之前拦截它们, 或者拦截系统调用(systemcall)、或者系统函数行为、函数执行结果等, 以监视或修改应用程序或其他组件的功能等等。本实施例即可采用钩子函 数接管所述应用程序启动时执行的任意可挂钩接口函数的操作。

所述运行于系统的framework层后台服务SecurityService,一旦发现 有应用程序自行启动,立即将该待启动应用程序的程序包名packageName 作为参数调用App层安全软件提供的回调函数,将所述启动事件通知发送 到系统的App层,由所述接收单元11接收所述启动事件通知。

响应单元12:响应于该启动事件通知,用于启动锁定界面以接收用 户的密码输入指令,对该应用程序的启动行为进行鉴权;

所述后台服务通过调用回调函数,将应用程序的包名作为参数从 Framework层传到App层,以通知应用程序的启动行为。本发明所述响应 单元12便可以基于接收到的该应用程序包名参数,对相应的应用程序的 启动行为进行鉴权。

具体而言,所述响应单元12响应于应用程序的启动事件通知,依据 应用程序的包名packageName确定要锁定的应用程序,暂停该应用程序的 启动行为,并启动锁定界面。所述锁定界面仅当接收到应用程序的启动事 件通知时显示,具体为提供密码输入框的用户交互界面,所述密码输入框 具体可以为简单的文本编辑框、数字密码键盘、图案密码键盘、指纹识别 区等任何用于接收密码输入的界面形式。响应单元12接收用户的密码输 入指令,验证输入的密码,以对应用程序的启动行为进行鉴权。

在其他实施例中,本发明装置还包括远程交互单元,在启动锁定界面 进行鉴权之前,由所述远程交互单元通过向云端服务器请求允许启动的应 用程序包名列表,以确定获得启动授权的应用程序包名,具体执行步骤如 下:

1、通过远程接口提交获取允许启动的应用程序包名列表的运程请求;

基于设备的身份信息或第三方账户通过远程接口提交远程请求,请求 获取允许启动的应用程序包名列表。其中,所述允许启动的应用程序包名 列表由云端服务器预先统计生成,客户端接收用户设定的允许应用程序启 动的指令,将相应的应用程序的包名封装成数据包,发送给云端服务器, 云端服务器将该应用程序包名与该设备的身份信息或第三方的账户关联 存储。在其他实施例中,所述允许启动的应用程序包名列表也可以由云端 服务器统计应用程序允许启动的用户数量生成,云端服务器将用户数量超 过一定阈值的应用程序记录于所述允许启动的应用程序包名列表中。

2、接收云端服务器反馈的允许启动的应用程序包名列表。

接收反馈的包含允许启动的应用程序包名列表的应答数据包,对其进 行解析,获取相应的允许启动的应用程序包名。

在启动锁定界面之前,响应单元12查询当前启动的应用程序包名是 否属于所述云端服务器反馈的允许启动的应用程序包名列表,如果属于则 判断该应用程序获得启动权限;如果不属于则判断该应用程序未获得启动 权限,以便于根据该鉴权结果执行后续本发明装置的后续单元。

在其他实施例中,所述允许启动的应用程序包名列表也可以存储于本 地,即客户端提供一用于设定允许启动应用程序的可视化界面,接收用户 的设定指令,记录用户设定的允许启动的应用程序包名并存储于本机,生 成所述允许启动的应用程序包名列表。在启动锁定界面之前,响应单元 12查询当前启动的应用程序包名是否属于所述本地存储的允许启动的应 用程序包名列表,如果属于则判断该应用程序获得启动权限;如果不属于 则判断该应用程序未获得启动权限,以便于根据该鉴权结果执行本发明装 置的后续单元。

执行单元13:用于依据鉴权结果通知所述后台服务放行或禁止启动 该应用程序。

本发明所述响应单元12验证用户输入的密码信息以对应用程序的启 动行为鉴权,由此得知待启动应用程序是否有启动权限,执行单元13依 据该鉴权结果通知所述后台服务放行或禁止启动该应用程序。具体实施例 中,App层的安全软件调用接口函数QihooAppManager.resumeOrAbortPa ckage(StringpackageName,booleanabort),并由该函数调用所述后台服务 SecurityService提供的接口函数resumeOrAbortPackage(StringpackageNa me,booleanabort),将鉴权结果由App层传到framework层,以通知fra mework放行或禁止启动相应的应用程序。其中,当鉴权成功时,第二个 参数abort设置为false,否则设置为true。

如果鉴权成功,即鉴权结果为允许该应用程序启动,则后台服务 SecurityService接收到允许启动应用程序的事件通知,对该应用程序的启 动行为放行,恢复被中断的app启动过程,即对拦截的启动接口函数放行, 使得活动管理服务继续从原挂钩函数的跳转处执行后续代码,静默执行应 用程序的启动过程。

如果鉴权失败,即鉴权结果为禁止该应用程序启动,则后台服务 SecurityService接收到禁止启动应用程序的事件通知,结束该应用程序的 启动行为。具体可由钩子函数调用Process.killProcess(pid)函数结束应用程 序的进程或调用forcestopPackage()函数强制关闭应用程序的进程。同时, App层安全软件提供一用户界面,显示告警信息以提示用户鉴权失败。

在本发明的另一种实施方案中,系统接收了启动事件通知之后,在启 动锁定界面进行鉴权之前,所述响应单元12被配置为先查询存储于本地 的允许启动的应用程序包名列表。对照待启动应用程序包名与存储于本地 的允许启动的应用程序包名列表,当待启动的应用程序存在于本地存储的 允许启动的应用程序包名列表中时,无需用户输入密码鉴权,由执行单元 13直接通知所述后台服务放行启动该些应用程序,即由后台服务对拦截 的启动接口函数放行,使得活动管理服务继续从原挂钩函数的跳转处执行 后续代码,静默执行应用程序的启动过程。

在本发明的另一种实施方案中,系统接收了启动事件通知之后,在启 动锁定界面进行鉴权之前,先启用远程交互单元,通过远程接口向云端服 务器提交获取允许启动的应用程序包名列表的远程请求,然后接收云端服 务器反馈的允许启动的应用程序包名列表。由响应单元12对照待启动应 用程序包名与云端服务器反馈的允许启动的应用程序包名列表,当待启动 的应用程序存在于云端服务器反馈的允许启动的应用程序包名列表时,无 需用户输入密码鉴权,由执行单元13直接通知所述后台服务放行启动该 些应用程序,即由后台服务对拦截的启动接口函数放行,使得活动管理服 务继续从原挂钩函数的跳转处执行后续代码,静默执行应用程序的启动过 程。

由于本发明前述说明的三种方法逻辑上可以存在于同一实施例中。为 便于更直观地理解本发明,如下结合前述的三种方法介绍本发明的一个具 体应用场景。

本发明的一个应用场景中:用户在自己的手机上安装了一款基于本发 明的安全保护软件,为保护个人隐私,通过设置密码来添加其手机上的图 片处理APP为私密应用。用户点击打开该APP,根据本发明所提供的应 用程序鉴权装置即通过钩子函数调用监听接口接收到后台服务发出的该 图片处理APP启动请求,随即查询该图片处理APP是否存在于本地存储 的允许启动的应用程序包名列表中,如果存在,则不做处理,直接打开该 程序。另一方面,在用户手机连接网络的前提下,通过本发明的应用程序 鉴权装置中的远程交互单元,查询该图片处理APP是否存在于云端服务 器反馈的允许启动的应用程序包名列表,如果存在,则不做处理,直接打 开该程序。由于用户的前期设置,该图片处理APP的程序包不在此列表 内,基于本发明安全软件立刻锁定当前手机界面,提供一个密码输入界面。 当用户输入的验证密码与前期设置的密码一致时,安全软件判定当前用户 具备查看该图片处理APP的权限,随即放行,该图片处理APP正常开启; 当用户输入的验证密码与前期设置的密码不一致时,安全软件判定当前用 户不具备查看该图片处理APP的权限,即终止该图片处理APP的启动, 并在锁定界面显示“密码错误,无权查看”的告警信息。

综上所述,本发明深入到系统底层实现对应用程序的监控,及时准确 地发现应用程序启动,快速提供鉴权界面,能够更有效地保护应用程序不 被随意启动运行。

在此处所提供的说明书中,虽然说明了大量的具体细节。然而,能够 理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实 施例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书 的理解。

以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的 普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进 和润饰,这些改进和润饰也应视为本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号