Ted's iOS Mod Menu的食用方法


特征:
可定制的用户界面
可定制的菜单和按钮图像图标
4 种类型的开关:
偏移补丁开关
空开关
文本修改
滑块开关
后端偏移补丁程序基于 KittyMemory
不需要原始字节
支持 MSHookMemory
将无限字节写入偏移量
编译时字符串加密
开源菜单

安装:
您可以在此处下载模板:https://github.com/joeyjurjens/iOS-Mod-Menu-Template-for-Theos/tree/master
Mobile设备:
在makefile第 22 行中,必须设置 SDK 的路径。此菜单已使用来自theos/sdks的“iPhoneOS11.2.sdk”SDK进行了测试
我在这个项目中使用了initializer_list,iOS 版本没有包含它。您可以在此处下载(raw.githubusercontent.com/joeyjurjens/iOS-Mod-Menu-Template-for-Theos/977e9ff2c626d6b1308eed7e17f1daf0a610e8e9/template/KittyMemory/initializer_list),将其另存为“initializer_list”并将文件复制到:“$THEOS/sdks/iPhoneOS11.2.sdk/usr/include/c++/4.2.1/”
iMac:
安装 xCode(如果尚未安装)。
在项目的makefile文件中,将“MOBILE_THEOS=1”更改为“MOBILE_THEOS=0”

菜单设置:
更改菜单图像在Tweak.xm中,您将在“setupMenu”功能下设置菜单。 在这里,您将在菜单下看到两个选项:menuIcon和menuButton,它们需要base64图像字符串。 为了从图像中获取base64字符串,请在此处转换图像:https://www.browserling.com/tools/image-to-base64
建议使用50x50的图像,您可以通过复制标准(在tweak.xm中)base64字符串来获取我的图像样本,并使用此网站显示图片:https://base64.guru/converter/decode/image

设置要被修改的FrameworkName文件您可以在 Tweak.xm 中的函数 setupMenu() 中进行设置。
[menu setFrameworkName:"FrameworkName"];
比如我想修改TestFile.dylib则修改成
[menu setFrameworkName:"TestFile.dylib"];

菜单用法(Demo):
Offsets(基址):
ENCRYPTOFFSET("0x10047FD90")
Hexes(补丁):
ENCRYPTHEX("0x00F0271E0008201EC0035FD6")
C-strings:
ENCRYPT("I am a c-string")
NSStrings:
NSSENCRYPT("Copperplate-Bold")
无开关自动Patch基址(菜单加载后自动修改):
patchOffset(ENCRYPTOFFSET("0x1002DB3C8"), ENCRYPTHEX("0xC0035FD6"));
patchOffset(ENCRYPTOFFSET("0x10020D2D4"), ENCRYPTHEX("0x00008052C0035FD6"));
// You can write as many bytes as you want to an offset
patchOffset(ENCRYPTOFFSET("0x10020D3A8"), ENCRYPTHEX("0x00F0271E0008201EC0035FD6"));
// or
patchOffset(ENCRYPTOFFSET("0x10020D3A8"), ENCRYPTHEX("00F0271E0008201EC0035FD6"));
// spaces are fine too
patchOffset(ENCRYPTOFFSET("0x10020D3A8"), ENCRYPTHEX("00 F0 27 1E 00 08 20 1E C0 03 5F D6"));
基址修改开关:
[switches addOffsetSwitch:NSSENCRYPT("One Hit Kill")
description:NSSENCRYPT("Enemy will die instantly")
offsets: {
ENCRYPTOFFSET("0x1001BB2C0"),
ENCRYPTOFFSET("0x1002CB3B0"),
ENCRYPTOFFSET("0x1002CB3B8")
}
bytes: {
ENCRYPTHEX("0x00E0BF12C0035FD6"),
ENCRYPTHEX("0xC0035FD6"),
ENCRYPTHEX("0x00F0271E0008201EC0035FD6")
}
];

空开关(没有任何功能的开关):
[switches addSwitch:NSSENCRYPT("Masskill")
description:NSSENCRYPT("Teleport all enemies to you without them knowing")
]

文本开关:
[switches addTextfieldSwitch:NSSENCRYPT("Custom Gold")
description:NSSENCRYPT("Here you can enter your own gold amount")
inputBorderColor:UIColorFromHex(0xBD0000)
];

滑块开关:
[switches addSliderSwitch:NSSENCRYPT("Custom Move Speed")
description:NSSENCRYPT("Set your custom move speed")
minimumValue:0
maximumValue:10
sliderColor:UIColorFromHex(0xBD0000)
];

检测开关是否开启:
bool isOn = [switches isSwitchOn:NSSENCRYPT("Switch Name Goes Here")];
if(isOn) {
//Do stuff
}
//Or check directly:
if([switches isSwitchOn:NSSENCRYPT("Switch Name Goes Here")]) {
// Do stuff
}
进阶用法搭配空开关HOOK函数
在 void setup() { 前插入HOOK代码和检测开关代码
%hook SKPaymentTransaction
-(long long)transactionState {
if([switches isSwitchOn:NSSENCRYPT("In Purchase Crack")]) {
return 1;
}
return %orig;
}
%end
空开关代码
[switches addSwitch:NSSENCRYPT("In Purchase Crack")
description:NSSENCRYPT("Use To Buy Full DLC")
];
}
获取滑块或文本开关内容:
int userValue = [[switches getValueFromSwitch:NSSENCRYPT("Switch Name Goes Here")] intValue];
float userValue2 = [[switches getValueFromSwitch:NSSENCRYPT("Switch Name Goes Here")] floatValue];
