1、信息同步系统之手机安全卫士设计与实现手机防盗、通讯卫士、软件管理摘 要:本系统正是针对那些恶意应用的,详细的阐述了手机安全卫士的开发流程,包括手机防盗、通讯卫士、软件管理、进程管理、手机杀毒、系统优化、高级工具、设置中心等功能模块。整体项目采用MVC框架,是对安卓知识点的综合应用,用到的技术有(活动,服务,广播接收者,内容提供这,唤醒机制,数据库,自定义标题,自定义控件,小部件,进程间通讯等)。关键词:手机卫士;安卓开发平台;MVC框架;数据库 Abstract: The system is aimed at those malicious applications, describes in
2、 detail the mobile phone security guards of the development process, including mobile phone anti-theft, communication guard, software management, process management, mobile phone antivirus, system optimization, advanced tools, set the center function module. The whole project using the MVC framework
3、, it is a comprehensive application for Android knowledge point, use of Technology (activities, services, broadcast receivers, content providing this, wake-up mechanism, database, a custom title, custom controls, small parts, inter process communication). The project is through the XML file layout o
4、n the page, the background using java code to achieve each business logic process, complete the needs of each page in the. Keywords: mobile phone guardian;Android development platform,;MVC framework,;database1 绪论 1.1 背景 本次开发是由安博教育和学校发起,学生自主选题的一次毕业设计。 伴随智能手机的不断普及,移动互联网的快速发展,伴随着3G时代的到来,智能手机的广泛应用,安卓成为活
5、跃用户量最大的移动终端操作系统,并且安卓操作系统是开放源代码的,所以每个人都可以开发出一个安卓应用,导致安卓的应用数不胜数。由于安卓的开源,导致每个人可以对安卓端的软件进行编写,而有些开发者在应用中加入一些非法的代码,窃取用户的隐私,使得手机的安全问题日益明显,手机安全问题关注度日益提高。 随着Android平台的发展和普及,Android已经成为恶意代码的下一个肆虐之地,这里我把一些漏洞的原理和技巧加以整理总结,起到抛砖引玉的作用,希望大家能够把这些知识用到以后反病毒和软件保护的工作中. 不需要懂得信息安全的人是幸福的,而我们的职责是保障他们的幸福。 1.2 开发思路和计划 在和指导老师多次
6、交流后,确定实现方案的要点和工作计划。 整体项目采用MVC框架,是对android知识点的综合应用,用到的技术有 activity,service,broadcast,content provider,Notification,sqlite数据库,自定义title,自定义控件,widget,aidl进程间通讯等,本项目所实现的功能如下: 手机防盗: 根据预设参数,判断手机是否被盗,根据自定义协议发送手机中SIM卡的信息和手机的位置信息给安全号码。可远程通过短信指令,给手机设置锁屏密码,远程锁定手机屏幕,远程格式化手机SD卡,恢复出厂设置,极大的保护用户的隐私安全,通过aidl注册admin设备
7、,一般用户无法卸载该程序。 通讯卫士: 来电号码归属地显示,来电归属地位置的调整,来电黑名单/短信黑名单管理。电话短信备份和还原,保护手机的数据和通讯安全。 软件管理: 系统软件和本地软件,可以显示软件的详细信息,启动、删除、分享应用程序。程序锁可以指定要保护的程序,用户进入要保护的程序之前必须输入密码。 进程管理: 显示当前系统运行的进程信息,显示系统内存信息,可以杀死某个进程,批量杀死进程,通过桌面widget实时展现用户当前的手机内存状态。 手机杀毒: 从服务器下载最新的病毒库,根据程序的包名和程序的数字签名识别病毒,提示用户并查杀恶意软件,使吸费木马无处可藏。 系统优化: 清理手机缓存
8、,提高手机性能,优化电池管理。 高级工具: 手机号码归属地查询,更改归属地位置,常用号码查询。 设置中心: 可以对是否开启防盗、是否开启程序锁服务等功能进行设置,还可以更改来去电显示的风格。 我做的毕业设计也经历了从选题,调研,熟悉开发环境,实验关键技术,查找类似的相关系统的资料;系统概要设计,数据库结构设计,功能模块开发,功能模块测试,系统调试和系统试运行和修改。 2 系统需求2.1 范围本次开发的系统为手机安全卫士。用于广大Android手机用户,包括手机防盗 、通讯卫士、 软件管理 、进程管理、 流量统计 、手机杀毒、系统优化、高级工具、设置中心。我所负责的模块是手机防盗、通讯录卫士、软
9、件管理这三个模块!2.2 定义MS MobileSafe (手机安全卫士)的缩写。2.3功能需求1) 手机防盗: 进入“手机防盗”模块,提示用户设置手机保护密码,设置密码成功或已经设置后进入保护程序,其主要功能有:SIM卡变更通知、GPS追踪、远程销毁数据、远程报警2) 通讯录卫士: 根据用户预设的电话号码,拦截该号码的电话或者短信。3) 软件管理: 软件分享、启动或者卸载。 3 模块一:手机防盗模块3.1 手机防盗-业务处理流程3.1.1 设置界面处理流程图 3-1-1 设置界面流程图3.1.2 手机防盗处理流程图3-1-2 手机防盗处理流程图3.2 手机防盗-界面设计图3-2-1 手机防盗
10、界面3.3 手机防盗-代码实现(主要代码实现)public class LostProtectedActivity extends Activity implements OnClickListener private static final String TAG = LostProtectedActivity;private SharedPreferences sp;private EditText et_first_dialog_pwd;private EditText et_first_dialog_pwd_confirm;private Button bt_first_dialog_
11、ok;private Button bt_first_dialog_cancle;private EditText et_normal_dialog_pwd;private Button bt_normal_dialog_ok;private Button bt_normal_dialog_cancle;private TextView tv_lost_protect_number;private RelativeLayout rl_lost_protect_setting;private CheckBox cb_lost_protect_setting;private TextView tv
12、_lost_protect_reentry_setup;private AlertDialog dialog;protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);sp = getSharedPreferences(config, MODE_PRIVATE);if (isSetupPwd() showNormalEntryDialog(); else howFirstEntryDialog();private void showFirstEntryDialog() AlertD
13、ialog.Builder builder = new Builder(this);View view = View.inflate(this, R.layout.first_entry_dialog, null);et_first_dialog_pwd = (EditText) view.findViewById(R.id.et_first_dialog_pwd);et_first_dialog_pwd_confirm = (EditText) view.findViewById(R.id.et_first_dialog_pwd_confirm);bt_first_dialog_ok = (
14、Button) view.findViewById(R.id.bt_first_dialog_ok);bt_first_dialog_cancle = (Button) view.findViewById(R.id.bt_first_dialog_cancle);bt_first_dialog_cancle.setOnClickListener(this);bt_first_dialog_ok.setOnClickListener(this);builder.setView(view);dialog = builder.create();dialog.show();3.4 手机防盗-实际运行测
15、试 图3-4-1 实际运行图4 模块二:通讯录卫士模块4.1 通讯录卫士-业务处理流程图4-1-1 业务处理流程图4.2 通讯录卫士-界面设计4.2.1 主界面图4-2-1 主界面设计图4.2.2 添加号码界面图4-2-2 号码添加界面设计4.3 通讯录卫士-代码实现(主要代码实现)public class CallSmsSafeActivity extends Activity protected static final int LOAD_DATA_FINISH = 40;public static final String TAG = CallSmsSafeActivity;/用于展现出
16、所有的黑名单号码private ListView lv_call_sms_safe;/操作黑名单号码数据库的对象private BlackNumberDao dao;private List blacknumbers;/显示黑名单号码的适配器对象private BlackNumberAdapter adpater;/ProgressBar控件的父控件,用于控制子控件的显示(包括了ProgressBar)private LinearLayout ll_call_sms_safe_loading;/private String initnumber;/用于接收子线程发送过来的消息,实现UI的更新p
17、rivate Handler handler = new Handler() public void handleMessage(android.os.Message msg) switch (msg.what) case LOAD_DATA_FINISH:/从数据库中加载黑名单号码完成ll_call_sms_safe_loading.setVisibility(View.INVISIBLE);/为lv_call_sms_safe设置适配器adpater = new BlackNumberAdapter();lv_call_sms_safe.setAdapter(adpater);break;
18、protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.call_sms_safe);ll_call_sms_safe_loading = (LinearLayout) findViewById(R.id.ll_call_sms_safe_loading);dao = new BlackNumberDao(this);lv_call_sms_safe = (ListView) findViewById(R.id.lv_call_sm
19、s_safe);ll_call_sms_safe_loading.setVisibility(View.VISIBLE);registerForContextMenu(lv_call_sms_safe);new Thread() public void run() blacknumbers = dao.findAll();Message msg = Message.obtain();msg.what = LOAD_DATA_FINISH;handler.sendMessage(msg);.start();public void onCreateContextMenu(ContextMenu m
20、enu, View v,ContextMenuInfo menuInfo) super.onCreateContextMenu(menu, v, menuInfo);MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.call_sms_safe_menu, menu);public boolean onContextItemSelected(MenuItem item) AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo()
21、;int position = (int) info.id; switch (item.getItemId() case R.id.item_delete:Log.i(TAG, 删除黑名单记录);deleteBlackNumber(position);return true;case R.id.item_update:Log.i(TAG, 更新黑名单记录);updateBlackNumber(position);return true;default:return super.onContextItemSelected(item);public void addBlackNumber(View
22、 view) showBlackNumberDialog(0, 0);private void showBlackNumberDialog(final int flag, final int position) AlertDialog.Builder builder = new Builder(this);View dialogview = View.inflate(this, R.layout.add_black_number, null);final EditText et_number = (EditText) .findViewById(R.id.et_add_black_number
23、);final CheckBox cb_phone = (CheckBox) dialogview.findViewById(R.id.cb_block_phone);final CheckBox cb_sms = (CheckBox) dialogview.findViewById(R.id.cb_block_sms);TextView tv_title = (TextView) dialogview.findViewById(R.id.tv_black_number_title);if (flag = 1) tv_title.setText(修改);BlackNumber blackNum
24、ber = (BlackNumber) lv_call_sms_safe.getItemAtPosition(position);String oldnumber = blackNumber.getNumber();et_number.setText(oldnumber);int m = blackNumber.getMode();if(m=0)cb_phone.setChecked(true);cb_sms.setChecked(false);else if(m=1)cb_sms.setChecked(true);cb_phone.setChecked(false);elsecb_phone
25、.setChecked(true);cb_sms.setChecked(true);builder.setView(dialogview);builder.setPositiveButton(确定, new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int which) String number = et_number.getText().toString().trim();if(flag=1&dao.find(number)Toast.makeText(getApplicati
26、onContext(), 号码已经存在,0).show();return ;if (TextUtils.isEmpty(number) return; else boolean result = false;BlackNumber blacknumber = new BlackNumber();blacknumber.setNumber(number);if (cb_phone.isChecked() & cb_sms.isChecked() if (flag = 0) /flag=1表示是添加黑名单号码result = dao.add(number, 2);blacknumber.setMo
27、de(2); else BlackNumber blackNumber = (BlackNumber) lv_call_sms_safe.getItemAtPosition(position);dao.update(blackNumber.getNumber(), number, 2);blackNumber.setMode(2);blackNumber.setNumber(number);adpater.notifyDataSetChanged(); else if (cb_phone.isChecked() if (flag = 0) result = dao.add(number, 0)
28、;blacknumber.setMode(0); else BlackNumber blackNumber = (BlackNumber) lv_call_sms_safe.getItemAtPosition(position);dao.update(blackNumber.getNumber(), number, 0);blackNumber.setMode(0);blackNumber.setNumber(number);adpater.notifyDataSetChanged(); else if (cb_sms.isChecked() if (flag = 0) result = da
29、o.add(number, 1);blacknumber.setMode(1);elseBlackNumber blackNumber = (BlackNumber) lv_call_sms_safe.getItemAtPosition(position);dao.update(blackNumber.getNumber(), number, 1);blackNumber.setMode(1);blackNumber.setNumber(number);adpater.notifyDataSetChanged(); else Toast.makeText(getApplicationConte
30、xt(), 拦截模式不能为空, 0).show();return;if (result) blacknumbers.add(blacknumber);adpater.notifyDataSetChanged(););builder.setNegativeButton(取消, new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int which); builder.create().show();4.4 通讯录卫士-实际运行测试图4-4-1 实际运行测试图5 模块二:软件管理模块5.
31、1 软件管理-业务处理流程图5-1-1 业务处理流程图5.2 软件管理-界面设计5.2.1 主界面图5-2-1软件管理主界面设计图5.3 软件管理-代码实现(主要代码实现)public class AppManagerActivity extends Activity implements OnClickListenerprotected static final int LOAD_APP_FINSISH = 50;private static final String TAG = AppManagerActivity;private TextView tv_appmanager_mem_av
32、ail;/显示手机可用内存private TextView tv_appmanager_sd_avail;/显示Sdcard可用内存private ListView lv_appmanager;/展示用户程序、系统程序private LinearLayout ll_loading;/ProgressBar的父控件,用于控制该控件中的子控件的显示private PackageManager pm; / 相当于windows系统下面的程序管理器(可以获取手机中所有的应用程序)private List appinfos;/存放手机中所有的应用程序(用户程序+系统程序)private List use
33、rappInfos;/存放用户程序private List systemappInfos;/存放系统程序/PopupWindow中contentView对应的三个控件private LinearLayout ll_uninstall;/卸载private LinearLayout ll_start;/启动private LinearLayout ll_share;/分享private PopupWindow popupWindow;private String clickedpackname;/当应用程序在子线程中全部加载成功后,通知主线程显示数据private Handler handler
34、 = new Handler() public void handleMessage(android.os.Message msg) switch (msg.what) case LOAD_APP_FINSISH:ll_loading.setVisibility(View.INVISIBLE);lv_appmanager.setAdapter(new AppManagerAdapter();break;/* * 将手机中的应用程序全部获取出来 */private void fillData() /加载数据时,ll_loading控件中的ProgressBar以及TextView对应的“正在加载
35、数据.”显示出来ll_loading.setVisibility(View.VISIBLE);new Thread() public void run() AppInfoProvider provider = new AppInfoProvider(AppManagerActivity.this);appinfos = provider.getInstalledApps();initAppInfo();/向主线程发送消息Message msg = Message.obtain();msg.what = LOAD_APP_FINSISH;handler.sendMessage(msg);.sta
36、rt();5.4 软件管理-实际运行测试 图5-4-1 实际运行测试图6 测试分析6.1 测试概要6.1.1 测试设备基于Android 2.2系统以上的安卓手机两台6.1.2 测试方法主要采用黑盒测试,以需求分析文档中的功能模块为单位,测试的重点集中在验证功能是否能正常运行。6.2 测试结果及发现6.2.1 手机防盗测试结果:能正常的设置手机防盗信息;SIM卡变更通知,GPS追踪等功能均正常6.2.2 通讯卫士测试结果:能正常的添加删除黑名单号码,并且能对黑名单内的号码进行拦截6.2.3 软件管理测试结果:软件分享、卸载、运行功能均能正常运行。6.3 对软件功能的结论6.3.1 手机防盗6.
37、3.1.1 能力用户设置密码之后,能顺利进入设置界面设置防盗功能,功能开启后可根据远程指令向手机发送信息指令,用来锁定手机、获取手机的位置、远程销毁手机的数据。6.3.1.2 限制 手机防盗功能测试时,设备主要基于两种状态测试:在线和离线;测试之后验证该功能必须要求手机能正常通讯时才能正常使用查找设备,收发信息指令的功能。6.3.2 通讯卫士6.3.2.1 能力 用户设置好要拦截的电话号码,并选择拦截内容之后;开启拦截功能之后,软件能根据预设拦截相应的电话或者短信。6.3.2.2 限制 测试数据值包括数字和其他非法字符的输入。通过测试,系统基本上能实现以上功能,并且会自动检查输入的数据是否符合
38、规范。6.3.3 软件管理6.3.3.1 能力用户打开该功能时,能够查看本机的用户应用和系统应用。并能选择运行、卸载、分享等功能。 6.3.3.2 限制出于安全考虑,系统应用不能主动卸载;避免用户因为误卸载,而使系统出现不可预知的错误。6.4 分析摘要6.4.1 能力 该系统基本实现了需求规格说明书中对手机防盗、通讯卫士、软件管理的功能要求。6.4.2 缺陷和限制就已实现的部分功能而言,整体上基本能较好的实现部分模块之间的接口,各模块功能也能基本完成。6.4.3 建议1.离线时,能自动判断当前系统环境,在能接入运营商网络的时候,自动执行相应手机防盗操作。2.设置黑名单时,能够自动判断当前输入的
39、号码是否是正确的电话号码。6.4.4 评价各个模块功能已经达到需求规格说明书中的要求,能够交付使用。6.5 测试资源消耗测试人员:一人测试设备:安卓系统2.2以上的安卓手机2台测试消耗时间:2天参考文献:1 陈志泊主编数据库原理及应用教程第二版人民邮电出版社2008:219-247页2 张海藩编著软件工程导论第五版清华大学出版社2008:146-183页3 黄伟、张瑞霞、王亚亮、刘炎兰Android手机安全防护系统大众科技2013年第15卷167期38-41页4 美Mark L. Murphy著,李雪飞、吴明晖译Android开发入门教程第一版人民邮电出版社2010:4-263页5 於东军、杨
40、静宇、李千目、王国全编著Java程序设计与应用开发第二版清华大学出版社2009:1-314页6 李铮山、林干、范文浩、吴帆Android的应用程序安全评估系统设计软件2012年第33卷第12期289-291页7 王志国、侯银涛、石荣Android智能手机系统的文件实时监控技术计算机安全2009年第7卷第12期45-47页8 薛华成主编管理信息系统第二版清华大学出版社2012:362-439页9 谭浩强著C程序设计第三版清华大学出版社2005:14-20210 皮德常著C+程序设计教程第一版机械工业出版社2009:1-114页11 严蔚敏、吴伟民著数据结构(C语言版)第二版清华大学出版社2010:18-138页12 孙伟Android移动终端操作系统的安全分析软件2013年第34卷第4期105-109页13 李涛、秦海超基于Android手机安全防护系统的研究现代计算机2011年第12卷52-54页第 18 页 (共 18 页)