金山手机毒霸工作原理.docx

上传人:b****8 文档编号:9347488 上传时间:2023-02-04 格式:DOCX 页数:12 大小:378.86KB
下载 相关 举报
金山手机毒霸工作原理.docx_第1页
第1页 / 共12页
金山手机毒霸工作原理.docx_第2页
第2页 / 共12页
金山手机毒霸工作原理.docx_第3页
第3页 / 共12页
金山手机毒霸工作原理.docx_第4页
第4页 / 共12页
金山手机毒霸工作原理.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

金山手机毒霸工作原理.docx

《金山手机毒霸工作原理.docx》由会员分享,可在线阅读,更多相关《金山手机毒霸工作原理.docx(12页珍藏版)》请在冰豆网上搜索。

金山手机毒霸工作原理.docx

金山手机毒霸工作原理

金山手机毒霸工作原理

作者:

Jack_Jia

一、序言

    金山手机毒霸( APP行为管理软件,是首家拦截软件恶意广告、智能防御病毒行为、查杀最新病毒和自主管理高危隐私权限的安卓手机安全管理软件。

   它具有如下特色功能:

     1、有效清除软件内置广告,拦截软件恶意广告。

     2、依托于首创的Java虚拟机拦截技术,更精准更深入的拦截APP的高危行为。

   本文将对金山手机毒霸的进行简单的逆向分析,以达到了解其工作原理的目的。

金山手机毒霸的最新版本为V2.0,但为了使我们的分析过程简单高效,我们特意选择金山手机毒霸V1.0Beta版本作为分析样本。

博友可以通过如下链接下载(

二、基本信息

    1、安装包关键路径文件信息

       lib\srmeabi\:

      

      

        res\raw:

       其中ksremote.mp3、libksrootclient.mp3、rootkeeper.mp3通过后缀名伪装成mp3文件,其实这三个文件为jar包。

      AndroidMainfest.xml:

[html] viewplaincopy

1.

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">  

2.    

label="@string/app_name" android:

name="com.ijinshan.duba.main.MainActivity" android:

launchMode="singleTask" android:

screenOrientation="portrait" />  

3.    

name="com.ijinshan.duba.main.SplashActivity" android:

clearTaskOnLaunch="true" android:

launchMode="singleTop" android:

screenOrientation="portrait">  

4.          

5.            

name="android.intent.action.MAIN" />  

6.            

name="android.intent.category.LAUNCHER" />  

7.          

8.      

9.    

name="com.ijinshan.duba.main.AuthorityActivity" android:

screenOrientation="portrait" />  

10.    

name="com.ijinshan.duba.AdUI.AdwareNotifyListActivity" android:

screenOrientation="portrait" />  

11.    

name="com.ijinshan.duba.AdUI.AdPrivacyActivty" android:

screenOrientation="portrait" />  

12.    

name="com.ijinshan.duba.AdUI.AdScanActivty" android:

screenOrientation="portrait" />  

13.    

name="com.ijinshan.duba.AdUI.AdwareLogActivty" android:

screenOrientation="portrait" />  

14.    

name="com.ijinshan.duba.AdUI.AdDetailActivty" android:

screenOrientation="portrait" />  

15.    

name="mon.NotifyEntryActivity" android:

screenOrientation="portrait" />  

16.    

name="com.ijinshan.duba.malware.MalwareActivity" android:

screenOrientation="portrait" />  

17.    

name="com.ijinshan.duba.malware.ScanResultListActivity" android:

screenOrientation="portrait" />  

18.    

name="com.ijinshan.duba.malware.VirusDetailActivity" android:

screenOrientation="portrait" />  

19.    

name="com.ijinshan.duba.defend.defendActivityTest" android:

screenOrientation="portrait" />  

20.    

name="com.ijinshan.duba.privacy.PrivacyActivity" android:

screenOrientation="portrait" />  

21.    

name="com.ijinshan.duba.privacy.PrivacyDetailActivity" android:

screenOrientation="portrait" />  

22.    

name="com.ijinshan.duba.privacy.PrivacySortActivity" android:

screenOrientation="portrait" />  

23.    

theme="@style/DialogActivityStyle" android:

name="com.ijinshan.duba.malware.PcConnectActivity" android:

launchMode="singleInstance" android:

screenOrientation="portrait">  

24.          

25.            

name="" />  

26.          

27.      

28.    

theme="@style/DialogActivityStyle" android:

name="com.ijinshan.duba.watcher.FileInstNoticeActivity" android:

launchMode="singleInstance" android:

screenOrientation="portrait" />  

29.    

theme="@style/DialogActivityStyle" android:

name="com.ijinshan.duba.watcher.AppLaunchMonitorActivity" android:

launchMode="singleInstance" android:

screenOrientation="portrait" />  

30.    

name="com.ijinshan.duba.malware.BadNetActivity" android:

screenOrientation="portrait" />  

31.    

name="com.ijinshan.duba.main.ShowProtocolActivity" android:

screenOrientation="portrait" />  

32.    

name="com.ijinshan.duba.defend.Activity.IngnoreAppActivity" android:

screenOrientation="portrait" />  

33.    

theme="@style/DialogActivityStyle" android:

name="com.ijinshan.duba.main.ShowRestartTipDialog" android:

launchMode="singleInstance" android:

screenOrientation="portrait" />  

34.    

name="com.ijinshan.duba.service.PcConnectService">  

35.          

36.            

name="" />  

37.          

38.      

39.    

name="com.ijinshan.duba.defend.DefendService" android:

exported="false" android:

process=":

DefendService" />  

40.    

name="com.ijinshan.duba.receiver.AutoRunReceiver" android:

permission="android.permission.RECEIVE_BOOT_COMPLETED" android:

exported="false">  

41.          

42.            

name="android.intent.action.BOOT_COMPLETED" />  

43.            

name="android.intent.category.DEFAULT" />  

44.          

45.      

46.    

name="com.ijinshan.duba.receiver.ShutdownReceiver">  

47.          

48.            

name="android.intent.action.ACTION_SHUTDOWN" />  

49.          

50.      

51.    

name="com.ijinshan.duba.main.DubaConfigProvidor" android:

exported="false" android:

authorities="com.ijinshan.duba.config" />  

52.    

name="com.ijinshan.duba.Provider.AdRuleProvidor" android:

exported="false" android:

process=":

DefendService" android:

authorities="com.ijinshan.duba.adrule" />  

53.    

name="com.ijinshan.duba.Provider.MalwareDBProvidor" android:

exported="false" android:

process=":

DefendService" android:

authorities="com.ijinshan.duba.malwaredb" />  

54.  

      2、手机毒霸运行时涉及进程及进程组件分布

        通过对手机毒霸代码逆向分析及运行时进程状态变化,金山手机毒霸代码共在四类进程中被加载运行。

        

(1)com.ijinshan.duba进程

             广告扫描引擎、病毒扫描引擎、金山版本控制等逻辑都在该进程中运行,

             另外手机毒霸还在15997端口建立监听,PC端可以通过该TCP连接发送命令手机端毒霸扫描。

        

      

(2)com.ijinshan.duba:

DefendService进程

          广告规则和扫描病毒信息由该进程通过Provider提供。

            

           

      

(2)com.ijinshan.duba.rootkeeper进程

           

          该进程以ROOT身份运行,该进程提供了手机毒霸其它进程运行需要root身份才能执行的命令的Binder接口,第三方程序进程的代码注入由该进程完成。

           

      (4)第三方(injectedprocess)被注入程序进程

          通过ptrace()注入到第三方程序的代码,ksremote.jar和libksrootclient.so完成java虚拟机hook和底层Sockethook。

        

三、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代码的调用呢?

           基本代码实现如下:

[cpp] viewplaincopy

1.int (*callStatic)(const char* className, const char* methodName);  

2.       JavaVM* (*getJavaVM)();  

3.       JNIEnv* (*getJNIEnv)();  

4.  

5.void* handle = dlopen("/system/lib/libandroid_runtime.so", RTLD_NOW);  

6.  

7.getJNIEnv = dlsym(handle, "_ZN7android14AndroidRuntime9getJNIEnvEv");  

8.       JNIEnv* env = getJNIEnv();  

9.          

10.       jclass classloaderClass = (*env)->FindClass(env,"java/lang/ClassLoader");  

11.       jmethodID getsysloaderMethod = (*env)->GetStaticMethodID(env,classloaderClass

 Arial, Helvetica, sans-serif;"> , "getSystemClassLoader", "()Ljava/lang/ClassLoader;");  

12.       jobject loader = (*env)->CallStaticObjectMethod(env, classloaderClass, getsysloaderMethod);  

13.  

14.       jstring dexpath = (*env)->NewStringUTF(env, "dex文件路径");  

15.       jstring dex_odex_path = (*env)->NewStringUTF(env,"odex文件路径");  

16.       jclass dexLoaderClass = (*env)->FindClass(env,"dalvik/system/DexClassLoader");  

17.       jmethodID initDexLoaderMethod = (*env)->GetMethodID(env, dexLoaderClass, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V");  

18.       jobject dexLoader = (*env)->NewObject(env, dexLoaderClass, initDexLoaderMethod,dexpath,dex_odex_path,NULL,loader);  

19.  

20.       jmethodID findclassMethod = (*env)->GetMethodID(env,dexLoaderClass,"findClass","(Ljava/lang/String;)Ljava/lang/Class;");   

21.       jstring javaClassName = (*env)->NewStringUTF(env,"加载类名");  

22.       jclass javaClientClass = (*env)->CallObjectMethod(env,dexLoader,findclassMethod,javaClassName);  

23.       jmethodID start_inject_method = (*env)->GetStaticMethodID(env, adInjectClient_class, "调用方法名", "()V");  

24.       (*env)->CallStaticVoidMethod(env,javaClientClass,start_inject_method);  

        

        

(2)java虚拟机hook如何实现呢?

            java虚拟机hook都是通过java反射修改系统关键类的关键字段来实现的,我们通过替换LocationManager来看看如何实现的:

           

            

  当用户代码运行ServiceManager.getService("location")的时候,得到就是手机毒霸的LocationManager了。

三、广告拦截原理

    广告拦截逻辑大致包含以下几个方面:

    1、Banner类型广告

       当Activity显示的时候,手机毒霸遍历ActivityView树,判断View类包名是否为广告平台包名,如果是则添加手机毒霸广告关闭图标,当用户点击关闭图标时,隐藏Banner     广告View。

    2、WebView类型广告

      判断WebViewClient类名判断是否为广告。

    3、Notification类型广告

      主要是通过RemoteViews的action来判断是否为广告。

     另外手机毒霸通过hookSocket接口来完成广告的拦截,通过网络层的拦截来完成广告的拦截。

大升刷票整理

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1