AnyGoforMac是一款专门设计用于iOS设备的虚拟定位软件。通过连接到Mac,用户可以轻松地修改iPhone或iPad上的GPS位置,无需越狱。
打开软件后有一个检测是否国区,如果是则直接退出
目录全局搜索,匹配到以下资源文件
"%@isnotservedincurrentregion."="%@不在该地区服务";之后在hopper中搜索isnotservedincurrentregion,得到下图的引用;
0000000100088e18db"%@isnotservedincurrentregion.",0
调用类objc_cls_ref_GlobalFunction的俩个方法isForTest与isInChina,来判断是否弹框,然后退出;这里我们不用管isForTest,大概率是软件作者测试用的,由于是isInChinaobjc的原生方法,可用method_exchangeImplementations来交换方法,替换成我们自己的,来达到hook的目的;
method_exchangeImplementations是Objective-C中的一个函数,它允许你交换一个类中两个方法的实现。这在方法混合(methodswizzling)中非常有用,方法混合是一种在运行时对方法实现进行操作的技术,通常用于调试或在不使用子类化的情况下扩展现有类的功能。
+(int)hk_isInChina{NSLog(@">>>>>>Swizzledhk_isInChinamethodcalled");NSLog(@">>>>>>self.className:%@",self.className);return0;}[MemoryUtilshookClassMethod:objc_getClass("GlobalFunction")originalSelector:NSSelectorFromString(@"isInChina")swizzledClass:[selfclass]swizzledSelector:@selector(hk_isInChina)];之后打补丁,dylib注入,重启APP;此刻APP可以正常打开了,然后我们尝试连接手机修改位置;提示要购买;
根据提示全局搜素资源文件,匹配到以下资源文件
"Youareusingthetrialversion.Pleasebuythefullversiontoremovethelimitations."="您正在使用试用版。请购买完整版本以解除限制。";之后在hopper中搜索buythefullversiontoremovethelimitations;
定位到了函数/home.phpmod=space&uid=341152RegisterLimitWinCtr/-(void)awakeFromNib之后,便查不到引用了;
我们在函数awakeFromNib下一个断点;然后重启APP,让程序断下来,之后查看堆栈(通常只看主程序领空下的);
将这几个程序领空的栈帧地址挨个在hopper中打开分析;看到#8堆栈里有一个关键函数;
/*@classMapViewCtr*/-(int)setAllowOperation:(int)arg2{var_50=arg0;r13=[arg2retain];rax=[RegisterManagershareManager];rax=[raxretain];r14=[raxisRegistered];[raxrelease];rax=[r13objectForKey:@"pathType"];rax=[raxretain];var_40=[raxintValue];[raxrelease];var_48=r13;if(r14!=0x0){}else{//弹框}r14=[[RegisterManagershareManager]]isRegistered这里我们只需要让r14也就是isRegistered返回true即可跳过弹框;与前面一样,由于是objc的原生方法,直接用method_exchangeImplementations机制来hook
-(BOOL)hk_isRegistered{NSLog(@">>>>>>Swizzledhk_isRegisteredmethodcalled");returnYES;}[MemoryUtilshookInstanceMethod:objc_getClass("RegisterManager")originalSelector:NSSelectorFromString(@"isRegistered")swizzledClass:[selfclass]swizzledSelector:@selector(hk_isRegistered)];之后打包,dylib注入,重启;启动后,发现试用购买的提示已经没有了,但是修改手机位置的时候还是报错;
全局扫描资源文件:
"Youhaveexceededthenumberofallowedinstallations."="您已超出设备台数限制。";000000010009a2a1db"Youhaveexceededthenumberofallowedinstallations."查看引用;发现有三个地方;把这三个地方全部下断点;然后连接手机修改位置
程序最终在这里断下来了;麻烦来了,这里的代码里也没有逻辑判断的地方,而且这个方法查不到引用的地方;堆栈数据也分析不出来有用的信息;
由于我们上一步断点断在了ConnectViewCtr,所以我们直接点类一样的倒数第二个引用进去,切到假码;
r12=[[RegisterManagershareManager]retain];rax=[r13device];rax=[raxretain];r15=rax;rax=[raxUDID];rax=[raxretain];var_29=[r12isOverDevicesLimit:rax];[raxrelease];[r15release];[r12release];[rbxrelease];if(var_29==0x0)gotoloc_10003a8f1;看到这一句r12isOverDevicesLimit:rax],顿时豁然开朗,拉屎都通畅了,不多说,按照前面的姿势,直接hook;
-(BOOL)hk_isOverDevicesLimit{NSLog(@">>>>>>Swizzledhk_isOverDevicesLimitmethodcalled");returnNO;}[MemoryUtilshookInstanceMethod:objc_getClass("RegisterManager")originalSelector:NSSelectorFromString(@"isOverDevicesLimit:")swizzledClass:[selfclass]swizzledSelector:@selector(hk_isOverDevicesLimit)];