先介绍下这个软件的情况

1,当前版本8.0.0,联网强制提示更新到8.1.0,弹窗无法关闭无法取消;
2,有一定概率不弹出更新提示,猜测是获取新版本信息超时所致;
3,然后有人就是想用旧版本,偏不更新,擦!

我的思路

1,我本来以为很简单,因为按经验,修改VersionCode就可以了,开始发现AndroidMainfast.xml中没有这个字段,当时不知道在apktool.yml里也可以改。
2,尝试在apktool.yml改了版本号之后,版本号改成功了,但还有问题,忘记啥问题了,不细说了
3,换思路,搜索“http://”,一个一个看,也没发现类似于更新网址的内容,试着把几个看起来像的地址改为127.0.0.1,也没效果,然后尝试了搜索“url”关键词,未果,“Check”关键词,未果,“Update”关键词,未果,我人已几近崩溃。
4,想到直接在16进制下修改800,于是用UltraEdit打开未经编译的AndroidMainfast.xml,搜索“03 20”和“32 00”和“00 32” ,反正结果很惨,看起来都不像,这里我是凭感觉弄的,可能门道没摸对,不是这么搜的,反正此路不通。
5,要放弃了,想到抓包看看,不过之前android上的抓包软件找不到了,搜也没搜到(谁有发给我哈,可以查看具体每个应用的联网数据的),只好用了Fiddler来实现,好在设置很简单。
开始发现它的更新地址是http://yxpt.sinaapp.com/update?bid=yx1&cp=Android&cv=8.0.0&netmode=wifi&ts=1432902866&uid=8149845&sign=97e860bf0f71346bb0eef3909ba179f8,很激动,赶紧修改hosts试试,结果它又访问了其他域名,这才注意到它貌似是通过通过ssh获取了这些网址,而client2.google.com又会被很多其他软件使用到,不能屏蔽这个,同时也说明为什么我发现了概率性的不弹更新提示,因为不同的链接访问速度不一样(刚好公司网络又非常差),其中有一些会超时。So,刚刚燃起的希望又破灭了。
QQ20150529212808
6,冷静下来,发现上面的更新网址仅仅是域名和后面参数里的sign值不同,其他参数和值都是一样的,再仔细看,参数里面有当前的版本号8.0.0,显然是用于给服务器对比是否有最新版本用的。参数名为“cv”,如果能把8.0.0改为8.1.0或更高,服务器不就认为当前是最新版了?于是立刻搜索这个关键词,发现它和其他参数都由同一个文件定义和生成,如下图QQ20150529213147
7,关键地方来了,找到这里,我灵机一动,想到了,把引号里的cv改成了cv=8.1.0&x,改了之后,软件上传的更新链接就会变成类似于这样
http://yxpt.sinaapp.com/update?bid=yx1&cp=Android&cv=8.1.0&x=8.0.0&netmode=wifi&ts=1432902866&uid=8149845&sign=97e860bf0f71346bb0eef3909ba179f8
注意看,cv参数后面的值是我刚改的8.1.0,后面的x和原来的=8.0.0组成了另外一组参数,然而并没有什么卵用,是组无意义的参数(按经验服务器才不会校验连接中是否有多余参数,浪费资源,只会取有效参数)
8,我以为OK了,结果升级提示的确没了,但是也不能打电话了,提示错误,擦,继续改,想到之前发现的一个超时逻辑,我就把这个时间改短就好了嘛,直接改成0,然后app报错,改成1(毫秒),却又提示我手机系统时间设置错误,额,蛋疼。
9,继续换思路,在浏览器里把原来的更新链接打开了,发现如下内容
{"code": 0, "data": {"tips": "\u8bf7\u7262\u8bb0\u5e10\u53f7\u5bc6\u7801\u518d\u5347\u7ea7 1.\u5168\u65b0UI\u6e05\u723d\u754c\u9762 2.WIFI\u76f4\u62e8\u65b9\u5f0f\u901a\u8bdd\u663e\u53f7, \u66f4\u65b9\u4fbf,\u66f4\u7a33\u5b9a 3.\u89e3\u51b3\u90e8\u5206\u673a\u578b\u9002\u914d\u95ee\u9898 4.\u66f4\u591a\u6539\u53d8,\u7b49\u4f60\u53d1\u73b0", "forced_flag": "y", "version": "8.1.0", "down_url": "http://113.107.238.17/dd.myapp.com/16891/9A3595BAFA8DBEA5372302AE01758C8A.apk"}}
其中的确返回了8.1.0的版本号,我就在app中搜索version字段,想将判断版本的逻辑调转一下,有新版本,则不提示,无新版本则提示更新。试了下,发现仍然有更新提示,仔细检查了我改动的地方,的确没错啊,什么原因呢?
10,又发现上面返回的内容里有一个参数是force_flag,值是y,立刻联想到,y表示yes,这里表示强制更新版本,那就按刚刚的思路,调转一下判断逻辑,识别到force_flag=y,则不强制更新,打包测试,拨了一个电话,这次成功了!

我对于android的理解非常浅薄,尤其是smali,以上如果有说的不对或者出洋相的地方,大家尽管指出来。

对了,这个应用叫东阿亿信,是一款回拨原理的通话软件,淘宝上有非常便宜的包时段卡,如果大家对这个版本感兴趣,可以花一块多钱买个账号自己研究测试一下

8.0.0版本东阿亿信下载