APP下载

基于Android Wear的智能设备数据安全防护技术研究

2016-11-08李惠

现代电子技术 2016年19期
关键词:麦克风内核闹钟

李惠

(六盘水师范学院 计算机科学与信息技术系,贵州 六盘水 553001)

基于Android Wear的智能设备数据安全防护技术研究

李惠

(六盘水师范学院 计算机科学与信息技术系,贵州 六盘水553001)

随着移动技术的发展与智能操作系统的推广,智能设备在为用户提供便利的同时,也存在一些数据安全隐患。针对Android Wear智能手表,提出了一种通过在Linux内核层对麦克风、蓝牙和ADB等数据端口进行开关控制,以实现对手表中的数据进行保护的技术。该技术使用了两种不同的途径实现对三个数据端口的控制。同时,还实现了一种内核程序的用户交互方法,在文件系统驱动程序中截获用户层程序对特定文件的读写操作,可以显示数据端口的当前开关状态,并对开关状态进行控制,而不需要增加或修改应用层程序,最后通过实验验证了该技术的可行性。

Android Wear;智能手表;数据保护;数据端口开关控制

0 引 言

Android Wear智能手表作为一种新式的可穿戴设备给人们的生活带来了极大的便利[1]。智能手表作为随身穿戴的设备,很可能被非法分子作为窃听他人隐私的媒介,智能手表中的重要数据可能通过蓝牙泄露出去,当手表遗失或被窃后,他人可以使用ADB命令或手机助手软件将手表中的数据拷贝出去,从而给用户带来严重的损失。通过研究Android Wear智能手表的数据保护技术,让用户可以在开会或其他涉及重要隐私信息的场合,选择将手表中可能导致数据泄露的端口关闭,从而起到数据保护的作用[2]。

1 数据保护技术的原理与控制

由于无法获得Android Wear系统源码,所以本文通过修改Linux内核层的代码,增加对麦克风、蓝牙和ADB驱动的控制,一方面可以防止恶意软件的录音窃取用户重要信息;另一方面还可以防止重要数据通过蓝牙和ADB泄露出去。本节主要从麦克风、蓝牙和ADB三个方面分别介绍它们的实现原理,以及如何从内核层实现对它们的开关控制。

1.1麦克风的工作原理与控制

麦克风是Android音频系统中的输入设备,通过分析音频系统的架构,了解麦克风的工作原理与实现方式,进而在Linux内核层找到控制麦克风的关键代码。Android音频系统自上而下分为应用层、Java框架层、本地框架层、本地库、硬件抽象层和驱动层[3]。通过Makefile和config变量定位麦克风驱动对应的文件。查看/ sound目录下的Makefile文件,内核编译时将根据这些变量是否为y来选择相应的文件进行编译。在 LG G Watch手表默认内核配置文件/arch/arm/configs/dory_defconfig中查找和声音有关的内核配置变量如下:

CONFIG_SOUND=y

CONFIG_SND=y

CONFIG_SND_SOC=y

CONFIG_SND_SOC_DORY_MI2S=y

通过不断在子目录及相应的Makefile中跟踪内核配置变量,确定最终被编译进内核中和声音有关的文件有/sound/sound_core.c和/sound/soc/msm/dory-mi2s.c。在两个文件中的各个函数中都加入自定义的printk函数来输出日志信息,然后通过ADB命令查看日志输出,发现当向手表输入语音指令时,其中dory_mi2s_startup为启动函数[4]。

1.2蓝牙的工作原理与控制

Android蓝牙架构包括四层,分别为应用层、框架层、C框架层、内核层。根据内核编译系统的工作原理,通过追踪内核配置变量,找到和蓝牙有关的驱动程序有/drivers/bluetooth/bluesleep.c和 /drivers/bluetooth/bluetooth-power.c,然后通过在各函数中插入日志信息,查看函数调用流程,进而在关键函数中添加控制逻辑。然而通过实验发现该方法并不完全有效,虽然可以切断当前的蓝牙连接,但是手表和手机之间仍然可以再次建立连接,这无法满足本文的需求。于是提出了另外一种更为通用的方法,为了关闭某个功能模块,首先找到该模块所使用的可执行文件或重要的库文件,然后在文件系统打开文件函数中添加对该文件的拦截,使得文件打开失败,从而使得该功能模块无法执行。查找蓝牙模块相关文件的过程如下:

使用adbshell命令连接到手表;使用ps|grepbluetooth查找与蓝牙有关的进程,得到:

Bluetooth 3234 2913 591888 32592 ffffffff b6f094a8 S com. android.bluetooth

从命令的输出中可以看到蓝牙模块是由Android层的一个服务进程com.android.bluetooth来维护的,其进程号为3234。使用cd/proc/3234进入到该进程目录;使用catmaps|grepbluetooth查看蓝牙所使用的相关库文件,结果如图1所示。

图1 蓝牙进程maps

蓝牙模块使用了两个库文件/system/lib/hw/bluetooth.default.so和/system/lib/libbluetooth_jni.so。接下来在/fs/namei.c文件的do_filp_open函数中添加对上述两个库文件的拦截。上面的方法可以阻止蓝牙的再次打开,如果手表已经和手机建立了连接,上述的方法并不能断开当前的连接,因此还需要将蓝牙模块的进程kill掉[5]。在内核中kill掉进程需要遍历所有的进程,然后比较当前进程的名字是否为目标进程,如果是,则向该进程发送SIGKILL信号。

1.3ADB的工作原理与控制

当用户启动ADBclient时,Client首先检查是否有ADBserver正在运行。如果没有,则启动一个ADBserver进程。当Server进程启动时,它绑定本地TCP5037端口,通过该端口接收ADBclient发送的命令。所有的ADBclient都使用5037端口与ADBserver通信[6]。

ADBserver与连接到PC上的Android设备或模拟器建立连接。Server通过扫描5555~5585范围内的奇数端口来发现Android设备或模拟器。当Server发现一个ADBdaemon时,便会和那个端口建立连接。每个Android设备或模拟器需要两个端口,偶数端口用于控制台连接,奇数端口用于用户ADB连接。一旦ADBserver建立与设备或模拟器的连接,便可以通过ADB命令来控制和访问这些设备或模拟器。因为ADBserver管理与设备或模拟器之间的连接,所以可以通过ADBclient控制任何的设备或模拟器[7]。

通过对ADB工作原理的分析,得知手表中通过adbd守护进程与电脑建立连接,因此只要禁止该程序的执行,便可以达到关闭ADB的目的。和控制蓝牙模块类似,首先找到adbd可执行程序的路径,使用ps|grepadbd命令,得到:

shell 2158 1 8788 232 ffffffff 00026394 S/sbin/adbd

adbd的路径为/sbin/adbd,然后在/fs/namei.c文件的do_filp_open函数中添加对/sbin/adbd的拦截,主要代码如下:

struct file*do_filp_open(int dfd,struct filename*pathname,

const struct open_flags*op,int flags)

{struct nameidata nd;

struct file*filp;

i(fg_adb_switch==0)

{if(strcmp(pathname->name,"/sbin/adbd")==0){returnERR_PTR(-ENOMEM);}}…}

同样,为了关闭已经建立的ADB连接,需要kill掉adbd进程,使用kill_proc(“adbd”)实现。

2 用户交互界面

根据Android系统的分层架构可以知道,用户使用智能手表,实际上是使用手表中的应用软件,和用户直接打交道的是位于最上层的App[8]。然而提出的数据保护方案的核心功能实现位于内核态,因此需要解决的是如何让用户通过使用上层的应用软件来触发内核中相应的动作(主要是对麦克风、蓝牙和ADB的开关切换)。在不修改和添加智能手表中应用软件的前提下,实现用户交互界面的设计,主要采用的方法是寻找手表中自带应用与系统文件的读写交互,在内核文件系统读写函数中添加判断逻辑,当写特定文件时,根据写入文件的数据来触发对数据端口开关的控制;当读取特定文件时,通过修改返回的数据来显示内核的状态。

2.1输入界面的设计与实现

Android Wear系统中自带一个闹钟应用,当设定闹钟时会有写文件的操作,写文件时会调用内核文件系统中vfs_write函数,这样内核便可以将设定闹钟的时间作为用户的输入,根据时间的不同,对麦克风、蓝牙和ADB进行相应的开关控制。

2.1.1查找闹钟对应的应用程序

Android Wear系统启动后,安装包管理器会解析系统中所安装的应用,并为其建立对应的数据结构,同时会将所有应用的基本信息保存在文件中。这样的文件共有两个,它们位于/data/system目录,分别是packages. list和packages.xml。可以从packages.list中查看系统中所有应用的安装包信息,可以从packages.xml中获得该安装包所在路径。

从命令的输出中看到和时钟有关的应用有三个,从安装包的名字可以看出,其中com.google.android.deskclock是谷歌公司开发的,com.lge.wearable.worldclock是LG公司开发的,/data/data/com.google.android.clockwork. packageinstaller是程序安装器。LG公司没有必要为手表开发一个闹钟程序,因此com.google.android.deskclock应该就是要找的闹钟程序的包名。

2.1.2查找闹钟程序所写的文件

进入com.google.android.deskclock程序的私有数据目录:

#cd/data/data/com.google.android.deskclock

使用ls命令查看该目录下有哪些文件,得到cache,lib,shared_prefs。shared_prefs目录下一般保存一些xml格式的应用配置文件,在该目录下发现alarms.xml和stopwatch.xml两个文件,从名字可以看出alarms.xml就是要找的闹钟配置文件,而stopwatch.xml应该是跟秒表有关。alarms.xml内容如下:

<xmlversion=′1.0′encoding=′utf-8′standalone=′yes′>

<map>

<intname="hour"value="8"/>

<intname="minute"value="0"/>

</map>

得出alarms.xml中的内容正好是最近一次设置的闹钟时间。

2.2在内核中读取设置的闹钟时间

当用户设置闹钟时,程序会向/data/data/com.google. android.deskclock/shared_prefs/alarms.xml文件写入设置的闹钟时间。根据Linux虚拟文件系统的相关知识,写文件时会调用内核中的vfs_write函数,该函数位于内核源码/fs/read_write.c文件中。在vfs_write函数中,对所写文件名进行判断,如果是闹钟文件,则在写文件后,从闹钟文件中读取设置的时间值,根据具体的时间值对数据端口进行相应的开关设置。从vfs_write函数传入的参数可以获得所写文件的 structfile指针,使用 dentry_path_raw函数可以得到该file对象对应的绝对路径,然后使用strcmp函数比较该路径是否为闹钟文件的路径。用设置闹钟的hour值当做用户的输入,读取hour值的主要流程如图2所示。

图2 读取闹钟时间流程图

2.3输出界面的设计与实现

输出界面用来显示麦克风、蓝牙和ADB的当前开关状态,需要在手表自带应用中找到一个合适的位置来显示内核状态信息,为了不影响手表软件原有功能,最好找一个显示一些固定静态信息的页面。通过分析现有应用,找到Settings下面的About界面,该页面显示手表系统的一些固定信息,比如Model、设备名、软件版本等,其中有一项是Regulatory Information(监管信息),点击该项后,显示如图3所示页面,从外观看,该页面显示的应该是一个固定的图片。当上层应用读取该图片内容时,会调用底层内核文件系统中的vfs_read函数,通过修改返回的内容,使得该页面显示想要显示的信息。

图3 Regulatory Information页面截图

2.3.1查找Regulatory Information图片的路径

使用dex2jar工具将安装包中的classes.dex反编译为classes_dex2jar.jar,然后使用jd-jui可视化工具打开classes_ dex2jar.jar,根据包名找到DeviceInfoListActivity类的定义,在该类中找到和Regulatoryinformation有关的代码,发现点击RegulatoryInformation时,程序跳转到RegulatoryInformationActivity类中,该类的onCreate函数如下:

public void onCreate(Bundle paramBundle)

{super.onCreate(paramBundle);

setContentView(2130903057);

((ImageView)findViewById(2131492945)).setImageBitmap(BitmapFactory.decod

eFile("/system/etc/regulatory_info.png"));}

从代码中可以看出,该页面显示的是一个ImageView控件,该控件对应的图片路径为/system/etc/regulatory_info.png,即是要找的图片。

2.3.2使用BMP图片替换PNG图片

压缩格式的PNG不利于使用代码对其修改,为了方便修改图片的显示内容,使用格式最简单的BMP位图文件。需要修改vfs_read函数,当读取的文件为/system/etc/regulatory_info.png时,将bmpdata数组中的数据拷贝到用户端,这样当用户查看手表监管信息时,将会显示所需位图。

2.3.3修改位图内存数据

为了在位图中显示信息,需要修改bmpdata[]数组中的数据,修改BMP文件的图形数据区域。对于256色位图,每个像素点使用8位二进制数表示,这8位二进制表示的是颜色表中的一个颜色索引。颜色表用来描述位图中的颜色,它有若干个表项,每个表项代表一种颜色,使用RGBQUAD结构表示。

在内核源码/drivers/video/console/目录下有很多字库文件,使用其中的font_sun12x22.c文件。它使用宽为12像素,高为22像素的矩阵表示一个字符。位图数据区记录了位图中每个像素的颜色,其扫描顺序为从左到右,从下到上。要想在位图中显示字符,还需要知道每个字符对应的像素矩阵。

3 实验与测试

3.1实验目标

通过设置闹钟为特定时间,对内核数据端口进行开关控制,并可以从Regulatory Information查看内核数据端口的状态。

闹钟时间与数据端口开关的对应关系,如表1所示。

表1 闹钟时间与端口开关对应关系表

设计的输出界面只能显示数字和英文字符,在显示时同时显示三个数据端口的状态,用MIC表示麦克风,用BT表示蓝牙,ADB表示ADB。用0表示关闭状态,用1表示打开状态。“MIC:0BT:1ADB:1”表示麦克风处于关闭状态,蓝牙处于打开状态,ADB处于打开状态。

3.2测试

3.2.1麦克风的测试

正常情况下,用手指点击手表屏幕,手表进入唤醒状态,此时只要说“OK Google”,手表就会做出反应。

关闭麦克风:通过设置闹钟为11点将麦克风关闭,然后再对手表说“OK,Google”,手表没有反应,由此可以证明麦克风功能已经成功关闭。同时,可以在Regulatory Information中看到麦克风端口状态为0。

打开麦克风:通过设置闹钟为1点重新打开麦克风,可以在RegulatoryInformation界面看到麦克风的状态为1,此时对手表说“OK,Google”,手表重新恢复响应。

3.2.2蓝牙的测试

正常情况下,手机可以和手表建立蓝牙连接,当连接时,手机上会提示连接密码确认。

关闭蓝牙:通过设置闹钟为12点将蓝牙关闭,手表与蓝牙的连接断开,且再次连接手表时,显示无法和手表通信,因此可以证明蓝牙功能已成功关闭。

打开蓝牙:通过设置闹钟为2点将蓝牙重新打开,此时手表并不会自动和手机建立蓝牙连接,需要在手表上点击手表设置中的Bluetoothdevices,它会提示重新启动蓝牙,点击确认按钮之后手表与手机会自动建立连接。

3.2.3ADB的测试

关闭ADB:如图4所示,在正常情况下,电脑可以通过ADB命令和手表通信,通过设置闹钟为13点将ADB关闭,当前的ADB连接会立刻断开,且当再次输入adbshell命令时,会显示Devicenotfound,因此可以证明ADB功能已成功关闭。

图4 ADB开关测试图

打开ADB:通过设置闹钟为3点将ADB再次打开后,此时输入adbshell,无法连接手表,需要拔下数据线再重新插上,再使用adbshell,可再次连接到手表。

4 结 论

Android Wear系统是谷歌专为智能手表等可穿戴设备设计的系统,出于碎片化的担心,谷歌并没有开放Android Wear的系统源码,因此本文提出一种从内核层对可能造成数据安全问题的三个端口进行开关控制,从而起到数据保护的作用。通过对麦克风、蓝牙和ADB工作原理的分析,在内核层实现了对这三个数据端口的开关控制。同时,设计了用户交互界面,使得用户可以方便地输入指令,控制内核对三个数据端口进行开关切换,同时内核还可以将数据端口的开关状态显示给用户。

最后通过测试证明了本技术方案可以对各数据端口进行有效控制,实现了对数据的保护。课题使用LGGWatch智能手表作为对象进行实验,由于不同的硬件平台对应的驱动程序可能不同,预装的应用程序也可能存在差异,所以在移植性上还存在不足,这是今后努力的一个方向。另外,目前指令的输入还缺少用户身份识别模块,如何对用户进行有效的身份识别是另一个需要研究的方向。

[1]徐尤华,熊传玉.Android应用的反编译[J].电脑与信息技术,2012(1):50-51.

[2]蔡洁.基于高通平台的Android系统分区管理[J].硅谷,2014(19):44-46.

[3]张欢庆,高丽,宋承祥.基于ARM的嵌入式Linux交叉编译环境的研究与实现[J].计算机与数字工程,2012(2):151-153.

[4]夏盛新.基于Android的移动开放平台SDK的设计与实现[D].西安:西安电子科技大学,2014.

[5]SCHMIDT A D,BYE R,SCHMIDT H G,et al.Static analysis of executables for collaborative malware detection on Android[C]//Proceedings of 2009 IEEE International Conference on Communications.Dresden:IEEE,2009:1-5.

[6]金智义,张戟.嵌入式Android系统的启动研究[J].佳木斯大学学报(自然科学版),2011(4):521-523.

[7]王景存,高峰.基于ARM9的Bootloader的分析及设计[J].现代电子技术,2010,33(2):44-46.

[8]蔡洁.基于高通平台的Android系统分区管理[J].硅谷,2014(19):44-46.

Research on Android Wear based data security protection technology for intelligent device

LI Hui
(Department of Computer Science and Information Technology,Liupanshui Normal University,Liupanshui 553001,China)

With the development of mobile technology and promotion of intelligent operating system,some hidden dangers in data security also occurred in the intelligent devices while they were providing the convenience for their users.For the Android Wear smart watch,a data protection technology is presented,which can protect the data in the watch by means of switch control in Linux kernel level to control the data ports of microphone,Bluetooth and ADB.This technology uses two different approaches to control the three data ports.A user interaction method of kernel program was implemented,which can intercept the specific files′read-write operation of the user layer program in file system drive program,display the current switch status of the data ports,and control the switch status without increasing or modifying the application layer program.The feasibility of this technology was verified with experiment.

Android Wear;smart watch;data protection;data port switch control

TN92-34;TM417

A

1004-373X(2016)19-0020-05

10.16652/j.issn.1004-373x.2016.19.005

2015-12-01

贵州省教育部基金项目:基于计算思维的“计算机科学导论”教学模式改革研究与实践(GZSJG10977201404)

李惠(1985—),女,山东泰安人,工学硕士,讲师。从事计算机网络(Android软件开发)研究。

猜你喜欢

麦克风内核闹钟
多彩创意闹钟
强化『高新』内核 打造农业『硅谷』
天然闹钟
Binaural Rendering based on Linear Differential Microphone Array and Ambisonic Reproduction
小闹钟的提醒
能帮我设个闹钟不等四则
基于嵌入式Linux内核的自恢复设计
基于数字麦克风的WIFI语音发射机
Linux内核mmap保护机制研究
麦克风的艺术