聲明: 本文由( 魔豆先生 )原創編譯,轉載請保留連結: Android系統掃描帶廣告應用的方法
android上應用廣告檢測,廣告檢查,廣告掃描,廣告殺手,廣告外掛程式殺手的應用甚多,但是他們採用了什麼原理來進行的呢,今天進行深入剖析。
在反編譯帶廣告的apk的包後,會發下如下特徵:
1. manifest.xml檔案中有對各個activity的聲明,其中包含了廣告外掛程式的視窗;
2.廣告外掛程式是一個單獨的jar包,在混淆中,proguard.cfg檔案中必須對public的類和方法做相應的keep處理。
所以,在反編譯後的包裡面依然可以找到廣告外掛程式對應的包名。
針對上述跡象,對目前帶廣告檢測功能的應用進行實驗:
1.將待掃描的APK打包進廣告外掛程式,給“廣告掃描工具”進行掃描。
2.在manifest.xml中聲明一些廣告平台使用的activity。
LBE和360對廣告外掛程式的掃描結果不大一樣,LBE能掃描數來的相對多一些。
測試結果如下:
方法1能掃描出來。
方法2不能掃描出來。
所以,在此也打算用包名,類名匹配的方法來進行廣告外掛程式掃描。在具體的廣告外掛程式掃描方案是:
(1) 列出系統安裝的所有apk;
(2)列出每個apk使用的所有class;
(3)單個class與廣告外掛程式特徵庫進行匹配;
在android系統上
(1)擷取所有安裝的包的代碼:
PackageManager packagemgr= getPackageManager();
List<PackageInfo> packageList= packagemgr.getInstalledPackages(
0
);
count = packageList.size();
for
(
int
i =
0
;
i < count; i++) {
PackageInfo pi = packageList.get(i);
if
(pi.versionName ==
null
)
continue
;
//判斷該軟體包是否在/data/app目錄下
File file =
new
File(
"/data/app/"
+
pi.packageName +
".apk"
);
if
(!file.exists())
systemInstalledApk++;
userInstalledApk
++;
/**
* 應用程式的名字
*/
applicationName
= pi.applicationInfo.loadLabel(packagemgr).toString();
packageName = pi.packageName;
}
(2)擷取單個package內所有的class:
try {
path = context.getPackageManager().getApplicationInfo(packageName, 0).sourceDir;// 獲得某個程式的APK路徑
} catch (NameNotFoundException e) {
e.printStackTrace();
}
try {
DexFile dexFile = new DexFile(path);// get dex file of APK
Enumeration<String> entries = dexFile.entries();
while (entries.hasMoreElements()) {// travel all classes
String className = (String) entries.nextElement();
}
} catch (IOException e) {
e.printStackTrace();
}
在PC端上:
實現實現上述兩點也容易,也不容易。
完全自己的程式的話,可以考慮解析class.dex檔案。這個涉及去瞭解dex檔案的格式,然後讀取響應的class內容。
如果僅僅是做一個自動化工具的話,可以考慮使用dexdump.exe程式去解析class.dex檔案。
剩下的工作可以使,C應用,MFC,Java,shell指令碼等等統統可以搞定。
剩下的一個問題就是廣告外掛程式特徵庫的收集,收集越全,掃描出來的廣告外掛程式就可以越準確。android廣告掃描 廣告攔截 相關原理和處理方式可以繼續查看相關博文,謝謝!
聲明: 本文由( 魔豆先生 )原創編譯,轉載請保留連結: Android系統掃描帶廣告應用的方法