一行代码修改微信余额

装逼必备

Posted by yasin on June 5, 2017

Flex的使用

以前一直用Flex来实现这个装逼功能,不过用Flex缺点非常的明显,它只能返回一个固定值,不会随着你的使用减少,正好最近在研究越狱开发,不如自己来写一个,顺便记录学习过程。 Flex这个插件的确很好用,你觉得哪个方法是控制你要修改的值,直接修改返回值试一试就能知道对不对。

点这个加号添加一个新补丁 Application Support

title是设置补丁的名字,选下面的Add Units… Application Support

选微信,下面是一些系统的库。 Application Support

到这一步就看到了微信的类,点进去能查看类的方法,到这里和class-dump功能差不多 Application Support

寻找目标方法

现在可以开始动手找要Hook的方法了。开始果断先搜索一下money关键字,应该是返回doublelongint之类的吧。找了半天没找到,前面两个看着像随机红包的金额,不知道对不对,谁给我发个红包试一试呗。 Application Support

英语水平不够,翻译软件来凑。钱包,余额,各种关键字翻译了往搜索框里面丢,最后让我在WCPayBalanceInfo里面发现有一个方法,这个方法返回了微信钱包里面显示的值。

-(long)m_uiAvailableBalance

点进去设置Return Value为99999,进钱包看一下,确实变了,不过少了2位,做过微信支付的都知道微信是以分为单位。 Application Support

虽然很容易就找到了,不过这样碰运气的寻找方式终究不是好的办法,是时候好好学习下汇编了。

开始写插件

既然要Hook的方法已经找到,接下来就简单了,老一套theos建工程,在xm文件里面写这些代码,数字你想改多少都行。

%hook WCPayBalanceInfo
-(long)m_uiAvailableBalance{
	return 6570000;
}
%end

make package install后进微信看看,有效果。只是钱的数值依然不能随着我们使用而改变。这里就需要用上%orig

%orig会执行一遍原本的方法,有返回值也会返回回来,这样的话,上面的代码直接给成这样就OK了。这相当于给我们原本的余额加了一个基本值。

%hook WCPayBalanceInfo
-(long)m_uiAvailableBalance{
	return %orig+6570000;
}
%end

到这里我们的插件就基本能用了,不过不能控制插件的开启与关闭,也不能自定义这个基本值为多少。这就需要我们再进一步的优化一下了。

增加开关及基本值自定义功能

上一篇博客查看App之间的跳转协议里面我们用到了PreferenceLoader这个库,其实这个库的功能非常强大,提供了很多的控件来帮我们搭建我们的设置页面。 还和上次一样在根目录layout文件夹,里面加入对应的plist文件和icon,具体结构如下图。 最后是这个样子

不过这次的Plist文件和上次就不太一样了,上次直接引入的Applist这个库。这次我们要自己搭建界面了。 Plist文件

这次的Plist文件包含了三个模块。先看看titleentry这两个比较简单,是标题和设置界面里面cell的设置。

比较复杂的是items这个数组里面,这个数组掌管了你的界面布局,preferenceloader这个插件真的是非常厉害,配置下Plist文件就能实现我们想要的功能。 Plist文件

看了这个图,相信你已经明白了个大概。每一个item表示了一个控件。 效果图

和结果图对比可能会更清晰一点。 这里面真正有用的是item1item2

item1是开关PSSwitchCell,更具名字能看出是一个拥有选择功能的cell。default是默认值,我们默认为NO。defaults和key是至关重要的两个值,defaults会在/var/mobile/Library/Preferences/com.yasin.ChangeWXMoney.plist生成对应的Plist文件,而key表示这个空间和Plist文件里面的哪个值绑定。

item2是一个带有输入框的Cell。defaultskey和上面的作用一样。isDecimalPad表示我需要用数字键盘。

更多的cell你可以到这里查看 http://iphonedevwiki.net/index.php/Preferences_specifier_plist

到这里开关和基本值输入框我们就配置好了,可以先运行看看界面有没有出现在设置里面。

修改XM文件获取开关状态及基本值

前面说到设置defaults会生成一个Plist文件,我们先把这个文件的地址定义成宏。

#define PLIST_PATH @"/var/mobile/Library/Preferences/com.yasin.ChangeWXMoney.plist"

接着修改代码,加入了判断,如果开关是开启的状态就返回(原函数返回值+基本值),否则就返回原函数的返回值。

%hook WCPayBalanceInfo
-(long)m_uiAvailableBalance{
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:PLIST_PATH];
    if(dic&&dic[@"MoneySwitch"]){
        BOOL MoneySwitch = [dic[@"MoneySwitch"] boolValue];
        CGFloat money = [[[NSDictionary dictionaryWithContentsOfFile:PLIST_PATH] valueForKey:@"money"] floatValue];
        if(MoneySwitch){
            return %orig+100*money;
        }
    }
    return %orig;
}
%end

到这里修改微信余额的功能就弄完了,快编译运行去装逼吧。