iOS – 添加“对象”到现有的应用程序(越狱)

如何将“对象”添加到现有的应用程序?

例如, EasyRefresh for Chrome调整function,可以在iOS Chrome应用程序中启用一个新button,就像其他许多调整一样。

我怎样才能添加一个简单的UIButton ,例如,Twitter的应用程序?

有没有任何GitHub项目可以帮助我理解它是如何完成的?


图片

图片来源: ModMyI


谢谢。

诀窍涉及一些(非常基本的)逆向工程,由几个步骤组成; 我会尽可能清楚地解释它们。

步骤零:如果应用程序从AppStore下载,则会被encryption。 您必须使用通常用于破解应用程序的脚本/应用程序之一对其进行解密; 一个命令行脚本是poedCrack.sh(谷歌它,你会发现它在一个粘贴网站快速),一个GUI应用程序是Crakculous(它是在Cydia中可用)。 请注意,其中的一个是简单(自动)解密所需要的 – 手动解密方法是太方便,不能放在一个StackOverflow的答案,这就是为什么我build议这些工具。)但是,我不以任何方式鼓励你破解应用程序! (基本上,我要求你不要使用这些工具为他们的原始目的:)如果你想看看手动解密过程, 头在这里。

第一步:你需要做什么类的应用程序使用/创build。 为此,您需要类转储或类转储z实用程序。 这个命令行应用程序反转应用程序的二进制可执行文件,并为应用程序使用的所有Objective-C类生成接口声明。 你可以在这里findclass-dump-z,这是更高级和更喜欢的变体。

第二步:在完成课堂宣言之后,你将不得不猜测哪个class级做什么和什么时候做(有点混乱)。 例如,在上面的应用程序Google Chrome中,通过class-dump-z生成的一个文件中,可能会发现类似的内容:

 @interface ChromeUrlToolbar: UIToolbar { UISearchBar *urlBar; } - (id)initWithFrame:(CGRect)frame; - (void)loadURL:(NSURL *)url; @end 

那听起来不错,不是吗? 你可以看到它的实现有一个initWithFrame:方法(和所有的UIView子类一样),为什么不尝试修改呢?

第三步:对于这个修改,你需要MobileSubstrate 。 MobileSubstrate是由Cydia的创build者Saurik创build的开发者库,为了使应用程序的代码注入变得简单。 你可以在网上find一些非常好的教程,包括这个 。 所以,你有一个类,你想“钩”它 – 所以你写这样的代码:

 static IMP __original_init; // A id __modified_init(id __self, SEL __cmd, CGRect frame) // B { __self = __original_init(__self, __cmd, frame); // C // D UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [newButton setTitle:@"Chrome Pwned"]; newButton.frame = CGRectMake(0, 0, 100, 40); [__self addSubview:newButton]; return __self; } // E __attribute__((constructor)) void init() { Class clazz = objc_getClass("ChromeUrlToolbar"); // F MSHookMessageEx(clazz, @selector(initWithFrame:), __modified_init, &__original_init); // G } 

说明:让我们从头开始。 init函数(E)被声明为__attribute__((constructor)) 。 这意味着当我们创build的代码库被加载到Chrome中时,它会自动调用。 这正是我们想要的,因为我们想要在启动它之前改变我们的应用程序的行为。

在标记为// F的行上,我们捕获了我们想要修改的类对象本身。 Objective-C是一种高度dynamic的语言; 这意味着我们可以在运行时获取和修改有关类和对象的信息。 在标记为// G的行上,我们使用MobileSubstrate API的最重要的function:MSHookMes​​sageEx。 为了理解它是如何工作的(而不是它所做的),你必须知道以下几点:Objective-C本身是作为一个简单的C库实现的 – 语言本身就是简单的C.所以每个消息都是在Obejctive -C实际上是一个C函数调用。 这些C函数有两个特殊的参数: selfcmd – 前者是被消息对象的指针,后者是select器(一个特殊的唯一指向被发送消息的名字的指针)。 因此,MSHookMes​​sageEx所做的是需要一个类和一个select器,find与之相对应的函数的实现,并将该函数与第三个参数(本例中为__modified_init中提供的函数进行交换。 为了不丢失数据,它还返回第四个参数(这里是__original_init )中的__original_init

所以,现在Chrome URL工具栏的初始化被redirect到了我们的function,接下来要做什么? 那么没什么特别的:首先我们调用原始的初始化函数(注意前两个特殊的参数,__self和__cmd!),就像正常情况下一样(这行代码用// C表示)。 然后,我们做实际的改动:在// D部分,我们创build一个UIButton,设置它的标题和位置,并添加为我们刚创build的工具栏的子视图。 然后,知道这是一个初始化函数,我们返回原始实例以及注入其中的button代码。

那么,这基本上是你需要知道的关于这个; 如果您对Objective-C的工作原理以及如何创build酷酷的iOS调整有深入的了解,那么我build议您阅读苹果关于该主题的官方文档,并且可以浏览一些我的开源Cydia调整。 以及。

我希望这能帮到您!

为了理解Objective-C运行时如何工作,您需要这样做。 尤其是消息传递系统(即调用方法)。 特别是调用的方法是在运行时确定的,而在编译时则是在其他语言中确定的。 这允许全球变化的特定方法,也就是方法swizzling

使用Mobile Substrate库,您可以用自己的方法replace任何方法实现,甚至可以调用原始实现。 当然,您需要知道方法的名称和参数,以及它所属的类。

所以要修改SpringBoard,你必须知道包含哪个类和哪个方法。 你将不得不使用class-dump或者class-dump-z工具来为你做这些工作( class-dump-z更为新颖,更多的用于iOS开发, class-dump更加灵活,并且兼容老版本的二进制文件以及64位)。

所以要转储SpringBoard,你需要在Terminal.app中input

 class-dump -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard 

对于class-dump-z, -p选项将生成@property而不是getter / setters,这更清晰,所以你可能会input

 class-dump-z -p -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard 

该行将使用SpringBoard的所有类定义在桌面上创build一个文件夹。 当然,您可能需要将path更改为适合您系统的path(关于这一点,对于Xcode的最新版本,Developer文件夹 Xcode中,所以您需要类似

 /Applications/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard 

你也可以在互联网上find那些为你做了大部分现有框架的人,如果你确定他们的系统是正确的,那么这个方法非常方便

现在,对于AppStore应用程序,您将首先需要解密它们,因为它们受到保护。 您可能需要find自己的名称和链接,因为这可能是针对堆栈溢出的ToS,尽pipe使用gdb可以达到这个目的。

为了简化工作,已经创build了一些工具,如Logos (您可能还需要看Theos ),以减less所需的样板代码。 还有一个(相当古老的) xcode模板和教程的mobilesubstrate ,提供了很好的帮助。

Logos可以很容易地从类classname钩住方法method

 %hook classname //declares the class from your application you're going to override -(void)method { dosomethingnew(); //put all your new code for the method here return %orig; //this calls the original definition of the method } %end //end hooking classname 

有关系统中的框架列表以及它们的用途,请参阅此处

最后一件事是:开源的stream行调整列表(如果可能,请链接到GitHub):

  • Chrome定制工具
  • MobileNotifier
  • UISettings (iOS 5版本在这里也似乎被拉?)
  • 尖塔
  • IconRenamer
  • Maxoimizer
  • IconRotator
  • 快速回复
  • 有了Winterboard
  • Veency

一些小小的调整

最后,看看WeekTweak ,他们每个星期都会发布开源调整,所以你可以通过查看别人的源代码来尝试自己的东西。 IRC上的#theos chan(irc.saurik.com)也会提供帮助。

Interesting Posts