自定义一加钱包交通卡卡面(通过Fiddler实现)
自定义一加钱包交通卡卡面(通过Fiddler实现)
0x0 前言:为什么要折腾
本人因为去了外地上大学,所以手机里面早已开通的交通联合卡就派上了用场。无论是在北京转车坐北京地铁还是去沈阳旅游坐地铁,只要掏出手机【碰一下】就能很方便的进站出站。
然后我用的那个京津冀互联互通卡的默认卡面就很不够好看,并且在钱包里面还是不支持自定义的。经过半天的研究,于是就有了这篇文章。因为我之前都是在手机上使用小黄鸟进行重写,现在高版本安卓已经彻底无法使用,而它的后继者Reqable不支持移动端重写响应,所以我头一次使用了Fiddler。所以改卡的同时还顺便入门了Fiddler,也算是有点收获了。
0x1 探索:寻找入手点
因为我的手机root了,所以我首先想到的是自己写一个xposed模块来实现这个功能。不过经过一段时间的逆向工程之后,并没有在浩如烟海的smail中找到一个合适的入手点。因为我本来就只写过一次xposed插件,各种骚操作还是了解不多
于是我就转换思路,通过在钱包的数据目录里查找我开通的“京津冀互联互通卡”这个字符串,我定位到了位于它数据目录里database/wallet
这个数据库。
通过查看这个数据库,发现卡面的图像url就存在这个数据库里,并且这个数据库还存储了其他可以开的卡的卡面url。
我的第一反应是直接修改这个数据库,然而并没有奏效。在经过多次尝试之后,我发现这跟钱包app的缓存机制有关系,第一次请求拿到之后就不再进行多次请求获取。但问题又来了,这个缓存文件放在哪里我通过各种办法找了很多次,也没有找到。唯一已知的是它没有被放在缓存区,因为设置里面的清除缓存对它是无效的。
由于我在钱包app里面除了这个卡没有其他的服务,而这些卡片数据是云同步(或者放在其他不会被清除的区域里,这不重要,反正就是清除数据以后还在就对了)所以我最终使用了清除数据+fiddler抓包的方法来修改卡面。
0x2 实操:抓包法应用
首先你得准备一个自己的卡面,可以随意设计,不用预留四角的圆角。
卡面中央的灵梦画像PID:101731016,本人仅娱乐用途自用,没有也不会用于任何商业用途,侵删。
交通联合Logo仅仅说明卡片类型,同样仅娱乐用途自用,没有也不会用于任何商业用途。
fiddler是一个抓包软件,我们可以通过连接到它的http代理的形式来在电脑上抓取手机的数据包。关于Fiddler如何启用https抓取,请自行百度,这不是本文重点。
注意!因为涉及到https数据包的操作,的这里的操作需要安装Fiddler证书到系统目录,我使用的方案是MoveCertificate模块自动移动的方案,省事省心,不过这里还涉及到一个证书格式从crt转换到der的操作,具体请自行百度,这里只贴相关命令:
1 |
|
安装完CA之后在手机那里设置好代理指向fiddler的服务(电脑ip:8888)就可以抓包了。
首先清除钱包APP的数据,再次打开钱包应用时,可以在fiddler上看到许多它产生的请求,其中就包括了我们的默认卡面图像:
重写这个响应,我们需要给这个url下一个断点。首先我们在这张图片对应的请求右键Copy->Just Url拿到这个url(实际上和上面数据库里面的是一样的),然后再在下面的命令输入框输入bpu 默认卡面url
然后回车,下次再遇到这个请求就会被拦下,让我们任意摆布:
设置好断点之后我们再次清除钱包APP的数据,这次你点进乘车页面会发现它的卡面没有加载出来,这就说明已经这个响应被拦截,同时Fiddler中可以找到这个被拦截的请求:
这时候就是考验我们手速的时候了,点进这个请求,在Choose Respose
中选择Find a File
,打开你准备好的卡面图片,再点击Run to Completion
,如果在钱包判定这个请求超时之前(也许是30s?15s之类的)你完成了这一套小连招,你就能在手机上看到你改好的卡面了:
由于我前面提到的缓存机制,这个卡面并不会在没有清除数据的情况下消失,你可以放心地撤掉Fiddler的代理然后拿着这个自定义卡面到处刷了。Enjoy it!