此文有借鉴的地方,关键是大家能学到技术)
杀毒原理:首先给大家看一副图片(借鉴):
原理简介:
首先,我们需要部署大量的“蜜罐”服务器,也就是没有安装杀毒软件、防火墙等的赤裸裸的手机或服务器,让
病毒很轻易的入侵。然后,由病毒工程师来对它们进行分析,提取特有的特征码,加入到特征码服务器里面,以供手
机安全卫士调用。当有新的病毒的时候, 它们会被及时的下载到手机安全卫士里面,以供比对查杀。当进行云查杀的
时候,手机安全卫士提取本地所有应用的特征码,发送到云服务器进行比对,然后将比对结果返回给手机安全卫士,
告诉手机用户查杀结果,比如:哪些软件是病毒,哪些游戏会窃取话费,哪些壁纸具有高危风险等。
特征码:
在手机系统中,每个应用都有它特有的特征信息,这些信息在每个应用中都不相同。对,这就是手机的特征码。
在Android系统中,每个软件所特有的信息都有啥呢?也许你已经想到了,对!包名,就是应用程序的包名。Android
中,同一个包名的程序,只允许安装一个。
还有什么不同呢?每个程序的签名文件都不相同。因为每个开发者的签名文件都是特有的。病毒制造者只能用它
自己的签名文件来给病毒应用签名。
当然啦,如果结合包名和签名,杀毒会更加的准确,效果会更好!
此外,需要说明的是,基于特征码的杀毒方式,是在已知病毒特征码的情况下。如果在未知病毒特征码的情况下
进行杀毒,那就是通过监控高危的API权限的调用,进行主动防御啦!
程序举例:
接下来,就是我们的程序了,还是那句话,程序虽然简单,举一反三是关键。
<a.>当我们点击查询按钮的时候,对系统中所有的应用程序包,包括未安装的在内,进行包名的检查,并且与特
定的 特征 码进行比对,如果比对成功,则是病毒,否则,就是安全的。
在代码中,我们首先创建了一个包管理器,然后通过包管理器获得所有应用程序包的所有信息;然后,通过
循环方法,将每个应用包的包名取出来,并且与特定的特征码进行比对,如果比对成功,则对病毒数加1。以此类
推,直到将所有的包的包名比对完毕;然后,发布一条信息,提示我们杀毒的结果。
当我们将信息发送出去后,就需要通过Handler对发送的信息进行分析和显示。
<以上都是整理高人奕奕微笑 的博客弄出来的,主要是理论的东西,理论咱不太好弄,只学习技术>
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="@string/button1"
android:onClick="shadu"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="180dp"
android:text="@string/button2" />
</LinearLayout>
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbarFadeDuration="3000"
android:background="@drawable/a" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
<LinearLayout
android:id="@+id/myLinearlayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
MainActivity.java
需要说明的是,这里规定的病毒包同时也是这个程序的包名。这样先易后难,理解方便一点。
public class MainActivity extends Activity {
private String resultString;
private int total = 0;
private int STOP = 0;
private LinearLayout myLinearLayout;
private ScrollView myScrollView;
private TextView myTextView;
private Button button1,button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myLinearLayout = (LinearLayout) this.findViewById(R.id.myLinearlayout);
myScrollView = (ScrollView) this.findViewById(R.id.scrollView1);
myTextView = (TextView) this.findViewById(R.id.text);
button1 = (Button) this.findViewById(R.id.button1);
button1.setOnClickListener(new myonclickLister());
button2 = (Button) this.findViewById(R.id.button2);
button2.setOnClickListener(new myfinshLister());
}
//button1
class myonclickLister implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 创建包管理器的实例对象
PackageManager myPackageManager=getPackageManager();
//获取所有应用的包的信息
List<PackageInfo> allinfos=myPackageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES|PackageManager.GET_SIGNATURES);
//通过循环获取包名
for(PackageInfo everyinfo : allinfos){
// String resultString=everyinfo.packageName;
resultString=everyinfo.packageName;
//以包名为特征码进行比对
if("com.example.android_yingyong".equals(resultString)){
total=total+1;//病毒计数
}
//将查询到的包名发送出去
Message msg=new Message();
msg.obj=resultString;
myHandler.sendMessage(msg);
}
//进行病毒数的判断,以决定发送何种信息
if(total==0){
Message msg=new Message();
msg.what = STOP;
msg.obj="共发现"+total+"个病毒!非常的安全!";
myHandler.sendMessage(msg);
} else if(total>0){
Message msg=new Message();
msg.what=STOP;
msg.obj="共发现"+total+"个病毒!请注意及时查杀!\n"+resultString;
myHandler.sendMessage(msg);
}
}
}
//button2
class myfinshLister implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
}
private Handler myHandler=new Handler(){
public void handleMessage(Message msg){
//收到杀毒完毕时的处理
if(msg.what==STOP){
myLinearLayout.removeAllViews();
}
//获取信息,添加到TextView控件上
String resultStr=(String) msg.obj;
myTextView.setTextColor(Color.BLUE);
myTextView.setText(resultStr);
//将TextView控件显示到线性布局上
myLinearLayout.setOrientation(LinearLayout.VERTICAL);
myLinearLayout.addView(myTextView);
//滚动显示
myScrollView.scrollBy(0, 20);
}
};
}
上图,自己测试的程序。不过有一个小缺陷,就是ScrollView这个空间没有显示出动态效果,由于对ScrollView不太
熟悉,所以,大家还是自己去研究吧,去网上一搜就可以了。