前言

博主之前在另一篇文章里写过IOS版墨墨背单词单词上限破解的方法(文章地址/ios-reverse/97.html),当时使用的是MonkeyDev。MonkeyDev有一些局限性就是博主没有开发者账户导致APP每过几天就要重新签名一下。前几天,Pwn20wnd发布了13.3版本的A12-A13的越狱工具。刚好博主手中有一台13.3系统的iPhoneXR,于是就萌生出了编写一个越狱插件的想法,接着就有了MomoSVIP这个插件。

Theos

插件的分析过程这里就不写了,直接拿之前文章里的参数就可以了。接下来是Theos的安装过程。

安装Theos

Theos的安装过程比较简单,直接参照作者Github所写的方法安装即可。
此处的链接为MacOS系统的安装方法,其他操作系统的安装方法均可在作者Github找到。
https://github.com/theos/theos/wiki/Installation-macOS

下载patched SDKs

官方安装方法的最后一步是下载patched SDKs,但是官方提供的SDK的最新版本是11.2,博主在调试过程中出现了一些问题。于是通过Google搜索找到另外一个Github,提供的有更新版本的SDK。链接地址如下:
https://github.com/DavidSkrundz/sdks
下载这些SDK,然后手动复制到theos/sdks目录即可。

下载sdks

虽然依然是没有最新版本的sdk,但是经博主测试编译的插件可以在13.3系统上运行。
至此,Theos的安装已经完成了。

创建Tweak工程

在终端输入以下命令:

nic.pl

然后按照下图创建Tweak

创建tweak

创建Preference Bundle

由于博主还想给这个插件写一个设置界面,所以还需要创建Preference Bundle。

一个tweak可能要设置一些选项,就像App Store上的App一样,在设置应用里面可以设置,在theos里,可以通过创建Preference Bundle来为插件提供设置界面,有点类似于Xcode里的Setting Bundle,Preference Bundle安装到手机后会在/Library/PreferenceBundles/目录生成一个对应的bundle,此bundle会基于PreferenceLoader注入到设置应用(Setting.app),而PreferenceLoader是由Dustin Howett开发的基于Mobile Substrate的工具,主要为插件在系统设置界面添加一个设置入口。

该段文字引用于KinKen的简书:https://www.jianshu.com/p/df93ba1617a3

接下来切换到刚刚创建的tweak工程目录中,进行创建Preference Bundle

cd momosvip
nic.pl

然后根据下图创建Preference Bundle。
创建Preference Bundle

编写hook代码

项目创建完成后我们打开项目文件夹下的Tweak.x编写hook代码。
这里博主直接将之前的代码进行一下简单的修改。

static BOOL svipEnable = NO;  //插件开关
%hook SettingViewController
- (void)loadTheme {
 NSMutableDictionary *settings = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/fun.kwok.momosvip.plist"];
 svipEnable = [settings objectForKey:@"svip"] ? [[settings objectForKey:@"svip"] boolValue] : NO;
//获取插件开关状态(此处与接下来要编写的Preference Bundle相关联)
 if(svipEnable) {
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"Tips" message:@"Hook successed! \n By Kwok" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
 }
}
%end

%hook InfTb
- (long long)wordsLimit {
NSMutableDictionary *settings = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/fun.kwok.momosvip.plist"];
svipEnable = [settings objectForKey:@"svip"] ? [[settings objectForKey:@"svip"] boolValue] : NO;
//获取插件开关状态(此处与接下来要编写的Preference Bundle相关联)
if(svipEnable) {
return 99999;
}
return %orig;
}
- (long long)usableWordLimit {
NSMutableDictionary *settings = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/fun.kwok.momosvip.plist"];
svipEnable = [settings objectForKey:@"svip"] ? [[settings objectForKey:@"svip"] boolValue] : NO;
//获取插件开关状态(此处与接下来要编写的Preference Bundle相关联)
    if(svipEnable) {
    return 99999;
    }
    return %orig;
}
%end

以上为hook代码并加上了简单的注释,博主写的代码可能有些笨,欢迎大家指出不足。

接着我们先编译以下看看有没有问题

make

遇到的错误

编译遇到错误
这里编译遇到了一些错误,原因是因为博主电脑上Xcode的最新版SDK是13.2的但是我们在先前下载的patched SDKs的最高版本是12.2的,这里我们对工程进行一些修改,在项目目录下的Makefile文件中加入如下代码:

export TARGET = iphone:clang:12.2:8.0

然后我们再次编译即可成功。

编写Preference Bundle

接下来编写插件的设置菜单。在PreferenceBundle项目的目录下(也就是momosvip/momosvip目录)找到Resources/Root.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>items</key>
    <array>
        <dict>
            <key>label</key>
            <string>开启SVIP功能</string>
            <key>cell</key>
            <string>PSGroupCell</string>
        </dict>
        <dict>
            <key>cell</key>
            <string>PSSwitchCell</string>
            <key>label</key>
            <string>启用</string>
            <key>default</key>
            <true/>
            <key>defaults</key>
            <string>fun.kwok.momosvip</string>
            <key>key</key>
            <string>svip</string>
        </dict>
        <dict>
            <key>label</key>
            <string>开启SVIP功能后,将无视墨墨背单词单词量上限。</string>
            <key>cell</key>
            <string>PSGroupCell</string>
        </dict>
        <dict>
            <key>label</key>
            <string>可能有封号风险,建议不要登录账号,低调使用.</string>
            <key>cell</key>
            <string>PSGroupCell</string>
        </dict>
        <dict>
            <key>label</key>
            <string>作者博客</string>
            <key>cell</key>
            <string>PSGroupCell</string>
        </dict>
        <dict>
            <key>label</key>
            <string>www.kwok.fun</string>
            <key>cell</key>
            <string>PSTextCell</string>
        </dict>
    </array>
    <key>title</key>
    <string>MomoSVIP</string>
</dict>
</plist>

这里我还放置了icon图标在该目录下。图标将在设置中显示。

Resource

打包插件

接着我们打包插件

make package

打包好的deb插件在项目目录下的packages文件夹中可以找到。

packages

安装插件

这里使用的是通过电脑将deb隔空投送到手机,并使用iFile安装。

运行效果

Cydia设置界面墨墨背单词

项目地址

博主已经项目源码和打包好后的deb上传到Github:
https://github.com/Kw0k/MomoSVIP

版权声明: 本博客所有文章除特别声明外,均采用署名-非商业性使用-相同方式共享 4.0 国际CC BY-NC-SA 4.0 )许可协议。转载请注明出处!
最后修改:2020 年 07 月 29 日 08 : 57 PM
如果觉得我的文章对你有用,请随意赞赏