金山手机毒霸工作原理
本文章由Jack_Jia編寫,轉載請注明出處。??
文章鏈接:http://blog.csdn.net/jiazhijun/article/details/8804402
作者:Jack_Jia ???郵箱:?309zhijun@163.com
一、序言
? ? ? ?金山手機毒霸(http://m.duba.com/)是金山網絡推出的首款Android?APP行為管理軟件,是首家攔截軟件惡意廣告、智能防御病毒行為、查殺最新病毒和自主管理高危隱私權限的安卓手機安全管理軟件。
? ? ? 它具有如下特色功能:
? ? ? ? ?1、有效清除軟件內置廣告,攔截軟件惡意廣告。
? ? ? ? ?2、依托于首創的Java虛擬機攔截技術,更精準更深入的攔截APP的高危行為。
? ? ? 本文將對金山手機毒霸的進行簡單的逆向分析,以達到了解其工作原理的目的。金山手機毒霸的最新版本為V2.0,但為了使我們的分析過程簡單高效,我們特意選擇金山手機毒霸V1.0Beta版本作為分析樣本。博友可以通過如下鏈接下載(http://bbs.xda.cn/thread-11186508-1-1.html)。
二、基本信息
? ? ? ? 1、安裝包關鍵路徑文件信息
? ? ? ? ? ? ? lib\srmeabi\:
? ? ? ? ??
? ? ? ? ??
? ? ? ? ? ? ? ?res\raw :
? ? ? ? ? ? ? 其中ksremote.mp3、libksrootclient.mp3、rootkeeper.mp3通過后綴名偽裝成mp3文件,其實這三個文件為jar包。
? ? ? ? ? ? AndroidMainfest.xml:
<application android:theme="@style/MainStyle" android:label="@string/app_name_desktop" android:icon="@drawable/main_icon_big" android:name="com.ijinshan.duba.main.MobileDubaApplication" android:allowClearUserData="false" android:debuggable="false"><activity android:label="@string/app_name" android:name="com.ijinshan.duba.main.MainActivity" android:launchMode="singleTask" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.main.SplashActivity" android:clearTaskOnLaunch="true" android:launchMode="singleTop" android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.ijinshan.duba.main.AuthorityActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.AdUI.AdwareNotifyListActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.AdUI.AdPrivacyActivty" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.AdUI.AdScanActivty" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.AdUI.AdwareLogActivty" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.AdUI.AdDetailActivty" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.common.NotifyEntryActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.malware.MalwareActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.malware.ScanResultListActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.malware.VirusDetailActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.defend.defendActivityTest" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.privacy.PrivacyActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.privacy.PrivacyDetailActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.privacy.PrivacySortActivity" android:screenOrientation="portrait" /><activity android:theme="@style/DialogActivityStyle" android:name="com.ijinshan.duba.malware.PcConnectActivity" android:launchMode="singleInstance" android:screenOrientation="portrait"><intent-filter><action android:name="" /></intent-filter></activity><activity android:theme="@style/DialogActivityStyle" android:name="com.ijinshan.duba.watcher.FileInstNoticeActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" /><activity android:theme="@style/DialogActivityStyle" android:name="com.ijinshan.duba.watcher.AppLaunchMonitorActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.malware.BadNetActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.main.ShowProtocolActivity" android:screenOrientation="portrait" /><activity android:name="com.ijinshan.duba.defend.Activity.IngnoreAppActivity" android:screenOrientation="portrait" /><activity android:theme="@style/DialogActivityStyle" android:name="com.ijinshan.duba.main.ShowRestartTipDialog" android:launchMode="singleInstance" android:screenOrientation="portrait" /><service android:name="com.ijinshan.duba.service.PcConnectService"><intent-filter><action android:name="" /></intent-filter></service><service android:name="com.ijinshan.duba.defend.DefendService" android:exported="false" android:process=":DefendService" /><receiver android:name="com.ijinshan.duba.receiver.AutoRunReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" android:exported="false"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></receiver><receiver android:name="com.ijinshan.duba.receiver.ShutdownReceiver"><intent-filter><action android:name="android.intent.action.ACTION_SHUTDOWN" /></intent-filter></receiver><provider android:name="com.ijinshan.duba.main.DubaConfigProvidor" android:exported="false" android:authorities="com.ijinshan.duba.config" /><provider android:name="com.ijinshan.duba.Provider.AdRuleProvidor" android:exported="false" android:process=":DefendService" android:authorities="com.ijinshan.duba.adrule" /><provider android:name="com.ijinshan.duba.Provider.MalwareDBProvidor" android:exported="false" android:process=":DefendService" android:authorities="com.ijinshan.duba.malwaredb" /></application>? ? ? ? ? ?2、手機毒霸運行時涉及進程及進程組件分布
? ? ? ? ? ? ? ? 通過對手機毒霸代碼逆向分析及運行時進程狀態變化,金山手機毒霸代碼共在四類進程中被加載運行。
? ? ? ? ? ? ? ? (1)com.ijinshan.duba 進程
? ? ? ? ? ? ? ? ? ? ? ? ? 廣告掃描引擎、病毒掃描引擎、金山版本控制等邏輯都在該進程中運行,
? ? ? ? ? ? ? ? ? ? ? ? ? 另外手機毒霸還在15997端口建立監聽,PC端可以通過該TCP連接發送命令手機端毒霸掃描。
? ? ? ? ? ? ??
? ? ? ? ? ?(2)com.ijinshan.duba:DefendService進程
? ? ? ? ? ? ? ? ? ?廣告規則和掃描病毒信息由該進程通過Provider提供。
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ?(3)com.ijinshan.duba.rootkeeper進程
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ?該進程以ROOT身份運行,該進程提供了手機毒霸其它進程運行需要root身份才能執行的命令的Binder接口,第三方程序進程的代碼注入由該進程完成。
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ?(4)第三方(injected process)被注入程序進程
? ? ? ? ? ? ? ? ? ?通過ptrace()注入到第三方程序的代碼,ksremote.jar和libksrootclient.so完成java虛擬機hook和底層Socket hook。
? ? ? ? ? ? ??
三、JAVA虛擬機hook實現原理
? ? ? ? ?
? ? ? ?目前Android進程代碼的注入都是靠ptrace函數來完成。ptrace進程后完成底層函數的重定向。金山毒霸代碼注入包括兩部分:
? ? ? ? ? ? 1、底層C函數HOOK
? ? ? ? ? ??2、JAVA虛擬機HOOK
? ? ? ?代碼注入基本流程如下:
? ? ? ? ? ? 1、com.ijinshan.duba.rootkeeper進程ptrace第三方進程,并注入libksrootclient.so文件
? ? ? ? ? ? 2、libksrootclient.so代碼完成底層C函數hook并調用ksremote.jar代碼,ksremote.jar完成java虛擬機hook
? ? ? ? ? ? ? ? ? (1)C代碼如何完成對java代碼的調用呢?
? ? ? ? ? ? ? ? ? ? ?基本代碼實現如下:
int (*callStatic)(const char* className, const char* methodName);JavaVM* (*getJavaVM)();JNIEnv* (*getJNIEnv)();void* handle = dlopen("/system/lib/libandroid_runtime.so", RTLD_NOW);getJNIEnv = dlsym(handle, "_ZN7android14AndroidRuntime9getJNIEnvEv");JNIEnv* env = getJNIEnv();jclass classloaderClass = (*env)->FindClass(env,"java/lang/ClassLoader");jmethodID getsysloaderMethod = (*env)->GetStaticMethodID(env,classloaderClass , "getSystemClassLoader", "()Ljava/lang/ClassLoader;");jobject loader = (*env)->CallStaticObjectMethod(env, classloaderClass, getsysloaderMethod);jstring dexpath = (*env)->NewStringUTF(env, "dex文件路徑");jstring dex_odex_path = (*env)->NewStringUTF(env,"odex文件路徑");jclass dexLoaderClass = (*env)->FindClass(env,"dalvik/system/DexClassLoader");jmethodID initDexLoaderMethod = (*env)->GetMethodID(env, dexLoaderClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V");jobject dexLoader = (*env)->NewObject(env, dexLoaderClass, initDexLoaderMethod,dexpath,dex_odex_path,NULL,loader);jmethodID findclassMethod = (*env)->GetMethodID(env,dexLoaderClass,"findClass","(Ljava/lang/String;)Ljava/lang/Class;"); jstring javaClassName = (*env)->NewStringUTF(env,"加載類名");jclass javaClientClass = (*env)->CallObjectMethod(env,dexLoader,findclassMethod,javaClassName);jmethodID start_inject_method = (*env)->GetStaticMethodID(env, adInjectClient_class, "調用方法名", "()V");(*env)->CallStaticVoidMethod(env,javaClientClass,start_inject_method); ? ? ? ? ? ? ??? ? ? ? ? ? ? ?(2)java虛擬機hook如何實現呢?
? ? ? ? ? ? ? ? ? ? ? ?java虛擬機hook都是通過java反射修改系統關鍵類的關鍵字段來實現的,我們通過替換LocationManager來看看如何實現的:
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?
? ? 當用戶代碼運行ServiceManager.getService("location")的時候,得到就是手機毒霸的LocationManager了。
三、廣告攔截原理
? ? ? ?廣告攔截邏輯大致包含以下幾個方面:
? ? ? ?1、Banner類型廣告
? ? ? ? ? ? ?當Activity顯示的時候,手機毒霸遍歷Activity View樹,判斷View類包名是否為廣告平臺包名,如果是則添加手機毒霸廣告關閉圖標,當用戶點擊關閉圖標時,隱藏Banner ? ? ? ? ?廣告View。
? ? ? ?2、WebView類型廣告
? ? ? ? ? ?判斷WebViewClient類名判斷是否為廣告。
? ? ? ?3、Notification類型廣告
? ? ? ? ? ?主要是通過RemoteViews的action來判斷是否為廣告。
? ? ? ? ?另外手機毒霸通過hook Socket接口來完成廣告的攔截,通過網絡層的攔截來完成廣告的攔截。
總結
以上是生活随笔為你收集整理的金山手机毒霸工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高能所客座用户计算机申请,大气物理所信息
- 下一篇: 远程连接下开启3D加速