发新帖

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

[复制链接]
21507 16
本帖最后由 Mycool 于 2014-10-26 17:24 编辑

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

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


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

启动后如图:


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

可以看到,这个onResume方法调用了a()方法,Ok,我们去找这个调用方法对应的smali代码,拷贝出来。
经过对比分析,可以确定这样的一句smali代码可以实现调用方法的过程:
  1.     invoke-direct {p0}, Lcom/bet007/mobile/score/activity/main/SplashScreenActivity;->a()V
复制代码
OK,我们将其粘贴到上面onCreate启动代码之中,放在if语句之前:

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

精彩评论16

花墨    发表于 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 | 显示全部楼层

{: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:}思路不错。不过我没尝试过

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表