金山手机毒霸工作原理Word文档格式.docx
《金山手机毒霸工作原理Word文档格式.docx》由会员分享,可在线阅读,更多相关《金山手机毒霸工作原理Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
label="
@string/app_name_desktop"
icon="
@drawable/main_icon_big"
name="
com.ijinshan.duba.main.MobileDubaApplication"
allowClearUserData="
false"
debuggable="
>
2.
<
activity
@string/app_name"
com.ijinshan.duba.main.MainActivity"
launchMode="
singleTask"
screenOrientation="
portrait"
/>
3.
com.ijinshan.duba.main.SplashActivity"
clearTaskOnLaunch="
true"
singleTop"
4.
intent-filter>
5.
action
android.intent.action.MAIN"
6.
category
android.intent.category.LAUNCHER"
7.
/intent-filter>
8.
/activity>
9.
com.ijinshan.duba.main.AuthorityActivity"
10.
com.ijinshan.duba.AdUI.AdwareNotifyListActivity"
11.
com.ijinshan.duba.AdUI.AdPrivacyActivty"
12.
com.ijinshan.duba.AdUI.AdScanActivty"
13.
com.ijinshan.duba.AdUI.AdwareLogActivty"
14.
com.ijinshan.duba.AdUI.AdDetailActivty"
15.
mon.NotifyEntryActivity"
16.
com.ijinshan.duba.malware.MalwareActivity"
17.
com.ijinshan.duba.malware.ScanResultListActivity"
18.
com.ijinshan.duba.malware.VirusDetailActivity"
19.
com.ijinshan.duba.defend.defendActivityTest"
20.
com.ijinshan.duba.privacy.PrivacyActivity"
21.
com.ijinshan.duba.privacy.PrivacyDetailActivity"
22.
com.ijinshan.duba.privacy.PrivacySortActivity"
23.
@style/DialogActivityStyle"
com.ijinshan.duba.malware.PcConnectActivity"
singleInstance"
24.
25.
"
26.
27.
28.
com.ijinshan.duba.watcher.FileInstNoticeActivity"
29.
com.ijinshan.duba.watcher.AppLaunchMonitorActivity"
30.
com.ijinshan.duba.malware.BadNetActivity"
31.
com.ijinshan.duba.main.ShowProtocolActivity"
32.
com.ijinshan.duba.defend.Activity.IngnoreAppActivity"
33.
com.ijinshan.duba.main.ShowRestartTipDialog"
34.
service
com.ijinshan.duba.service.PcConnectService"
35.
36.
37.
38.
/service>
39.
com.ijinshan.duba.defend.DefendService"
exported="
process="
:
DefendService"
40.
receiver
com.ijinshan.duba.receiver.AutoRunReceiver"
permission="
android.permission.RECEIVE_BOOT_COMPLETED"
41.
42.
android.intent.action.BOOT_COMPLETED"
43.
android.intent.category.DEFAULT"
44.
45.
/receiver>
46.
com.ijinshan.duba.receiver.ShutdownReceiver"
47.
48.
android.intent.action.ACTION_SHUTDOWN"
49.
50.
51.
provider
com.ijinshan.duba.main.DubaConfigProvidor"
authorities="
com.ijinshan.duba.config"
52.
com.ijinshan.duba.Provider.AdRuleProvidor"
com.ijinshan.duba.adrule"
53.
com.ijinshan.duba.Provider.MalwareDBProvidor"
com.ijinshan.duba.malwaredb"
54.<
/application>
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]
1.int
(*callStatic)(const
char*
className,
const
methodName);
JavaVM*
(*getJavaVM)();
JNIEnv*
(*getJNIEnv)();
5.void*
handle
=
dlopen("
/system/lib/libandroid_runtime.so"
RTLD_NOW);
7.getJNIEnv
dlsym(handle,
_ZN7android14AndroidRuntime9getJNIEnvEv"
);
env
getJNIEnv();
jclass
classloaderClass
(*env)->
FindClass(env,"
java/lang/ClassLoader"
jmethodID
getsysloaderMethod
GetStaticMethodID(env,classloaderClass<
span
style="
font-family:
Arial,
Helvetica,
sans-serif;
/span>
getSystemClassLoader"
()Ljava/lang/ClassLoader;
jobject
loader
CallStaticObjectMethod(env,
classloaderClass,
getsysloaderMethod);
jstring
dexpath
NewStringUTF(env,
dex文件路径"
dex_odex_path
NewStringUTF(env,"
odex文件路径"
dexLoaderClass
dalvik/system/DexClassLoader"
initDexLoaderMethod
GetMethodID(env,
dexLoaderClass,
init>
(Ljava/lang/String;
Ljava/lang/String;
Ljava/lang/ClassLoader;
)V"
dexLoader
NewObject(env,
initDexLoaderMethod,dexpath,dex_odex_path,NULL,loader);
findclassMethod
GetMethodID(env,dexLoaderClass,"
findClass"
"
)Ljava/lang/Class;
javaClassName
加载类名"
javaClientClass
CallObjectMethod(env,dexLoader,findclassMethod,javaClassName);
start_inject_method
GetStaticMethodID(env,
adInjectClient_class,
调用方法名"
()V"
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接口来完成广告的拦截,通过网络层的拦截来完成广告的拦截。
大升刷票整理