Mycool 发表于 2014-10-26 17:23:41

[续]再谈安卓比分软件启动界面的去除

本帖最后由 Mycool 于 2014-10-26 17:24 编辑

前面写过一篇去广告的帖子,里面提到了去除软件启动界面的方法。
但是当时是怎么去除的,原理是什么,我自己也不清楚。
这几天正在学习基础知识,忍不住又重新反编译看了下,找到了一种可以解释清楚的方法。

app是球探的手机比分客户端
软件在启动的时候会加载启动界面,但是这个是广告,如果点击的话就启动本机的彩客软件,本机没有的话就会启动下载。很流氓。
见图:


我们打开改之理反编译,首先打开配置文件AndroidManifest.xml
看程序第一个启动的activity。
然后我们打开这个activity对应的smali文件SplashScreenActivity.smali
点击工具栏的咖啡杯图标,启动JD_GUI阅读逆向出来的java源码
如图:

启动后如图:


我们可以看到,这个启动界面SplashScreenActivity继承了activity类,启动初始代码如下:
public void onCreate(Bundle paramBundle)
{
    super.onCreate(paramBundle);
    getApplication();
    requestWindowFeature(1);
    if (an.a())
    {
      a locala = b();
      if (locala != null)
      {
      setContentView(2130903365);
      this.a = ((Button)findViewById(2131166268));
      this.b = ((ImageView)findViewById(2131165223));
      a(locala);
      }
    }
    this.e.sendEmptyMessageDelayed(1401201108, this.c);
    an.f("Splash onCreate ");
}活动启动时,有个嵌套的条件语句if,条件成立后,就用setContentView把启动界面的内容显示出来,有朋友问了,你怎么知道这个setContentView设置的是启动的广告界面呢?好的,我们可以用setContentView(2130903365);中的数字,转换成十六进制,去public.xml文件中找到对应的布局文件,打开一看,果然是启动时的广告界面。
显示过广告界面以后,会延时一段时间,然后启动真正的程序主界面。这里要用到StartActivity方法。
我们搜索StartActivity,发现代码如下:
private void a()
{
    Intent localIntent = new Intent();
    localIntent.setFlags(67108864);
    localIntent.setClass(this, Score_MainActivity.class);
    startActivity(localIntent);
    finish();
}
这里定义了一个a()方法,他的作用就是发送一个启动Activity的意图,并结束掉自身。这里启动的Activity就是主界面的Activity即Score_MainActivity。
那么我们在上面的if条件执行前,先调用这个a()方法,不就可以跳过启动界面显示了么?
是的,就这么简单。如何修改代码来实现呢?这里需要修改smali代码。
调用a()方法的smali代码应该是怎么样的呢?我也不知道,因为不懂这个语法啊。我们继续在反编译的java源码中阅读:
protected void onResume()
{
    super.onResume();
    if (this.d)
      a();
}
可以看到,这个onResume方法调用了a()方法,Ok,我们去找这个调用方法对应的smali代码,拷贝出来。
经过对比分析,可以确定这样的一句smali代码可以实现调用方法的过程:
    invoke-direct {p0}, Lcom/bet007/mobile/score/activity/main/SplashScreenActivity;->a()VOK,我们将其粘贴到上面onCreate启动代码之中,放在if语句之前:

那么好了。程序还没来得及判断是不是满足条件来显示启动界面的广告,我们就结束掉这个activity并启动主界面activity了。
编译运行。去除启动界面的目的完美达到。




花墨 发表于 2014-10-26 18:15:10

很不错,如果是联盟的广告可以直接去androidmanifest.xml中找,像这种在启动activity中的广告只能这么来

Mycool 发表于 2014-10-26 18:54:21

花墨 发表于 2014-10-26 18:15
很不错,如果是联盟的广告可以直接去androidmanifest.xml中找,像这种在启动activity中的广告只能这么来 ...

小弟也是初学,很多不懂的地方。
这个软件,球探体育比分安卓版,我在上一个帖子里面已经提到了,启动以后的主界面很多广告条,通过修改layout目录下的ad_banner_item.xml布局文件里面的长宽属性0可以达到去广告的目的。但是这样的话,其实广告还是存在的,只是我们看不见了。我想通过修改smali代码的方法来去除广告,彻底让他不调用这个ad_banner_item.xml布局文件,这样也省的去修改布局文件中的长宽的属性了。于是我在反编译中文件中搜索ad_banner_item,没有搜索到调用的地方,搜索这个对应的id,也没有搜到。希望管理大大有空的话可以提点一番,没空我就自己继续研究咯。哈哈。学无止境。

默小坑 发表于 2014-10-27 21:33:52

厉害⊙▽⊙

Mycool 发表于 2014-10-27 23:44:36

默小坑 发表于 2014-10-27 21:33
厉害⊙▽⊙

{:3_43:}初学阶段。很多不懂的。唉。

JackIO 发表于 2014-10-28 18:08:21

不错不错,app去广告、单机游戏加金币最爽了。

vxzv 发表于 2014-10-29 18:21:17

觉得jd-gui不是很好,楼主有推荐别的查看java源码的吗

Mycool 发表于 2014-10-31 17:20:18

vxzv 发表于 2014-10-29 18:21
觉得jd-gui不是很好,楼主有推荐别的查看java源码的吗

没哦。只用过这个的。不过我想大部分反编译出来的java源码都是和真实的有不少出入的,不过可以帮助我们分析软件流程。

蝌蚪它大爷 发表于 2014-11-7 15:11:18

本人新手,大大看看能否这样?
在配置文件AndroidManifest.xml中直接改第一启动 Activity 为 Score_MainActivity.class 感觉应该可以吧。

Mycool 发表于 2014-11-8 19:19:23

蝌蚪它大爷 发表于 2014-11-7 15:11
本人新手,大大看看能否这样?
在配置文件AndroidManifest.xml中直接改第一启动 Activity 为 Score_MainAct ...

{:3_45:}思路不错。不过我没尝试过
页: [1] 2
查看完整版本: [续]再谈安卓比分软件启动界面的去除