日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

金山手机毒霸工作原理

發布時間:2023/12/29 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 金山手机毒霸工作原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文章由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接口來完成廣告的攔截,通過網絡層的攔截來完成廣告的攔截。

總結

以上是生活随笔為你收集整理的金山手机毒霸工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。