1、信息同步系统之手机安全卫士 进程管理、 流量统计 、手机杀毒 摘 要:在本手机安全卫士中,涉及到针对某个病毒的专有杀毒程序。当手机病毒刚出现的时候,由于病毒数目很少,而且并不具有实质性的危害,安全厂商往往通过提供专有杀毒程序的形式来解决威胁。 基于病毒文件HASH描述的反病毒扫描技术。 是通过给对应的病毒计算HASH,然后通过文件扫描找到对应的病毒。基于HASH计算的反病毒引擎算法简单,而且病毒定义方式也很容易但是但是由于灵活性及效率原因,很快就被淘汰。 基于通用病毒定义语言的反病毒扫描技术。通用的病毒定义语言可以用最少的代价描述一个或者多个病毒,并极大的优化了扫描引擎的性能。关键词:安全;手
2、机安全卫士;进程管理; 流量统计 ;手机杀毒Abstract: in the mobile phone security guards, relates to the a virus proprietary antivirus program. When the mobile phone virus first appeared, as the virus are few in number, but does not have a substantial risk, security vendors often by providing proprietary antivirus progr
3、am forms to address the threat. Anti virus scan virus file based on HASH description. Through to the corresponding virus HASH is calculated, and then through the file scan to find the corresponding virus. Based on the anti virus engine algorithm of HASH computing is simple, but the virus definition
4、mode is also very easy but because of flexibility and efficiency reasons, soon to be eliminated. Anti virus scanning technology based on the universal virus definition language. Virus definition language can describe one or more viruses with the least cost, and greatly improved the performance of sc
5、anning engine.Keywords: security; mobile phone security guards; process management; traffic statistics; mobile phone antivirus目录 目录31 绪论41.1 背景41.2 开发思路和计划52 系统需求62.1 范围72.2 定义72.3功能需求73 数据库设计73.1数据流程图73.2数据字典分析84 设计说明84.1系统概述84.2 数据库实施95 模块一:进程管理模块105.1进程管理器-代码实现101)首先需要一个结构保存进程信息102)然后一个获取进程列表的类,用
6、于获取当前正在运行的进程列表:113)首先为用户进程和系统进程对应的ListView设置适配数据:134)在onCreate里初始化控件并获取进程列表,分别设置给两个listview:145) 全选按钮的处理事件:166) 一键清理按钮的处理事件:177) 权限添加:185.2 进程管理器-界面设计181) 创建android component:TaskManagerActivity,并为其创建布局文件taskmanager_layout195.3 部分算法设计205.4 接口225.5 子功能模块的测试226 模块二:流量统计模块236.1 原理236.2流量统计-界面设计271)这里联系
7、使用抽屉控件SlidingDrawer,布局文件:276.3 流量统计-代码实现276.3.1 类似程序管理器、进程管理器里的软件信息、进程信息,设置一个TrafficInfo结构体来表示流量信息:276.3.2获取流量信息的TrafficInfoProvider:286.3.3 部分算法设计296.3.4 接口307 模块七:手机杀毒模块317.1 手机杀毒-界面设计317.2 手机杀毒-代码实现327.2.1病毒库直接使用assets目录下的antivirus.db文件,查询该数据库的类AntiVirusDao:327.2.2其中Md5Encoder:337.2.3需要事先将antivir
8、us.db文件从assets目录复制到程序目录下,在SplashActivity的创建更新线程后添加:347.2.3 部分算法设计357.2.4 接口367.2.5 测试378 技术控制:3810 参考文献:42 1 绪论1.1 背景 本次开发是由安博教育和学校发起,学生自主选题的一次毕业设计。伴随智能手机的不断普及,移动互联网的快速发展,伴随着3G时代的到来,智能手机的广泛应用,安卓成为活跃用户量最大的移动终端操作系统,并且安卓操作系统是开放源代码的,所以每个人都可以开发出一个安卓应用,导致安卓的应用数不胜数。由于安卓的开源,导致每个人可以对安卓端的软件进行编写,而有些开发者在应用中加入一些
9、非法的代码,窃取用户的隐私,使得手机的安全问题日益明显,手机安全问题关注度日益提高。 随着Android平台的发展和普及,Android已经成为恶意代码的下一个肆虐之地,这里我把一些漏洞的原理和技巧加以整理总结,起到抛砖引玉的作用,希望大家能够把这些知识用到以后反病毒和软件保护的工作中. 不需要懂得信息安全的人是幸福的,而我们的职责是保障他们的幸福。 1.2 开发思路和计划 在和指导老师多次交流后,确定实现方案的要点和工作计划。 整体项目采用MVC框架,是对android知识点的综合应用,用到的技术有 activity,service,broadcast,content provider,No
10、tification,sqlite数据库,自定义title,自定义控件,widget,aidl进程间通讯等,本项目所实现的功能如下: 手机防盗: 根据预设参数,判断手机是否被盗,根据自定义协议发送手机中SIM卡的信息和手机的位置信息给安全号码。可远程通过短信指令,给手机设置锁屏密码,远程锁定手机屏幕,远程格式化手机SD卡,恢复出厂设置,极大的保护用户的隐私安全,通过aidl注册admin设备,一般用户无法卸载该程序。 通讯卫士: 来电号码归属地显示,来电归属地位置的调整,来电黑名单/短信黑名单管理。电话短信备份和还原,保护手机的数据和通讯安全。 软件管理: 系统软件和本地软件,可以显示软件的详
11、细信息,启动、删除、分享应用程序。程序锁可以指定要保护的程序,用户进入要保护的程序之前必须输入密码。 进程管理: 显示当前系统运行的进程信息,显示系统内存信息,可以杀死某个进程,批量杀死进程,通过桌面widget实时展现用户当前的手机内存状态。 手机杀毒:从服务器下载最新的病毒库,根据程序的包名和程序的数字签名识别病毒,提示用户并查杀恶意软件,使吸费木马无处可藏。 系统优化:清理手机缓存,提高手机性能,优化电池管理。 高级工具:手机号码归属地查询,更改归属地位置,常用号码查询。 设置中心:可以对是否开启防盗、是否开启程序锁服务等功能进行设置,还可以更改来去电显示的风格。 和研究任何其它软件项目
12、一样,我做的毕业设计也经历了从选题,调研,熟悉开发环境,实验关键技术,查找类似的相关系统的资料;系统概要设计,数据库结构设计,功能模块开发,功能模块测试,系统调试和系统试运行和修改。如下1.2-1开发计划流程图:选题调查研究资料查询开发环境熟悉学习android技术概要设计数据库的设计功能模块开发和详细设计功能模块测试项目调试和修改需求分析 图1.2-1开发计划流程图2 系统需求2.1 范围本次开发的系统为手机安全卫士。用于广大Android手机用户,包括手机防盗 、通讯卫士、 软件管理 、进程管理、 流量统计 、手机杀毒、系统优化、高级工具、设置中心2.2 定义MS MobileSafe (
13、手机安全卫士)的缩写。 2.3功能需求1) 进程管理:显示当前系统运行的进程信息,显示系统内存信息,可以杀死某个进程,批量杀死进程,通过桌面widget实时展现用户当前的手机内存状态。2) 流量统计: 可以统计安卓手机的gprs上传流量、下载流量和总的使用流量。并且可以统计每个应用的单独流量,本站之前也介绍过几套源码,都有这个功能,例如Android应用源码急速多功能手机助手项目、Android应用源码基于安卓的个人隐私监控项目、Android应用源码安卓手机安全卫士更新版、Android应用源码手机安全防火墙项目等项目都有流量统计功能。3) 手机杀毒:从服务器下载最新的病毒库,根据程序的包名
14、和程序的数字签名识别病毒,提示用户并查杀恶意软件,使吸费木马无处可藏。3 数据库设计3.1数据流程图 1) 病毒数据库的信息,包含的属性有ID、MD5数字签名、类型、名称。描述手机里有病毒查杀的模块,其工作原理是扫描出应用程序的信息,查询到应用程序的签名和病毒数据库里面的存储的数字签名进行比对,如果相同,则说明是数据库,否则,不是,病毒数据库信息的E-R模型如图5.6所示。图5.6 病毒信息的E-R图 3.2数据字典分析1)手机杀毒数据表表1.1. 手机杀毒数据表NameDeclared typeTypeSizeNot null_idvarchar(2)integer2yesmd5varcha
15、r(30)varcher30yestypevarchar(2)varcher2yesnamevarchar(30)varcher30yesdescvarchar(30)varcher30yes4 设计说明4.1系统概述本次项目的设计就是要开发一个手机安全卫士的软件,它属于一个系统级别的软件,通过设置可以监听用户的电话及短信号码,判断是否是黑名单以便于进行拦截,还可以进行手机病毒的查杀、系统优化、软件管理、进程管理、程序锁等功能。本项目致力于设计一个松耦合的功能,降低模块之间的联系,以便后期的维护与再设计。系统设计的原则如下所示。 模块化模块化设计不仅减低了模块之间的耦合性,使得系统容易修改,而
16、且推动了系统各个部分的并行开发,从而提高了软件的设计效率。 模块独立性模块独立性是指软件系统中每个模块只涉及软件要求的具体子功能,而和软件系统中其他模块的功能是无关的。模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结构。4.2 数据库实施数据库实施是指根据逻辑设计和物理设计的结果,在计算机上建立起实际的数据库结构、装入数据、进行测试和试运行的过程。数据库的实施主要包括:建立实际数据库结构、装入数据、应用程序编码与调试、数据库试运行和整理文档。1) 通过执行代码控制数据库的增、删、改、查,具体添加数据并查询出结果,对于手机杀毒的数据库的测试结果如图5.8所示。图5.8 手机杀毒的病毒数
17、据库2)常用号码的数据库测试结果如图5.9所示。图5.9 常用号码数据库数据库的试运行,通过代码的方式往数据库中装入数据,并读取出来显示到界面上,观察显示的数据和装入到数据库中的数据是否一致,来测试数据库是否能完美运行。测试结果是在数据库方面没有大的问题,能够进行正常的增、删、改、查,这样数据库设计也算是告一段落了。5 模块一:进程管理模块5.1 进程管理器-代码实现1)首先需要一个结构保存进程信息 public class ProcessInfo /应用程序包名private String packname; /应用程序图标private Drawable icon;/应用程序所占用的内存空
18、间,单位是byteprivate long memsize; /是否属于用户进程private boolean userprocess;/进程的pid(进程的标记)private int pid;/应哟个程序名称private String appname;/应用程序在Item中是否处于被选中状态(默认下没有被选中)2)然后一个获取进程列表的类,用于获取当前正在运行的进程列表: public class ProcessInfoProvider private static final String TAG = ProcessInfoProvider; private Context conte
19、xt; public ProcessInfoProvider(Context context) this.context = context; /* * 返回所有的正在运行的程序信息 * return */ public List getProcessInfos() /am可以动态的获取应用的进程信息,相当于PC机上的进程管理器 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); /pm可以静态的获取到手机中的所有应用程序信息,相当于PC机上的程序管理器 Packa
20、geManager pm = context.getPackageManager(); /返回所有正在运行的进程 List runingappsInfos = am.getRunningAppProcesses(); /用于存放进程信息 List processInfos = new ArrayList(); /遍历出每个进程,并将每个进程的信息封装在ProcessInfo对象中,最后将所有的进程存放在List中返回 for (ActivityManager.RunningAppProcessInfo info : runingappsInfos) /用于封装进程信息 ProcessInfo
21、processInfo = new ProcessInfo(); /获取进程的pid(进程的标记) int pid = info.pid; /将进程的pid、processName、memsize封装到ProcessInfo对象中 processInfo.setPid(pid); String packname = info.processName; processInfo.setPackname(packname); /获取到该进程对应的应用程序所占用的内存空间 long memsize = am.getProcessMemoryInfo(new int pid )0.getTotalPri
22、vateDirty() * 1024; processInfo.setMemsize(memsize); try /通过进程的packname来获取到该进程对应的应用程序对象(获取到应用程序的对象后,就可以通过该对象获取应用程序信息) ApplicationInfo applicationInfo = pm.getApplicationInfo(packname, 0); /判断该应用程序是否是第三方应用程序,便于以后分类 if(filterApp(applicationInfo) processInfo.setUserprocess(true); else processInfo.setUs
23、erprocess(false); /分别获取到应用程序的图标和名称,并将其封装到ProcessInfo对象中 processInfo.setIcon(applicationInfo.loadIcon(pm); processInfo.setAppname(applicationInfo.loadLabel(pm).toString(); catch (Exception e) /这里会抛出一个包名未找到异常,我们将其设置为系统进程,应用图标为默认的系统图标 e.printStackTrace(); processInfo.setUserprocess(false); processInfo.
24、setIcon(context.getResources().getDrawable(R.drawable.ic_launcher); processInfo.setAppname(packname); processInfos.add(processInfo); processInfo = null; return processInfos; /* * 三方应用的过滤器 ,如 * * param info * return true 三方应用 false 系统应用 */ public boolean filterApp(ApplicationInfo info) if (info.flags
25、 & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) return true; else if (info.flags & ApplicationInfo.FLAG_SYSTEM) = 0) return true; return false; 3)首先为用户进程和系统进程对应的ListView设置适配数据: private class UserAdapter extends BaseAdapter public int getCount() return userProcessInfos.size(); public Object getItem
26、(int position) return userProcessInfos.get(position); public long getItemId(int position) return position; public View getView(int position, View convertView, ViewGroup parent) View view; / 使用堆内存中的唯一的一份字节码(ListView的优化) ViewHolder holder = new ViewHolder(); / 复用缓存(ListView的优化) if (convertView = null)
27、 else / 使用缓存的view view = convertView; / 获取到缓存的view的标记 holder = (ViewHolder) view.getTag(); / 从用户进程对应的集合中取出对应的元素做数据的适配 ProcessInfo info = userProcessInfos.get(position); / 如果应用程序是我们自己的手机卫士,隐藏掉Checkbox(避免杀死自己) if (info.getPackname().equals(getPackageName() holder.cb.setVisibility(View.INVISIBLE); else
28、 holder.cb.setVisibility(View.VISIBLE); / 为Item适配数据:应用图标、名称、占用内存大小、是否处于选中状态(默认情况下都是未选中状态) holder.iv_icon.setImageDrawable(info.getIcon(); holder.tv_name.setText(info.getAppname(); holder.tv_mem.setText(Formatter.formatFileSize(getApplicationContext(), info.getMemsize(); holder.cb.setChecked(info.isC
29、hecked(); / 返回Item对应的view return view; / 使用static修饰,可以保证该对象在堆内存中只存在一份字节码文件(所有的Item共用该字节码文件) static class ViewHolder ImageView iv_icon; TextView tv_name; TextView tv_mem; CheckBox cb; / 为系统进程对应的ListView适配数据 private class SystemAdapter extends BaseAdapter 4)在onCreate里初始化控件并获取进程列表,分别设置给两个listview:publi
30、c void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.taskmanager_layout); / 默认情况下,显示的是用户进程列表 showUserApp = true; provider = new ProcessInfoProvider(this); userProcessInfos = new ArrayList(); systemProcessInfos = new ArrayList(); / 通过provider来获取手机中的所有
31、进程 List mRunningProcessInfos = provider.getProcessInfos(); / 将获取到的所有进程进行分类存储(用户进程和系统进程) for (ProcessInfo info : mRunningProcessInfos) if (info.isUserprocess() userProcessInfos.add(info); else systemProcessInfos.add(info); / 用户进程对应的ListView及设置ListView的点击事件 lv1 = (ListView) findViewById(R.id.lv_userta
32、sk); lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView parent, View view,int position, long id) CheckBox cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); / 获取到被点击的Item对象 ProcessInfo info = (ProcessInfo) lv1.getItemAtPosition(position); / 判断被点
33、击的Item是否是我们自己的手机安全卫士条目(我们不允许杀死自己的应用程序) if (info.getPackname().equals(getPackageName() return; / 手动的设置Checkbox的状态 if (info.isChecked() info.setChecked(false); cb.setChecked(false); else info.setChecked(true); cb.setChecked(true); ); / 系统进程对应的ListView及设置ListView的点击事件 lv2 = (ListView) findViewById(R.id
34、.lv_systemtask); lv2.setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView parent, View view, int position, long id) / 禁止 响应系统进程中的第一个Item的点击事件 if (view instanceof TextView) return; CheckBox cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); / 获取到被点击的It
35、em对象 ProcessInfo info = (ProcessInfo) lv2 .getItemAtPosition(position); / 手动的设置Checkbox的状态 if (info.isChecked() info.setChecked(false); cb.setChecked(false); else info.setChecked(true); cb.setChecked(true); ); / 为“用户进程”按钮注册一个监听器 bt_user = (Button) findViewById(R.id.bt_task_user); bt_user.setOnClickL
36、istener(this); bt_user.setTextColor(Color.WHITE); bt_user.setBackgroundDrawable(getResources().getDrawable(R.drawable.bt_pressed); / 为“系统进程”按钮注册一个监听器 bt_system = (Button) findViewById(R.id.bt_task_system); bt_system.setOnClickListener(this); bt_system.setTextColor(Color.WHITE); bt_system.setBackgrou
37、ndDrawable(getResources().getDrawable(R.drawable.bg_normal); / 默认情况下显示的是用户进程列表,所以我们应当将系统进程列表设置为不可见。View.GONE:View无效,且不占用空间 lv2.setVisibility(View.GONE); / 为用户进程列表设置数据适配器 useradapter = new UserAdapter(); lv1.setAdapter(useradapter); / 将该TextView做为系统进程对应的ListView的第一个Item tvheader = new TextView(getApplicationContext(); tvheader.setText(杀死系统进程会导致系统不稳定); tvheader.setBackgroundCo
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100