老版本的摩尔庄园的辅助
我从19年买了个ipod,一直用着,很小的时候玩过摩尔庄园,老板的摩尔庄园挺好用的
摩尔庄园长这样:
这个摩尔庄园早就停服了,但是我还是很喜欢玩,我一直一直的玩,现在貌似卡住了因为没有东西可以继续弄了,但是我想研究研究能不能加一些功能。
所以开始今天的正题,小时候没有钱钱,不能充值超级会员,所以我打算破解一下vip,用honpper disassembler解包粗略扫了一下,如下:
这个包是MinimumOSVersion=4.3,DTSDKName=iphoneos6.1,内部入口类名是 iMoleVillageAppDelegate,cryptid=0。
架构上是典型 Cocos2d + OpenGLES,带 CCDirector、CommonLoadingLayer、VillageLayer、Quest、Activity、Friends 这类场景/层结构。
资源是 Cocos 包:example~iphone.ccb、大量的.pvr.ccz/.plist/.dat、TaomeeAccount.bundle、DomobOfferWallBundle.bundle、PunchBoxAdRes.bundle。
SDK 很杂:AdMob、InMobi、Domob、DianRu、PunchBox、AppDriver、NewRelic、Flurry、HockeyApp/BWQuincy、TalkingData、OpenUDID、Taomee IAP。
网络侧大量明文 http:// 到 61.com/广告/统计接口,少量 https://buy.itunes.apple.com/verifyReceipt;还会收集 IDFA/IDFV/OpenUDID/MAC/IMSI。
保护层很弱:detect-protections.sh 是 0/20,只有基础的 jailbreak/receipt 相关痕迹,没有重型反调试或完整性保护。
打开游戏后登录的路径如下:
TMALoginViewController 管账号/密码/验证码/历史账号。
成功后会落 TaomeeUserInfo、userInfoData、historyLoginUsersDataList。
密码走 keychain,相关类有 TMA_SSKeychain / MAKeychainItemWrapper。
主要登录接口是 https://account-mapi.61.com/account_service.php,兼容 mlogin.61.com / imolelogin.61.com。
后续会分流到绑定邮箱、设密码、改密、用户信息页。
因为这游戏就算是断网了也能单机玩,但是不能该名字,所以我就优先处理改名字这个问题,我直接跟mame的字段了,过程如下:
在一堆汇编代码里面发现了-[AvatarLayer saveName]这个类,汇编翻译Objective-C就是
-
(void)saveName { // 1. 拿到当前的玩家数据模型 GameData *gameData = [GameData sharedInstance]; UserInfoData *userInfo = [gameData userInfoData];
// 2. 从游戏界面的输入框 (nameTextField) 里读出你输入的名字 NSString *newName = [self.nameTextField text];
// 3. 把名字存进内存! [userInfo setName:newName];
// 4. 顺便更新游戏设置里的名字 [[GameSettings sharedInstance] setName:newName];
// 5. 更新 UI 界面上的名字标签和头像 [self.nickName setString:newName]; [self UpdateNickNameAndIcon]; } 这个还是很简单的,因为他直接保存到存档的所以写了一段脚本就干上去了,但是不行,于是继续查下去。后面想了下,保存肯定还要保存的,于是继续查save类查到了一个 -[GameData saveToLocal:]就是这个,让我保存的类 saveToLocal:里面有0007a98c … @selector(curSceneId)检查当前有没有在场景,0007a9a8 … @selector(saveUserInfoData)调用了GameData 的 saveUserInfoData的类,那就简单了 %hook AvatarLayer
-
(void)saveName { NSLog(@“[MoleMod] 检测到点击保存名字,启动强行本地化流程…”);
// 1. 获取输入框对象 Ivar textFieldIvar = class_getInstanceVariable(objc_getClass(“AvatarLayer”), “nameTextField”); if (!textFieldIvar) { NSLog(@“[MoleMod] 警告: 找不到 nameTextField,退回原始逻辑”); %orig; return; }
id textField = object_getIvar(self, textFieldIvar); NSString *newName = [textField text]; NSLog(@“[MoleMod] 获取到新名字: %@”, newName);
// 2. 强行同步到内存数据模型 id gameData = [objc_getClass(“GameData”) sharedInstance]; [[gameData userInfoData] setName:newName];
// ========================================== // 3. 强行写入磁盘!(用你刚挖出来的救命神技) // ========================================== if ([gameData respondsToSelector:@selector(saveUserInfoData)]) { [gameData saveUserInfoData]; NSLog(@“[MoleMod] 已强行触发 saveUserInfoData,名字写入本地存档成功!”); }
// 4. 强行同步到本地设置文件 id settings = [objc_getClass(“GameSettings”) sharedInstance]; if ([settings respondsToSelector:@selector(setName:)]) { [settings setName:newName]; }
// 5. 强行刷新 UI 标签 Ivar nickNameIvar = class_getInstanceVariable(objc_getClass(“AvatarLayer”), “nickName”); if (nickNameIvar) { id nickLabel = object_getIvar(self, nickNameIvar); if ([nickLabel respondsToSelector:@selector(setString:)]) { [nickLabel setString:newName]; } }
// 6. 调用重绘函数 if ([self respondsToSelector:@selector(UpdateNickNameAndIcon)]) { [self UpdateNickNameAndIcon]; }
NSLog(@“[MoleMod] 本地改名模拟完成,纯单机闭环打通!”); } %end 搞定!! 继续下一步:破解vip … 没保存过程。。。。直接看成果吧。。。。

以下是github的仓库链接 https://github.com/dogdogpeng/moelworld-tweak