金山手机毒霸工作原理
本文章由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接口来完成广告的拦截,通过网络层的拦截来完成广告的拦截。
金山手机毒霸工作原理相关推荐
- 谈谈对金山手机毒霸事件的看法
近来,"金山手机毒霸"事件被吵的沸沸扬扬的. 所谓的金山手机毒霸事件,就是金山推出的以屏蔽Android平台广告为卖点的安全软件,可以清除软件内置广告.在推出测试版并且在未进行推广 ...
- 金山手机毒霸屏蔽广告 19家广告平台联合抵制
[搜狐IT消息]9月14日消息,针对金山手机毒霸屏蔽应用广告一事,安沃.力美.多盟.捕鱼达人等19家移动开发者和移动广告平台发表联合声明,要求金山尽快更改其手机毒霸软件,立即停止破坏正常移动广告商业行 ...
- 安卓4.3系统,请问如何关闭通知栏里金山手机毒霸的常驻通知
分享到: 2013-10-19 10:08提问者采纳 您好,感谢您对金山网络的支持:关闭常驻通知:左上角主界面----软件设置----通知栏图标,关闭.希望可以帮到您!微笑为您解答,如果有什么问题还可 ...
- 手机毒霸去广告功能分析一:总体分析
不久前金山公司推出了手机毒霸,并声称手机毒霸具有了清除广告的功能,顿时在业内掀起轩然大波.国内众多靠广告生存的移动开发者们对金山的这一功能进行强烈的谴责,但另一方面,大多数用户都觉得这个功能挺不错的, ...
- 手机毒霸去广告功能分析之一:总体分析
不久前金山公司推出了手机毒霸,并声称手机毒霸具有了清除广告的功能,顿时在业内掀起轩然大波.国内众多靠广告生存的移动开发者们对金山的这一功能进行强烈的谴责,但另一方面,大多数用户都觉得这个功能挺不错的 ...
- 手机毒霸去广告功能分析二:广告View的识别
手机毒霸去广告功能分析二:广告View的识别 手机毒霸对于广告View的判定规则分析 上次我们提到手机毒霸获得root权限之后,生成一个root进程,然后通过进程注入的方式将广告应用中的广告检测出来, ...
- 金山发布毒霸V及网镖V新品 坚持高定价策略 (转)
金山发布毒霸V及网镖V新品 坚持高定价策略 (转)[@more@] 6月3日晚,瑞星突然宣布,给用户和经销商让利2200万,并将单机版产品建议零售价调低30元,零售价格降至138元.同夜,江民宣布, ...
- 简单解析手机充电器的工作原理
刚好前段时间拆了两个充电器,看下里面的电路就明白了.鉴于网络上不明真相出来误导人的特别多,很多网站竟然还有文章说手机充电器里没有变压器隔离的.因此简单说下手机充电器的工作原理. 图1: 开关式手机充电 ...
- 金山发布毒霸V及网镖V新品 坚持高定价策略
6月3日晚,瑞星突然宣布,给用户和经销商让利2200万,并将单机版产品建议零售价调低30元,零售价格降至138元.同夜,江民宣布,将以38元的超低价位推出一款杀毒软件-KV江民杀毒王DOS杀毒伴侣.已 ...
最新文章
- Kafka背后公司获1.25亿融资,估值超25亿美元
- DataTables 表格固定栏使用方法
- linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝
- linux文件的打包与下载总结,linux下文件的打包和压缩
- 以太坊搭建联盟链详细教程
- AcWing 1087. 修剪草坪28
- 容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对
- 【公众号系列】SAP S/4 HANA的移动平均价
- android属性动画缩放和平移同时,Android 实现属性动画平移,旋转,缩放,渐变 《H》...
- Apache Cassandra和Apache Ignite:分布式数据库的明智之选
- 缺失值了解与简单处理
- Jackson2 json 转换Bean, Bean 里没有对应的值 jackson Un的解决方式
- Tcpping 替代ping测试网路延迟
- .net连接SqlServer数据库
- 在oracle中bpa是什么意思,BPA是什么意思_BPA的翻译_音标_读音_用法_例句_爱词霸在线词典...
- SSM+MySQL+JSP教务管理系统设计与实现(附源码下载地址)
- CODE大全告诉你java是否开始没落了
- Windows 下载WebStorm
- FingerGestures研究院之初探Unity手势操作(一)
- 信息论小课堂:纠错码(海明码在信息传输编码时,通过巧妙的信道编码保证有了错误能够自动纠错。)
热门文章
- lol网通区服务器的位置,lol各大区人数排行2020,lol网通区实力排名
- 制作一个简易的自主夹取机械臂
- allegro编辑brd档如何添加一个编辑好的brd档的部分元器件到另一个brd档
- php怎么给超链接设置样式,HTML基础知识,关于超链接设置的样式的详细介绍
- Centos7 处理挖矿病毒初探
- 模型部署到移动端_分分钟打开倾斜摄影模型,新版本的老子云移动端也太好用了吧!...
- 老子云开通个人认证,免费下载SDK!开发者坐不住了···
- 数学软件四大家族—MATLAB、MathCAD、Maple 和 Mathematica 优缺点比较
- 软考网络工程师学习笔记day04
- JavaWeb开发中alias拦截器的使用方法