Tag: swizzling

通过3类课程来破解PokemonGo iOS应用

在我之前的文章“如何对.ipa文件执行iOS代码注入”中,我通过概念证明展示了开发人员如何在不修改原始源代码的情况下将单个日志消息注入到iOS .ipa文件中。 由于PokemonGo应用程序最近在开发社区中的流行和兴趣,我选择了PokemonGo应用程序作为演示代码注入的目标。 这篇文章的灵感来自于PokeGo ++ mod的作者Will Cobb的作品。 可以在http://pokemongohacks.me/中找到有关他的mod应用程序的下载说明。 PokeGo ++ mod具有优雅的位置欺骗功能,已注入基础的PokemonGo游戏中。 我们将尝试为游戏创建我们自己的简单位置欺骗mod。 可以直接从iOS App Store破解原始的PokemonGo.ipa文件,然后将其安装到非越狱的手机上(敬请期待有关此内容的后续文章)。 为了简单起见,我将在一个破裂的.ipa文件上展示代码注入技术。 破裂的.ipa基本上是原始的ipa文件,其中删除了数字版权管理(DRM)。 这是您构建此mod应用程序(或修改)所需的资源 获取一个破解但未修改的PokemonGo .ipa文件。 您可以在https://www.iphonecake.com/app_1094591345_.html下载最新版本。 代码注入所需的位置欺骗代码https://github.com/depoon/InjectibleLocationSpoofing 执行代码注入的脚本https://github.com/depoon/iOSDylibInjectionDemo Cydia Impactor可以将应用程序辞职并将其侧面加载/安装到非越狱设备上。 Cydia Impactor可以从http://www.cydiaimpactor.com/下载。 由于代码注入过程和技术已在我之前的帖子https://medium.com/@kennethpoon/how-to-perform-ios-code-injection-on-ipa-files-1ba91d9438db中进行了描述,因此在本文中,我们将仅关注位置欺骗代码的内容。 只有3个文件??? 那就对了。 入侵任何应用程序的复杂性取决于您想要实现的目标以及您对iOS应用程序开发的了解。 在我们的情况下,我们只需要提供管理设备位置伪造所需的最低UI。 现在,在XCode中创建一个Cocoa Touch Dynamic Framework目标,并创建链接到该框架目标的以下类 PatchLoader(目标C) 位置Swizzler(快速) PatchUIManager(快速) 类说明 位置Swizzler.swift 进口基金会 导入CoreLocation 公共类LocationSwizzler :NSObject { static var currentLocation = CLLocationCoordinate2DMake(1.293760,103.853709)// Raffles City 静态var originalMethod:方法? […]

方法Swizzling不起作用

我想利用方法调整,但我无法得到甚至简单的例子为我工作。 我可能误解了这个概念,但据我所知,它允许交换方法实现。 给定两个方法,A和B,我想交换他们的实现,调用A会执行B代替。 我偶然发现了几个例子( example1和example2 )。 我用一个类创build了一个新项目来testing这个。 class Swizzle: NSObject { func method() { print("A"); } } extension Swizzle { override class func initialize() { struct Static { static var token: dispatch_once_t = 0; } // make sure this isn't a subclass if (self !== Swizzle.self) { return; } dispatch_once(&Static.token) { let originalSelector = Selector("method"); […]

关于如何从所需设备中捕获“试图插入零对象”的build议

这是一个情况:霍克亚普和testing飞行时不时抱怨我 “尝试插入零对象” 在可变字典/数组中。 我知道正确的做法是一直检查零,而我做的时候才有意义。我们的testing人员无法捕捉到这些崩溃,但AppStore的用户显然可以。 我的猜测是,有时服务器返回NSNulls,当它不应该。 因此,不要在大型​​项目中插入无为零的检查,我的想法是为testing人员创build一个单独的目标,并为集合类使用方法调整。 说,我会replaceinsertObject:atIndex与我的swizzled_insertObject:atIndex ,其中如果对象实际上是零我login/显示一个描述性的报告之前,崩溃。 事情是我不能用__NSPlaceholderDictionary或__NSArrayM (只是因为我不能在私人类上做一个类别)使用__NSPlaceholderDictionary ,这让我很难过。 所以基本上我是在寻求如何捕捉这些令人讨厌的罕见碰撞的build议。 我想到的一个解决scheme是使用try-catch块,我知道它们在Objective-C中是很昂贵的,所以我不会在生产中使用它们,只是为了testing人员。 但是被#ifdef – #endif -s包围的try-catche -s包围的方法将会擦除代码的所有可读性。 所以我正在寻找一个更优雅的解决scheme。 谢谢。 更新:堆栈跟踪是不是非常不具有描述性,这是我得到的 Exception Type: SIGABRT Exception Codes: #0 at 0x3a378350 Crashed Thread: 0 Application Specific Information: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]' Last […]

一个单一的实例,而不是一个类

我有一个类NSObject应该这样做的东西。 当我在对象上调用它时,我想重写它的dealloc方法来做一些清理。 我想使用方法swizzling做,但无法弄清楚如何。 我发现的唯一例子是如何replace整个类的方法实现(在我的情况下,它会覆盖所有NSObject的dealloc – 我不想)。 我想重写NSObject的特定实例的dealloc方法。 @interface NSObject(MyCategory) -(void)test; @end @implementation NSObject(MyCategory) -(void)newDealloc { // do some cleanup here [self dealloc]; // call actual dealloc method } -(void)test { IMP orig=[self methodForSelector:@selector(dealloc)]; IMP repl=[self methodForSelector:@selector(newDealloc)]; if (…) // 'test' might be called several times, this replacement should happen only on the first call { […]

如何调整NSURLSession类的方法dataTaskWithUrl

我一直在试图修改NSURLSession类的方法dataTaskWithRequest,但不能完成它 extension NSURLSession{ public override class func initialize() { struct Static { static var token: dispatch_once_t = 0 } if self !== NSURLSession.self { return } dispatch_once(&Static.token) { let originalSelector = Selector("dataTaskWithRequest:completionHandler:") let swizzledSelector = Selector("my_dataTaskWithRequest:completionHandler:") let originalMethod = class_getInstanceMethod(self, originalSelector) let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if didAddMethod […]

如何在覆盖某个类别的方法时调用原始实现?

我试图弄清楚事情是如何工作的。 所以我想,当我将覆盖某些方法使用类别,我会得到有趣的NSLogs。 @implementation UIView(Learning) – (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { NSLog(@"-hitTest:withEvent: event=%@", event); return [self hitTest:point withEvent:event]; } @end 超级和自我不在这里工作。 有没有办法调用-hitTest:withEvent的原始实现:? 我想要的是NSLog每次-hitTest:withEvent:在UIView上调用。 这只是个人学习的目的。 我希望看到事件的实施。

应用程序商店 – 方法Swizzling合法性

是否有任何最新的信息在App Store上是否合法? 我能find的唯一数据点就是Three20框架的改变 ,从这个通知开始: 当前发布到App Store的您的应用程序xxx正在使用method_exchangeImplementations将Apple提供的API的实现与您自己的实现交换。 由于即将发生的变化,您的应用程序中的这种行为可能会导致崩溃或iPhone OS 4.0上的用户数据丢失。 xxx使用method_exchangeImplementations与你的方法ttdealloc交换dealloc的实现。 它还交换popViewControllerAnimated方法的实现:用你的方法popViewControllerAnimated2 :. 请立即解决此问题,并将新的二进制file upload到iTunes Connect。 如果我们认为这样做是谨慎或必要的,我们可能会删除您的申请。 当我四处搜寻时,我可以find关于swizzling和应用程序商店的每一个最近的对话似乎都参考了相同的Three20事件。 该通知似乎是非常具体的,我想知道这个问题是具体的变化Three20所做的更改或如果method_exchangeImplementations普遍被禁止的问题。 还有没有其他的数据说明这种做法是否被允许? 商店中是否有开发商正在使用swizzling的应用程序? 谢谢!