-
-
[原创]手机毒霸去广告功能分析二:广告View的识别
-
发表于:
2013-3-21 10:43
12235
-
[原创]手机毒霸去广告功能分析二:广告View的识别
上次我们提到手机毒霸获得root权限之后,生成一个root进程,然后通过进程注入的方式将广告应用中的广告检测出来,并且清除之。这次我们将详细介绍手机毒霸(v1.6.0)是如何找到广告View的。
一、广告View判定规则分析
接着上次的说,注入代码勾住了ActivityThread中的mH的mCallback回调【@】,拦截了RESUME_ACTIVITY(107)和PAUSE_ACTIVITY(101)消息。直接看dex2jar反编译ksremote.jar后的代码。
@com.ijinshan.remotejar.e
if (paramMessage.what == 107)
{
if (com.ijinshan.hookutil.b.a)
Log.d("HookActivityThread", "RESUME_ACTIVITY");
f.a(paramMessage.obj); //这里就是在Activity resume之前做的事情
KsRemoteCtrl.a(107);
break;
}
if (paramMessage.what == 101)
{
f.b(paramMessage.obj);
break;
}
@ com.ijinshan.remotejar.f
public static void a(Object paramObject) {//paramObjects实际是IBinder类型的token
if ((a != null) && (e != null)) {
Object localObject = a.get(paramObject);//根据token拿到ActivityClientRecord
if (localObject != null) {
Activity localActivity = c(localObject);//根据ActivityClientRecord拿到Activity
if (localActivity != null) {
//根据Activity拿到com.ijinshan.duba.a.b对象
com.ijinshan.duba.a.b localb = (com.ijinshan.duba.a.b)e.get(localActivity);
if (localb != null) localb.d();//接下来要跟这个函数
}
}
}
d();
}
@ com.ijinshan.duba.a.b
public void d()
{
if (com.ijinshan.hookutil.b.a)
Log.e(a, this.c.toString() + " onResume");
// com.ijinshan.remotejar.d.b()返回了主线程的一个Handler
com.ijinshan.remotejar.d.b().postDelayed(this.h, 1000L);
}
@com.ijinshan.duba.a.c
public void run()
{
if (!a.h());
while (true)
{
return;
if (!b.a(this.a).isFinishing())
{
b.b(this.a);
…
boolean bool = this.a.a(b.a(this.a));//这里如果找到广告View就返回true
…
if (bool)
b.a(this.a, true);
else if (b.a(this.a).getClass().toString().indexOf("qsbk.app.logic.TopActivity") > -1)
d.b().postDelayed(b.c(this.a), 500L);
}
}
}
@ com.ijinshan.duba.a.b
public boolean a(Activity paramActivity) {
int i = 0;
FrameLayout localFrameLayout = (FrameLayout)paramActivity.getWindow().getDecorView();//获得当前Activity的DecorView
if (localFrameLayout != null) {
localFrameLayout.getClass();
bool = false;
while (i < localFrameLayout.getChildCount()) {//从根开始遍历所有view
if (a("---", localFrameLayout, localFrameLayout.getChildAt(i)))//接着看a方法
bool = true;
i++;
}
}
boolean bool = false;
return bool;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!