在手机系统中,每个应用都有它特有的特征信息,它是该应用所特有的,每个应用都是不同的,这就是手机的特征码。
手机应用的特征码包括:包名和应用签名。
Android中,同一个包名的程序,只允许安装一个。所以每个应用的包名都是不同的。每个程序的签名文件都不相同,因为每个开发者的签名文件都是特有的。
基于特征码的杀毒方式,是在已知病毒应用特征码的情况下,通过检测手机安装应用的特征码跟病毒数据库中的特征码是否相同,如果找到相同的数据库,则说明该应用为病毒应用。所以病毒数据库是关键。各杀毒软件的原理都是相同的,区别主要在于杀毒引擎。杀毒引擎用于获取手机应用的特征码,并依据此特征码码查询病毒数据库的算法。
【基于签名的特征码的扫描(hash码-md5特征码的扫描)】
- 特征:只能查杀已知的病毒,不能查杀未知的病毒。
- 原理:病毒库中保存病毒对应的hash,通过比较程序签名和病毒库中的签名判断是否病毒。
- 杀毒引擎用于获取硬件上文件的hash码,并依据此hash码查询数据库的算法.
【特征库的建立】
首先,我们需要部署大量的“蜜罐”服务器,也就是没有安装杀毒软件、防火墙等的赤裸裸的手机或服务器,让病毒很轻易的入侵。
然后,由病毒工程师来对它们进行分析,提取特有的特征码,加入到特征码服务器里面,以供手机安全卫士调用。当有新的病毒的时候,它们会被及时的下载到手机安全卫士里面,以供比对查杀。
当进行云查杀的时候,手机安全卫士提取本地所有应用的特征码,发送到云服务器进行比对,然后将比对结果返回给手机安全卫士,告诉手机用户查杀结果,比如:哪些软件是病毒,哪些游戏会窃取话费,哪些壁纸具有高危风险等。
如果在未知病毒特征码的情况下进行杀毒,那就是通过监控高危的API权限的调用,这是一种主动防御手段。
例如监控以下敏感操作:
- 更改浏览器主页
- 注册开机启动的行为
- 应用程序的内存注入
下面代码基于病毒的特征值,在安全防护软件的本地资源路径下建立并保存病毒特征值数据库,然后在杀毒程序中将本机应用包的签名值与病毒特征值进行对比,如果匹配则进行病毒处理。
其中,病毒数据库的具体内容使用adb工具查看如下:
首先建立获取特征值列表的数据库底层操作类:
具体代码如下:
直观视图:
扫描结果:
病毒MD5特征值中涉及了MD5的加密存储问题,故此处解释下加盐加密存储。
加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。
几种常见的破解密码的方法: 最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。
字典破解和暴力破解都是效率比较低的破解方式。如果你知道了数据库中密码的哈希值,你就可以采用一种更高效的破解方式,查表法(Lookup Tables)。还有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小异。现在我们来看一下查表法的原理。
查表法不像字典破解和暴力破解那样猜密码,它首先将一些比较常用的密码的哈希值算好,然后建立一张表,当然密码越多,这张表就越大。当你知道某个密码的哈希值时,你只需要在你建立好的表中查找该哈希值,如果找到了,你就知道对应的密码了。
从上面的查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。盐(Salt)是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。
实现代码: