Flex的使用
以前一直用Flex来实现这个装逼功能,不过用Flex缺点非常的明显,它只能返回一个固定值,不会随着你的使用减少,正好最近在研究越狱开发,不如自己来写一个,顺便记录学习过程。 Flex这个插件的确很好用,你觉得哪个方法是控制你要修改的值,直接修改返回值试一试就能知道对不对。
点这个加号添加一个新补丁
title是设置补丁的名字,选下面的Add Units…
选微信,下面是一些系统的库。
到这一步就看到了微信的类,点进去能查看类的方法,到这里和class-dump功能差不多
寻找目标方法
现在可以开始动手找要Hook的方法了。开始果断先搜索一下money
关键字,应该是返回double
long
int
之类的吧。找了半天没找到,前面两个看着像随机红包的金额,不知道对不对,谁给我发个红包试一试呗。
英语水平不够,翻译软件来凑。钱包,余额,各种关键字翻译了往搜索框里面丢,最后让我在WCPayBalanceInfo
里面发现有一个方法,这个方法返回了微信钱包里面显示的值。
-(long)m_uiAvailableBalance
点进去设置Return Value为99999,进钱包看一下,确实变了,不过少了2位,做过微信支付的都知道微信是以分为单位。
虽然很容易就找到了,不过这样碰运气的寻找方式终究不是好的办法,是时候好好学习下汇编了。
开始写插件
既然要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
文件包含了三个模块。先看看title
和entry
这两个比较简单,是标题和设置界面里面cell的设置。
比较复杂的是items这个数组里面,这个数组掌管了你的界面布局,preferenceloader这个插件真的是非常厉害,配置下Plist文件就能实现我们想要的功能。
看了这个图,相信你已经明白了个大概。每一个item
表示了一个控件。
和结果图对比可能会更清晰一点。
这里面真正有用的是item1
和item2
。
item1
是开关PSSwitchCell
,更具名字能看出是一个拥有选择功能的cell。default是默认值,我们默认为NO。defaults和key是至关重要的两个值,defaults
会在/var/mobile/Library/Preferences/com.yasin.ChangeWXMoney.plist
生成对应的Plist
文件,而key表示这个空间和Plist
文件里面的哪个值绑定。
item2
是一个带有输入框的Cell。defaults
和key
和上面的作用一样。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
到这里修改微信余额的功能就弄完了,快编译运行去装逼吧。