最近学校出了一个GiWiFi无线网络,因为速度比较可观,而且可以免费试用,所以用的人还是比较多的。要在手机上使用这一网络要下一个客户端,而客户端带有许多广告和额外的没有用的功能。我自己用过一些APP的去广告版,之前也写过一个简单的Andriod App,于是决定这次自己进行修改。查阅了一些Android反编译的相关资料后,就着手开始进行。

我使用了一个集成软件APK改之理,它集成了许多反编译工具,使用起来也很方便。

先来看一下APP的界面:

启动页出现了广告,在界面中按下后退键时也会弹出插屏广告,有时还会出现多个广告自动轮播的现象,娱乐、本地版块对我来说也是没有用的功能。现在将针对以上问题进行修改。

首先是启动页广告,使用APK改之理反编译后,打开AndroidManifest.xml。最先启动的Activity一定有“android.intent.action.MAIN”字段,所以依此进行查找,定位到的类名为“com.gbcom.gwifi.functions.loading.LaunchActivity”,然后再到smail文件夹中找到对应的LaunchActivity.smali文件。有Activity就一定会有相应的xml文件,直接搜索“LaunchActivity”字符串并未搜到想要的结果,于是改用“Launch”字段搜索,发现“launch_activity.xml”,应为对应的xml文件。

分析launch_activity.xml,发现id为“launch_img”的ImageView下面紧跟着一个id为“launch_ad_img”的ImageView。下一个RelativeLayout的id为ad_layout,后跟的参数为“android:visibility=“invisible””,下面的LinearLayout有两个TextView,一个的android:text字段为“跳过”,另一个无android:text字段,但从id“countdown”可以看出应该是类似倒计时的文字。由此可以判断广告的布局字段应该是这几个。

搜索“ad_layout”,在public.xml中搜索到id为“0x7f0c003f”。继续搜索“0x7f0c003f”,在LaunchActivity.smali中发现3处调用此id的代码。因为要将广告显示,所以应该会有“setVisibility”字段。接下来分析第一处代码,发现有对RelativeLayout的操作,但并没有看到“setVisibility”字段,这里暂且放下。第二处代码也没有“setVisibility”字段,第三处代码虽有,但并不是对RelativeLayout操作。这时推断setVisibility操作可能不在此文件中。

重新检查第一处代码,发现其中一句“new-instance v3, Lcom/gbcom/gwifi/functions/loading/q;”引用了一个其他类,定位到这一文件,发现有一个onAdPresent方法,里面有对RelativeLayout的setVisibility操作,“invoke-virtual {v0, v2}, Landroid/widget/RelativeLayout;->setVisibility(I)V”,v2变量的定义为“const/4 v2, 0x0”。setVisibility有"Visible",“Invisible”,“Gone"三个值可传,对应的常量值为0、4、8,于是把v2的定义改为“const/16 v2, 0x8”,进行回编译,安装到手机中,发现启动页广告已不再显示。

下一步处理其他Activity的广告。其他广告出现时右上角总会有一个关闭按钮,于是在res/drawable-hdpi-v4文件夹下找到此按钮close_ad_1_icon.png,搜索“close_ad_1_icon”字段,在layout文件夹下发现两个xml文件含有此按钮。fragment_tabs.xml文件中有TabHost标签,而TabHost多用于选项卡设计。activity_swipe.xml中出现了ViewPager,而ViewPager是实现图片轮播的一个手段,这也与广告出现的方式相对应。两个xml都出现了之前出现过的ad_layout字样,其下两个ImageView的id分别为ad_iv和close_ad_iv,可以推断这就是广告的布局。

之前已经查找过ad_layout,其id“0x7f0c003f”在MainActivity.smali中也出现过,于是定位到代码段。 附近并未出现“setVisibility”字段,而且所有MainActivity.java的子类也没有出现对RelativeLayout的setVisibility方法。后来我又想,既然广告是按后退键后出现的,那么可能是重写的onBackPressed这一方法,于是搜索“onBackPressed”字段,对所有可能加入广告的onBackPressed方法进行修改,但回编译后广告依然显示。

这时我决定换一种思路,对广告的加载进行限制。反编译后的smail/com文件夹中,baidu、qq文件夹都是广告的来源。在MainActivity.smali中搜索baidu、qq字符串,对含有“loadAd”、“showAd”类似字段的代码行进行注释 invoke-virtual {v0}, Lcom/baidu/mobads/InterstitialAd;->loadAd()V

invoke-virtual {v0, p0}, Lcom/baidu/mobads/InterstitialAd;->showAd(Landroid/app/Activity;)V

invoke-virtual {v0}, Lcom/qq/e/ads/interstitial/InterstitialAD;->loadAD()V

注释掉这几句后,经测试APP所有的弹出式广告均已去除。

后来我查阅资料是发现了一个更为简单的方法,因为APP用的是百度移动广告联盟的SDK,其在AndroidManifest.xml要添加一系列代码,只要将下图标示的一行注释掉,即可去除所有百度提供的广告。

下面就应该去除那些没有用的内容了。在“连接”这一选项卡中,除连接WiFi功能外,其他都是不需要的。搜索“连接WiFi”字样,定位到tp_first_fragment.xml文件。经分析后发现,除去Wifi的布局,剩下的只有一个id为“content”的LinearLayout,我选择将此控件隐藏,在其中添加参数“android:visibility=“gone” ”,有关这一选项卡的修改完成。

“娱乐”这一选项卡应完全去除,于是搜索“娱乐”字段,发现并没有需要的内容,这时猜测“娱乐”字段可能写进了java代码,而反编译出的smali文件将其转化成了Unicode编码。把“娱乐”转成Unicode编码“\u5a31\u4e50”再次查找,在MainActivity.smali中定位,将相关代码注释掉,用同样的方法处理“本地”字段,回编译后两栏已去除。

其余小修改在此不再赘述,至此GiWiFi手机助手的反编译完成。 反编译后的GiWiFi手机助手

PS:第一次回编译后发现原本26.9MB的APK变成了40.2MB。查阅资料后发现apktool 2.0.3版本后引入了compressionType和doNotCompress两个字段,只要将doNotCompress字段下的文件类型删除即可。

APK反编译基础资料: http://blog.csdn.net/lpohvbe/article/details/7981386

反编译后的APP: GiWiFi_decompiled.apk