手机卫士-12
手機衛士-12
課1
手機殺毒模塊
殺毒原理:
1、什么是病毒:特殊的程序,存在在硬盤里面。 - 如何定義計算機病毒:
1、侵犯用戶的隱私,偷竊你的私隱數據 2、盜號,偷錢。(特洛伊,木馬)灰鴿子 3、惡意程序,危害設備前提:在用戶不知情的情況下安裝,在特殊的情況下出發。
紅蜘蛛,灰鴿子
2、如何殺毒?
把硬盤上的病毒程序,文件刪除掉 刪除問題: 1、不知道哪個文件是病毒。 2、無法清除?;ハ嗍刈o。A.exe B.exe C.exe3、殺毒軟件的工作
1、找到病毒 2、刪除病毒 3、修復系統。研究一個項目的流程:1、起源、2、Demo、3、成型項目
王江民:反病毒專家 kv20--->江民殺毒軟件
江民炸彈:邏輯炸彈(非常惡意的病毒)。報復盜版: mbr:硬盤的引導區 邏輯炸彈就是破壞mbr,導致電腦啟動不了。
4、殺毒軟件工具的原理
1、識別應用程序的特征碼什么是特征碼?
5、新建工程:獲取特征碼
項目使用到的算法SHA1MD5項目邏輯:1、獲取一個數字摘要器2、循環的讀取文件的每一個byte,獲取每個byte的數字簽名獲取到了文件的用MD5或SHA1加密的數字摘要 如果我們改變了文件里面的內容,那么文件的數字摘要就改變了。6、早起的殺毒軟件工作的原理就是:
1、手機常見病毒的特征碼,把特征碼存放在數據庫(病毒庫) 2、遍歷所有的系統文件,計算他們的特征碼,跟病毒數據庫進行對比 3、根據比對的結果確定文件是否是病毒??ò退够?#xff1a;非常安全,因為病毒庫很龐大,但是讀取數據庫數據量太大,占用cpu資源,卡。7、殺毒的問題:
1、如何搜集這么多的病毒:蜜罐,互聯網云查殺(把用戶的電腦變成蜜罐) 2、病毒庫太大了,效率怎么辦。(殺毒引擎,優化后的數據庫查詢算法) 缺陷1、根據數據庫查殺,只能查殺已知的病毒,不能查殺未知的病毒。8、新技術:主動防御
1、根據軟件的行為,判斷軟件是否是病毒1.看門狗:后臺while死循環,監視系統2.攔截系統API:SystemService.jar,主動提醒用戶是否允許行為 把金山的病毒數據庫復制過來
我們殺毒的邏輯:遍歷系統的文件,查看文件的特征碼,并比對病毒數據庫的特征碼。
看雪論壇:
主動防御技術,安卓注入術
課2
烏云網:查漏洞
社會工程學:設密碼的習慣
程序員設密碼的講究
1、錢 2、社交 3、下載一下實現手機殺毒的功能
金山殺毒界面:
新建AntiVirusActivity.java+清單
<activityandroid:name="com.itheima.mobile47.AntiVirusActivity"android:configChanges="orientation|screenSize|keyboardHidden" > </activity>MainActivity+case 5 手機殺毒
布局:activityantivirus.xml
activityantivirus.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewstyle="@style/textview_title_style"android:text="病毒查殺" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><FrameLayoutandroid:layout_width="80dip"android:layout_height="80dip" ><ImageViewandroid:layout_width="80dip"android:layout_height="80dip"android:src="@drawable/ic_scanner_malware" /><ImageViewandroid:id="@+id/iv_scan"android:layout_width="80dip"android:layout_height="80dip"android:src="@drawable/act_scanning_03" /></FrameLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="80dip"android:gravity="center"android:orientation="vertical" ><TextViewandroid:id="@+id/tv_scan_status"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="掃描狀態"android:textSize="20sp" /><ProgressBarandroid:id="@+id/pb_scan"android:layout_width="fill_parent"android:layout_height="15dip"android:layout_marginLeft="20dip"android:layout_marginRight="20dip"android:indeterminateOnly="false"android:progressDrawable="@drawable/progress_horizontal" /></LinearLayout></LinearLayout><ScrollViewandroid:layout_width="fill_parent"android:layout_height="fill_parent" ><LinearLayoutandroid:id="@+id/ll_container"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ></LinearLayout></ScrollView></LinearLayout>
布局:主要是雷達動畫和進度條
給scanning的ImageView圖片加上旋轉的動畫 圖片沿著自己的中心點旋轉:
iv_scan = (ImageView) findViewById(R.id.iv_scan); RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ra.setRepeatCount(Animation.INFINITE); ra.setDuration(2000); iv_scan.startAnimation(ra);給病毒數據庫新建數據庫dao(分析下數據庫:)
sql查詢語句:
select desc from datable where md5 = "2222" --->空:不存在病毒 有:存在病毒AntiVirusdao.java
public class AntiVirusDao {private static final String path ="/data/data/com.itheima.mobile47/files/antivirus.db";/*** 查詢病毒數據庫,* @param md5 應用程序的特征碼 * @return 不為空是病毒描述,null不是病毒*/public static String find(String md5){String desc = null;SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);Cursor cursor = db.rawQuery("select desc from datable where md5=?", new String[]{md5});if(cursor.moveToNext()){desc = cursor.getString(0);}cursor.close();db.close();return desc;} }AntiVirusActivity.java-->scanVirus();//殺毒 把MD5Util工具類寫好
1、拿到系統里所有應用的包數據集合 2、遍歷他們,并配合上一節課的示例代碼:獲取特征碼 3、獲取某個路徑文件的MD5值(特征碼) 4、那該md5值和數據庫做對比(空:不是病毒,不空:是病毒)for循環發現如果是病毒:畫面的變化MD5Util.java
public class MD5Util {public static String encode(String result) {try {StringBuilder sb = new StringBuilder();// 設置加密摘要MessageDigest digest = MessageDigest.getInstance("md5");byte[] digests = digest.digest(result.getBytes());for (byte b : digests) {// 獲取到低八位int number = b & 0xff;String hex = Integer.toHexString(number);if (hex.length() == 1) {sb.append("0" + hex);} else {sb.append(hex);}}return sb.toString();} catch (Exception e) {// TODO: handle exception}return "";}/*** 獲取某個路徑文件的md5值* * @param path* 文件路徑* @return md5值*/public static String getFileMd5(String path) {try {// 1.獲取一個數字摘要器MessageDigest digest = MessageDigest.getInstance("md5");File file = new File(path);FileInputStream fis = new FileInputStream(file);// 2.循環的讀取文件的每一個byte,獲取每個byte的數字簽名byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) != -1) {digest.update(buffer, 0, len);}fis.close();StringBuffer sb = new StringBuffer();byte[] result = digest.digest();for (byte b : result) {// 獲取到低八位int number = b & 0xff;String hex = Integer.toHexString(number);if (hex.length() == 1) {sb.append("0" + hex);} else {sb.append(hex);}}return sb.toString();} catch (Exception e) {e.printStackTrace();return "";}} }AntiVirusActivity.java
public class AntiVirusActivity extends Activity {protected static final int ISVIRUS = 1;protected static final int NOVIRUS = 2;protected static final int FINISH = 3;private ImageView iv_scan;private ProgressBar pb_scan;private PackageManager pm;private LinearLayout ll_container;private TextView tv_scan_status;private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case ISVIRUS:tv_scan_status.setText("正在掃描");PackageInfo packinfo = (PackageInfo) msg.obj;TextView tv1 = new TextView(getApplicationContext());tv1.setTextColor(Color.RED);tv1.setText("發現病毒:"+packinfo.applicationInfo.loadLabel(pm));ll_container.addView(tv1, 0);break;case NOVIRUS:tv_scan_status.setText("正在掃描");PackageInfo packinfo2 = (PackageInfo) msg.obj;TextView tv2 = new TextView(getApplicationContext());tv2.setTextColor(Color.GREEN);tv2.setText("掃描安全:"+packinfo2.applicationInfo.loadLabel(pm));ll_container.addView(tv2,0);break;case FINISH:iv_scan.clearAnimation();tv_scan_status.setText("掃描完畢");break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);pm = getPackageManager();setContentView(R.layout.activity_anti_virus);iv_scan = (ImageView) findViewById(R.id.iv_scan);pb_scan = (ProgressBar) findViewById(R.id.pb_scan);ll_container = (LinearLayout) findViewById(R.id.ll_container);tv_scan_status = (TextView) findViewById(R.id.tv_scan_status);RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);ra.setRepeatCount(Animation.INFINITE);ra.setDuration(2000);iv_scan.startAnimation(ra);scanVirus();}//耗時的操作private void scanVirus() {new Thread(){public void run() {PackageManager pm = getPackageManager();//添加一個flag 把系統所有的文件都掃描出來 包括哪些沒有卸載干凈的 還保留有數據的應用程序List<PackageInfo> packinfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);pb_scan.setMax(packinfos.size());int progress = 0;for(PackageInfo packinfo:packinfos){String path = packinfo.applicationInfo.sourceDir;String md5 = MD5Util.getFileMd5(path);System.out.println(md5);String desc = AntiVirusDao.find(md5);Message msg = Message.obtain();if(desc!=null){//是病毒msg.what = ISVIRUS;}else{//掃描安全msg.what = NOVIRUS;}msg.obj = packinfo;handler.sendMessage(msg);progress++;pb_scan.setProgress(progress);try {Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}}Message msg = Message.obtain();msg.what =FINISH;handler.sendMessage(msg);};}.start();} }
課3
實現查殺出來的病毒文件的刪除
給scanVirus();來個線程睡眠,讓殺毒不要殺得太快。 顯示在查殺病毒時橫豎屏切換所顯示的bug:橫豎屏切換又重新來查殺一遍(因為這樣使Activity重新創建了一遍):修改清單文件
<activityandroid:name="com.itheima.mobile47.AntiVirusActivity"android:configChanges="orientation|screenSize|keyboardHidden" > </activity>更新病毒庫功能:
在金山的病毒數據庫里有一個version的表:
更新的流程:
1、首先連接服務器匹配服務器的數據庫版本號和金山的病毒數據庫里version的表的版本號是否一樣 2、不一樣的話,就從服務器下載json數據,然后把里面的對象數據導出來,使用更新SQL語句:更新到我們的數據庫中。
activitysettingcenter.xml
<TextViewandroid:onClick="updateVirusDB"android:layout_width="match_parent"android:layout_height="40dp"android:background="@drawable/list_selector"android:clickable="true"android:enabled="true"android:focusable="true"android:text="更新病毒數據庫"android:textSize="24sp" />SettingCenterActivity.java里updateVirusDB()//更新病毒數據庫
/*** 更新病毒數據庫。* @param view*/ public void updateVirusDB(View view){//1.獲取本地病毒數據庫的版本號//獲取subcnt//2.聯網獲取服務器的配置信息。//serversubcnt//3.比對 serversubcnt 和 本地subcnt的大小。//4.如果服務器端serversubcnt 比 本地subcnt要大 說明有新的病毒信息需要更新。//5.計算本地版本和服務器版本的差異大小, 假設相差5個版本號 //6.帶著這個版本號差別請求服務器 獲取更新信息//壓縮后的sql語句。//7.解壓sql語句,添加數據到數據到本地數據庫。 }實現病毒卸載的功能:在查到的前提下,也不實現了
解決手機衛士的邊邊角角的小問題
1、屏幕適配問題:
AppManagerActivity.java--->popupWindow 我們編程時用像素編程:那么會有各種手機屏幕不適配的問題:那么我們的像素單位要講究:
view.getLocationInWindow(location);// 獲取了view對象在窗體上的位置 //50 px 像素,注意: 在代碼里面寫的所有的長度單位 全部都是像素 //dp dip 像素密度。屏幕寬高和像素的一個比例值。 int dip = 50; int px = DensityUtil.dip2px(getApplicationContext(), dip); System.out.println(px); popupWindow.showAtLocation(parent, Gravity.LEFT+ Gravity.TOP,px , location[1] - 15);拷貝了一個DensityUtil的工具類:
DensityUtil.java
public class DensityUtil {/*** 根據手機的分辨率從 dip 的單位 轉成為 px(像素)*/public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** 根據手機的分辨率從 px(像素) 的單位 轉成為 dp*/public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);} }處理像素后:
2、水平低的程序員寫出的項目中的死循環中打印的log太多,可能泄露用戶信息。
我們變成時需要約定一個方式來打印log,那么不同人接觸項目時可以自由地開啟或禁用掉log LogUtil.java
public class LogUtil {public static final boolean mode = true;public static void d(Object obj,String msg){if(mode){Log.d(obj.getClass().getSimpleName(), msg);}} }3、開發周期短時市面上的app一般測試版上線或帶病上線怎么辦
SettingCenterActivity.java模擬空指針異常:
這是應用還沒發布是的小問題 如果這種問題已經隨同app一起上線了,怎么辦?
在app里加一個功能:收集用戶問題 新建MobileSafeApplication.java繼承Applition+配置清單文件,這樣去抓取異常出現時彈出的系統終止框的信息,這樣可以獲取用戶體驗app時出現問題時獲取問題的信息
重寫用戶app的異常處理器
MobileSafeApplication.java
/*** 注意:一定要記得在清單文件中配置* @author Administrator**/ public class MobileSafeApplication extends Application {//Called when the application is starting當應用程序被開啟的時候調用//before any other application objects have been created@Overridepublic void onCreate() {//老母子的方法。 基地//重新系統的異常處理器Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHander());super.onCreate();}private class MyExceptionHander implements UncaughtExceptionHandler{@Overridepublic void uncaughtException(Thread thread, Throwable ex) {//留下了 留下遺囑的時間System.out.println("發生了異常,但是被我們給捕獲了。。");try {StringWriter wr = new StringWriter();PrintWriter pw = new PrintWriter(wr);ex.printStackTrace(pw);File file = new File(Environment.getExternalStorageDirectory(),"error.log");FileOutputStream fos = new FileOutputStream(file);fos.write(wr.toString().getBytes());fos.close();} catch (Exception e) {e.printStackTrace();}//專注自殺的方法,就是殺死自己的進程, 早死早超生android.os.Process.killProcess(android.os.Process.myPid());}} }
這過程可以把異常捕獲到后寫到了sd卡里的log文件里,這樣可以讓用戶反饋回來給我們調錯排錯。
然后考慮到用戶體驗:加入以下代碼:
課4
介紹目前市面上公司的盈利模式
公司盈利模式+
1、做自己的產品
1.互聯網公司 30% 2.傳統行業(想通過互聯網讓客戶更多,跨界) 3.游擊隊(什么賺錢搞什么,一般老板不懂技術,有錢,風險投資vc),占50%,為什么占這么多?以下是為什么游擊隊生產模式占app市場份額這么大
App類型:
1、App付費:在中國行不通,破解,可以發布到歐美市場,go桌面。2、App內付費:騰訊天天跑酷。3、免費應用帶免費廣告:cnbeta.com廣告類型:1、cpm: 有效展現率 千次展現1塊5。和派傳單的原理差不多2、cpc: 有效點擊率(點進了網頁) 1毛錢~3毛錢3、cpa:有效行動(進了淘寶連接并且真的買了里面的東西) 5毛~幾十塊一個App如果有20萬的用戶:20萬的下載量,兩年內,30%保有量:20萬其中的6萬用戶,小游戲。30分鐘過關,這么多人就一共120分鐘 * 3 (3代表展現廣告的次數) = 3600000展現 一天就1670元。所以一個活躍的app每天5000上下沒問題。黑馬學生(劉福雙):600萬谷歌下載量,3000美金1天。
2、外包公司 軟通動力 博廖科技
1.外包人 2.外包項目:帶來問題,被一層一層外包,不用心 如何在app里嵌入廣告百度上搜:移動廣告平臺,很多廣告接口提供 百度移動聯盟:老師推薦 有米:老師推薦
植物大戰僵尸項目:對我們找工作幫助不大,但是對我們了解開發游戲開發app有幫助。
課5
谷歌市場對中國程序員開放了
老師植入廣告掙錢效果
演示在項目中植入廣告
有米網
1、下載sdk
2、把文檔里的jar包烤進來
3、讀開發者文檔:需要配置的權限
4、配置廣告的組件:
5、加標簽:
6、MainActivity里植入代碼:
MainActivity.java
AdManager.getInstance(this).init("847377901819a2fb", "f2c5d51b6066058c", true); setContentView(R.layout.activity_main); initView(); sp = getSharedPreferences("config", MODE_PRIVATE); // 實例化廣告條 AdView adView = new AdView(this, AdSize.FIT_SCREEN);// 獲取要嵌入廣告條的布局 LinearLayout adLayout=(LinearLayout)findViewById(R.id.adLayout);// 將廣告條加入到布局中 adLayout.addView(adView);
7、調用方法:
具體方法查開發者文檔。
8、activity_main.xml和MainActivity加入代碼(布局和方法):
測試:
如何發布app
體力活:需要拍照,身份證認證,兩三天的審核,上傳應用,平臺檢查apk是否帶廣告
想辦法推廣。軟玩推廣,
打品牌:減少別人山寨的幾率。逆向助手:抄布局,抄代碼,反編譯
怎么防止反編譯。(重要)
解決方案:
百度apk防止反編譯:
項目中的project.properties,混淆代碼來保護apk隱私
把路徑下的文件復制到項目中,并修改代碼:
然后發布app,這app就是加密了的apk了。但是我們項目里的有米代碼已經混淆過了,所以以下步驟
可以避免我們項目加密過程的報錯
混淆:動態的全局替換類名方法名和變量名
課6
混淆后的apk不一定好用
測試:如果app里面含有一些特殊的邏輯,那么apk可能有問題
資料下載
總結
- 上一篇: QQ全量上云的技术解析
- 下一篇: cad连接不同线段的端点_cad里可不可