手机支付安全性研究(卖家版)

现在大街上买啥都能手机支付,如果你是老板请不要只给你的员工一个二维码,因为这样非常危险。

Posted by yasin on March 14, 2018

写到一半看到了霍金去世的消息,让我们一起致敬这位伟大的人。

起因

事情的起因是我每天在食堂吃饭,为了方便当然是微信支付,然后打饭大妈总会叫我支付完给他看一下。吃完饭去便利店,扫完码老板也叫我给他看一下,一问原来是他老婆的二维码。没几天网上就有新闻,说有人先进去买一个便宜的东西,得到了商家名称和头像,然后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进去就能看到他的属性,子视图。

Application Support

Application Support

Application Support

就这样,我们非常方便的就获得了商家昵称、付款的金额和商家头像。

修改支付按钮的事件

通过FLEX工具我们能轻松的找到支付的按钮,只需清除掉原来的方法,再添加我们的方法就可以了。当然你想找到这个方法的事件直接修改也行。我做东西是怎么方便怎么来。

[btn removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];

[btn addTarget:self action:@selector(MyPay) forControlEvents:UIControlEventTouchUpInside];

MyPay这个方法里面跳转到支付完成页面。

支付完成页面

我们需要的数据全部都有了,接下来就是自己写一个支付完成的页面了。其实更好的办法应该是直接调用微信的支付完成页面,但是我看了一下,支付完成页面只有几个控件,自己写几分钟就能搞定,所以我就自己写一个好了。

小问题修改

前面的开发都是在我的手机上进行的,今天在女同事面前装逼时,发现她的手机上对支付按钮的点击事件移除添加都不管用,也许是高版本或者高配手机上微信采用了其他的体验较好的方式。

搞了好久发现添加移除事件都生效了的,但是点击的时候还是不管用,也试过添加手势来实现,发现也不行,不知道是不是微信修改了手势响应链。

既然这样那只能找到支付按钮原本调用的方法,在Xcode里面调试界面的时候发现,在三维调试器里面选中按钮,右边就会显示出这个按钮绑定的方法。方法名有了,直接修改方法跳到我做的页面。搞定,装逼去了。