A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

首先上代码,绝对原创。。里面是我加的注释,大家可以一起交流下。。在运行的时候,老是说空指针异常,后来才发现是用md5加密传值时,忘了写GET_SIGNATURES。。特贴出来警告自己。。
杀毒软件的原理:


1.基于签名的特征码的扫描(hash码-md5特征码的扫描)
有一个病毒数据库, 保存的有 病毒对应的hash.
特征:只能查杀已知的病毒,不能查杀未知的病毒.



杀毒引擎: 获取hash 查询数据库的算法.
病毒库上: 千万条数据


联网->实时更新病毒数据库


服务器集群: 蜜罐.->病毒分析工程师.


2.主动防御:
监控敏感api ,
更改浏览器主页.
注册开机启动的行为
应用程序的内存注入


3.启发式扫描:
根据程序敏感的api 提示风险代码


4.云查杀





代码:
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.AnimationDrawable;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {

        protected static final int stop=100;
        private ImageView iv;
        private ProgressBar pb;
        private LinearLayout ll;
        private SQLiteDatabase db;
        private ScrollView sc;
        private boolean flagscanning=false;
        private AnimationDrawable anim;
        private Handler handler=new Handler(){
               
                public void handleMessage(Message msg) {
                       
                       
                        super.handleMessage(msg);
                        if(msg.what==stop){
                                ll.removeAllViews();
                                anim.stop();
                        }
                       
                        String str=(String) msg.obj;//把msg.obj存到str中、通过handler进行发送
                        TextView tv=new TextView(getApplicationContext());
                        tv.setText(str);
                        ll.setOrientation(LinearLayout.VERTICAL);
                        ll.addView(tv);
                        sc.scrollBy(0, 20);
                       
                }
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                db=SQLiteDatabase.openDatabase("/sdcard/antivirus.db", null, SQLiteDatabase.OPEN_READONLY);
               
                iv=(ImageView) this.findViewById(R.id.iv);
                pb=(ProgressBar) this.findViewById(R.id.pb);
                ll=(LinearLayout) this.findViewById(R.id.ll);
                sc=(ScrollView) this.findViewById(R.id.sc);
               
                iv.setBackgroundResource(R.drawable.anti_anim);
                anim=(AnimationDrawable) iv.getBackground();
               
               
       
        }
       
       
        @Override
        public boolean onTouchEvent(MotionEvent event) {
                if(flagscanning)
                        return false;//如果触摸多次,则返回false.
                //如果触摸一次,就执行程序
                if(event.getAction()==MotionEvent.ACTION_UP){
                        flagscanning=true;
                anim.start();//帧动画的启动
               
                new Thread(){
                        public void run() {
                                //获取每一个应用程序的签名,获取到到这个签名后,需要在数据库里面查询。
                                List<PackageInfo> infos=getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES
                                                | PackageManager.GET_SIGNATURES);//终于正常了,那个空指针异常出现在这里,没有得到SIGNATURES..
                                pb.setMax(infos.size());
                                int total=0;//用来记录扫描的进度
                                int virustotal=0;//用来记录扫描后病毒的个数
                                for(PackageInfo info:infos){
                                        total++;
                                        try {
                                                sleep(20);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        Message msg=Message.obtain();
                                        msg.obj="正在扫描"+info.packageName;
                                        handler.sendMessage(msg);
                                        Signature [] signs=info.signatures;
                                        //System.out.println(signs[0].toCharsString());
                                        String str = signs[0].toCharsString();
                                        String md5=MD5Encoder.encode(str);
                                        if("6c20c50051ad1dedce0528e0f3dfbc96".equals(md5)){//病毒特征码
                                                        System.err.println("----------");
                                                }

                                        Cursor cursor=db.rawQuery("select desc from datable where md5=?", new String[]{md5});
                                        if(cursor.moveToFirst()){
                                                String desc=cursor.getString(0);
                                                msg=Message.obtain();
                                                msg.obj=info.packageName+":"+desc;
                                                handler.sendMessage(msg);
                                                virustotal++;
                                        }
                                        cursor.close();
                                        pb.setProgress(total);
                                       
                                       
                                }
                                Message msg=Message.obtain();
                                msg.what=stop;
                                msg.obj="扫描完毕..共发现"+virustotal+"个病毒";
                                handler.sendMessage(msg);
                                flagscanning=false;
                                pb.setProgress(0);//扫描完毕,把进度条清零
                        };
                       
                       
                }.start();
                }
               
                return super.onTouchEvent(event);
        }

       
        @Override
        protected void onDestroy() {
                if(db.isOpen()){
                        db.close();
                }
               
                super.onDestroy();
        }

}




5 个回复

倒序浏览
这么厉害
回复 使用道具 举报
好牛!字母都认识,拼一起都不认识!
回复 使用道具 举报
看不懂~~要是有图就好了
回复 使用道具 举报
楼主好厉害
回复 使用道具 举报
病毒数据库实时更新在哪里
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马