去掉了烦人了启动页后,还有一个更新提示依旧很烦人。
我们查看 apk 信息时可以看到它当前的版本号是 1,而这边的更新提示显示最新版本号是 1100。当然一般应用的更新提示都不会告诉你版本号,而是告诉你版本名称和更新内容,我这边为了方便直接显示出来。
注意,应用判断是否更新时,基本都是通过版本号进行判断,而不是版本名称。
方法一:修改 AndroidManifest.xml
我们反编译 apk 中的 AndroidManifest.xml 文件查看应用的版本号和版本名称。
其中 versionCode 就是版本号,versionName 就是版本名称,我们把 versionCode 改成 9999(大于 1100) 然后编译保存,重新签名后安装测试,发现还是有更新提示,看来这个 APP 使用方法一无效。(只是对当前 APP 无效,其它 APP 还是可能有效的。)
方法二:搜索版本号
既然方法一无效,那么很大的可能是版本号写死在 dex 中,而不是运行时从 AndroidManifest.xml 里面获取,所以我们尝试去 dex 文件中搜索版本号。
所以我们用 Dex 编辑器++ 打开 apk 中的 classes.dex 文件,切换到搜索页,发起新搜索,内容输入 1,搜索类型选择整数,不要勾选十六进制,点击确认后,发现我们搜索到了 554 个结果,有点太多了。
搜索到这么多结果的主要原因是 1 这个数字出现的概率太大了,这么多结果我们不好一个一个去看,所以暂时先放弃方法二。
如果你在去除其它 APP 的更新提示时,使用该方法搜索到了很少的几个结果,只需要在代码中把对应的数字修改成大于最新版本的数字就行了。另外代码中的数字一般以十六进制显示,所以在代码中进行文本搜索时还需要手动转换一下版本号。
方法三:搜索关键字
尝试这个方法前先把 apk 备份一下,待会给方法四使用。
一般 APP 会从一个网址中读取最新版本信息,而网址是 http 开头,所以我们搜索 http,然后根据整个网址来判断它是否是我们要找的。
与更新有关的英语单词有:version、update、ver,如果你找到的网址包含其中一个,那么很可能就是它了。
如果在你搜到的网址中都找不到这几个单词,那你可以尝试使用 Dex 编辑器++,搜索类型选择代码,分别搜索上面的三个单词。
这边我尝试使用搜索网址的方式,为了查找方便,我是用 Dex 编辑器(没有++)打开 classes.dex 文件,进入字符常量池,菜单中选择过滤,输入 http。
可以看到 http://binmt.cc/test/version.txt 就包含着关键字 version,我们把它随便改成一个无效的网址,例如 http://127.0.0.1 ,修改完成后然后保存 dex 文件。
老操作,退出 Dex 编辑器,更新完后重新签名安装,打开 APP 后更新提示果然不见了。
方法四:还是搜索关键字
我再补充一个方法,这边使用方法三中备份的 apk 进行修改,因为方法三已经成功去掉更新提示了。
我们重新看下更新提示:
对话框标题中的发现新版本应该是固定的,直接在 dex 中搜索发现新版本搜不到内容,那这个字符串应该在 arsc 文件中。
我们使用 Arsc 编辑器打开 resources.arsc 文件,搜一下字符串发现新版本:
上图中第二个是在汉化应用时遗留下来的数据,不用管它,我们长按第一个,选择复制 ID,这边我们复制的 ID 是 7F0B0029。
然后我们用 Dex 编辑器++ 打开 apk 中的 classes.dex 文件,切换到搜索页,发起新搜索,内容输入 7F0B0029,搜索类型选择整数,勾选十六进制,点击确定。
我们进入 MainActivity$2$1,菜单中选择转成 Java。
可以看到 run() 方法用于显示一个对话框,猜得没错的话应该就是更新提示的对话框,我们返回到 smali 代码中,把 run() 方法中的代码删掉。
然后保存代码并编译 dex,退出 Dex 编辑器++,更新完后重新签名安装,打开 APP 同样不会出现更新提示。
总结
使用上面的方法定位到关键位置后,你可以用三个思路去掉更新提示,第一个是把版本号改大,方法一和二就是如此;第二个是让 APP 获取不到最新版本号,方法三用的就是这个思路;第三个是不让它显示更新对话框,把显示对话框的代码删掉,方法四用的就是这个思路。