写到一半看到了霍金去世的消息,让我们一起致敬这位伟大的人。
起因
事情的起因是我每天在食堂吃饭,为了方便当然是微信支付,然后打饭大妈总会叫我支付完给他看一下。吃完饭去便利店,扫完码老板也叫我给他看一下,一问原来是他老婆的二维码。没几天网上就有新闻,说有人先进去买一个便宜的东西,得到了商家名称和头像,然后P了一个付款完成截图,后面的事可想而知。
看到了这个新闻,我就想,如果做一个定制版的微信能自动获取老板的头像和昵称,点击支付的时候跳到自己做的一个支付完成页面,这样商家如果没用自己的收款二维码就非常危险了。
实现
想了很久一直没时间去试验一下,看看微信这方面的防护到底如何。前几天晚上宽带断网,正好尝试开发了一下,没想到异常的顺利。
开发工具
新手机不能越狱,为了方便我使用了MonkeyDev来开发,这个工具能非常方便快捷的对一个应用注入你的代码。如何使用我就不说了,自己去他的博客学。
寻找数据
要实现这样一个功能,总的来说分为3部
1.找到你要修改的页面。
2.取得你想要的值。
3.修改目标事件。
要找到这些有很多的方法,为了快速,我使用了一款FLEX的调试工具。在我前面的博客里面也有提到它。他可以帮助我们快速的分析界面,拿到控制器及内部属性。MonkeyDev集成FLEX也是非常的简单,和正常项目一样写好配置文件,直接安装即可。
source 'https://github.com/everettjf/MonkeyDevSpecs.git'
use_frameworks!
target 'WXBalance' do
pod 'FLEX', '~> 2.0', :configurations => ['Debug']
end
target 'WXBalanceDylib' do
pod 'FLEX', '~> 2.0', :configurations => ['Debug']
end
项目里面引入头文件
#import <FLEX/FLEX.h>
然后在CHConstructor这个方法里面调用即可,这个方法是一个初始化方法。加载类,注册要修改的方法都在这里面做。
CHConstructor{
[[FLEXManager sharedManager] showExplorer];
}
全部准备好了就打开微信,会看到这样一个工具条,选select,就能选择你想看的控件了。控件点views进去就能看到他的属性,子视图。
就这样,我们非常方便的就获得了商家昵称、付款的金额和商家头像。
修改支付按钮的事件
通过FLEX工具我们能轻松的找到支付的按钮,只需清除掉原来的方法,再添加我们的方法就可以了。当然你想找到这个方法的事件直接修改也行。我做东西是怎么方便怎么来。
[btn removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
[btn addTarget:self action:@selector(MyPay) forControlEvents:UIControlEventTouchUpInside];
MyPay这个方法里面跳转到支付完成页面。
支付完成页面
我们需要的数据全部都有了,接下来就是自己写一个支付完成的页面了。其实更好的办法应该是直接调用微信的支付完成页面,但是我看了一下,支付完成页面只有几个控件,自己写几分钟就能搞定,所以我就自己写一个好了。
小问题修改
前面的开发都是在我的手机上进行的,今天在女同事面前装逼时,发现她的手机上对支付按钮的点击事件移除添加都不管用,也许是高版本或者高配手机上微信采用了其他的体验较好的方式。
搞了好久发现添加移除事件都生效了的,但是点击的时候还是不管用,也试过添加手势来实现,发现也不行,不知道是不是微信修改了手势响应链。
既然这样那只能找到支付按钮原本调用的方法,在Xcode里面调试界面的时候发现,在三维调试器里面选中按钮,右边就会显示出这个按钮绑定的方法。方法名有了,直接修改方法跳到我做的页面。搞定,装逼去了。