金山手机毒霸工作原理.docx
- 文档编号:9347488
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:12
- 大小:378.86KB
金山手机毒霸工作原理.docx
《金山手机毒霸工作原理.docx》由会员分享,可在线阅读,更多相关《金山手机毒霸工作原理.docx(12页珍藏版)》请在冰豆网上搜索。
金山手机毒霸工作原理
金山手机毒霸工作原理
作者:
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;">
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, "
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接口来完成广告的拦截,通过网络层的拦截来完成广告的拦截。
大升刷票整理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 金山 手机 毒霸 工作 原理