前言
今天晚上看到干百度大佬发了领取QQ飞车下载奖励的工具,刚好我这两天才把QQ飞车下下来玩,用的是雷电模拟器,看大佬那么努力我也不能闲着,于是乎我把目光瞄向了雷电模拟器的桌面。
雷电模拟器桌面广告不多,但挺烦人,我怕一误触就给我下下来几个G的游戏,安装第三方桌面确实可以避开广告,但第三方桌面UI适配不好,边缘图标可能无法点击,同时这样也会失去了官方桌面提供的特色功能,导出apk,而这一功能我时而会用到。
于是乎,直接去掉桌面广告成了最佳选择,正好雷电模拟器附带root权限,配合ES文件浏览器可以很方便地将修改后的安装包塞回系统,上图是去掉广告后的效果,请各位欣赏
特别提示:为了防止修改失败导致无法进入桌面启动应用,请在开始前先安装一个第三方桌面,例如冷桌面、Nova Launcher
环境准备
Apk Tool 2.5.0
jadx-1.2.0
jdk-11(貌似网站有防盗链,直接访问injdk.cn下载吧)
言归正传,我们开始了
首先,我们看看雷电模拟器的桌面到底对应哪个apk,我们知道,安卓喜欢管桌面叫启动器,加上系统应用里也就这位长得和安卓原生桌面的图标一模一样,因此,这个带有Launcher3字样的就是我们要找的家伙
长按备份,就可以将其导出到backups目录下,再复制粘贴到 Pictures 里,就能从电脑目录将app取出了。
我们将取出的app放进jadx分析(不要被大佬们的骚操作吓住了,其实大多数app都是无加固甚至无压缩的,冲就对了),发现代码清晰地展现在我们眼前,这些带有ad字样的一看就不是好东西,先瞅几眼:
好吧,这里面没看见加载广告的网络请求,那就换下一个,LdHotSeatAdImp明显是一个“实现类”,实现了啥接口我没看着,但毫无疑问干活的肯定是它,那就进去看看吧:
这不就一下子找到广告了吗,我们用浏览器打开这个链接,会发现一大串Json字符,就是这些所谓的“热门游戏”,链接放此处,有兴趣的同学自己观摩一下:http://res.ldmnq.com/ldmnq_file/mnq_ad_json
大家注意showLauncherIcon方法需要同时满足三个条件才会执行,只要其中一个不满足就会直接返回,那自然就不会加载到广告了:
iconViews != null && !iconViews.isEmpty() && toastView2 != null
所以我们设法让这个函数在任何情况下都直接反回就可以了
分析完毕,接下来进入smail
用
java -jar Apktool_2.5.0.jar d Launcher3_7.1.2.apk
解包apk,找到com.ldmnq.LdHotSeatAdImp对应的smail,搜索showLauncherIcon,定位到方法开头:
.method public showLauncherIcon(Landroid/content/Context;Ljava/util/List;Lcom/ldmnq/LdHotSeatAdImp$ToastView;I)V
.locals 3
.param p1, "context" # Landroid/content/Context;
.param p3, "toastView" # Lcom/ldmnq/LdHotSeatAdImp$ToastView;
.param p4, "iconHW" # I
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Landroid/content/Context;",
"Ljava/util/List",
"<",
"Landroid/widget/TextView;",
">;",
"Lcom/ldmnq/LdHotSeatAdImp$ToastView;",
"I)V"
}
.end annotation
.prologue
.line 156
.local p2, "iconViews":Ljava/util/List;, "Ljava/util/List<Landroid/widget/TextView;>;"
if-eqz p2, :cond_0
invoke-interface {p2}, Ljava/util/List;->isEmpty()Z
move-result v0
if-nez v0, :cond_0
if-nez p3, :cond_1
.line 157
:cond_0
return-void
这里代码明显比上篇分析复杂多了,我们只看前面一小部分,注意if-eqz p2, :cond_0
就是说如果 p2为0(或false或null),进入cond_0,而cond_0就是return-void,也就是函数直接返回,可见这里就是对第一个条件的判断,而if-nez v0, :cond_0
表示如果v0非零,函数直接返回,参考这条,我们只要在if-eqz p2, :cond_0
后面加上一句if-nez p2, :cond_0
,就能保证无论p2是不是0,函数都会立刻返回,上面的if条件相当于变成了
if(iconViews != null && iconViews == null && !iconViews.isEmpty() && toastView2 != null)
显然是个永假式
修改好后,我们用
java -jar Apktool_2.5.0.jar b Launcher3_7.1.2
重新打包,再用
jarsigner -keystore debug.keystore -storepass android -signedjar signed.apk Launcher3_7.1.2.apk keyalias
重新给apk签名(记住这个免费的命令,可以省掉开mt会员的钱),去广告版的雷电桌面就做好了
安装
我觉得有必要单独交代一下安装步骤,简单写写:
首先,立刻安装一个第三方桌面作为过渡(除非你有信心一次成功或者特别熟悉启动应用的adb命令),并将我们破解的apk导入模拟器(此时还无法安装)
然后,授予ES文件浏览器Root权限,并借此卸载掉系统桌面
接下来,把我们导入的apk移动到 /app/Launcher3/ ,并重启模拟器
重启后,选择系统桌面进入,会发现底下的广告已经不见了,此后可以删除第三方桌面
最后再欣赏一下去掉广告的模拟器桌面吧,嗯,这才是去广告版后该有的样子