如何在.ipa文件上执行iOS代码注入

代码注入是将外部代码引入现有软件系统的过程。 在本文中,我将分享在iOS应用上执行iOS代码注入所需的工具和技术。 借助XCode,可以设置实验来展示实际运行中的iOS代码注入。 想法是创建一组独立的代码,将其与最终应用程序打包,然后以某种方式执行新代码。

[注:此代码注入过程已被证明可在iOS 9.3、10.0.2和XCode v7.3和v8.0上运行。 我尚未在其他OS或XCode版本上尝试过此操作]

我们可以通过两种方式通过Xcode创建一个独立的二进制包:
–通过(Cocoa Touch Framework)的动态库
–通过(可可触摸静态库)的静态库

静态库

  • 在编译时链接的代码单位。
  • 静态库需要在.ipa编译期间可用,才能执行其代码
  • 静态库不支持Swift
  • 没有已知的方法来指示.ipa加载静态库
  • 我们 不能直接使用静态库。 您可能需要先将其转换为动态库

动态库

  • 在运行时链接的代码单位。 Xcode确实要求在编译期间必须提供依赖的Dynamic Library / Frameworks,但不能保证将这些依赖关系打包到应用程序中。 这就是为什么有时您可能会遇到运行时动态库加载错误的原因,例如
    dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
  • 我们可以为动态库构建Swift代码
  • 需要在.ipa上执行Load Dylib命令,以便在启动应用程序之前将动态库加载到内存中。
  • 是的,我们可以使用此🙂

选择dylib(动态库)作为我们的自定义代码包后,让我们使用XCode演示概念的代码注入。

通过XCode进行概念注入的代码证明

步骤如下

  1. 创建一个新的XCode项目
  2. 创建一个新的iOS应用程序目标。
  3. 创建一个新的“ Cocoa Touch Framework”目标。 让我们称之为“ PatchPGO”
  4. 创建一个新的Objective-C可可接触类。 我们称之为“ PatchLoader”。 在.m文件中添加以下方法。
  @implementation PatchLoader 

静态void __attribute __((constructor))initialize(void){
NSLog(@“ ====行动中的代码注入====”);
/ *
将代码注入代码放在此处
* /
}

@结束

使用 "static void __attribute__((constructor))”作为initialize方法的修饰符,我们可以指定在应用程序启动前将类加载到内存中时要执行的操作。您可以将其视为“入口”代码注入到iOS应用程序中。

5.运行iOS应用程序目标,以确保日志控制台输出的代码与代码注入之前的期望值相同。

6.现在,将Dynamic Framework文件链接到您的iOS应用程序。 确保根据需要嵌入框架。

7.现在您的iOS应用程序目标已正确链接,运行目标并观察您的日志记录控制台。 我们的NSLog消息已成功注入到我们的iOS应用程序目标应用程序中。

请注意,已观察到行为更改(新的日志记录消息),但是尚未修改应用程序目标代码。 在后台,Xcode在代码签名和安装修改后的应用程序之前将库链接到目标。 在上述通过Xcode进行的代码注入实验中,开发人员拥有该应用程序的源代码。 现在,让我们尝试将代码注入到开发人员不拥有源代码的.ipa文件中。

.ipa文件的概念代码注入证明

步骤如下

  1. 下载和选择的.ipa文件。 您可能会发现来自第三方内容提供商的破解的.ipa文件(例如,www.iphonecake.com)
  2. 下载optool(https://github.com/alexzielenski/optool)或
    下载/克隆我的存储库( https://github.com/depoon/iOSDylibInjectionDemo 。 该存储库包含optool,脚本“ patchapp.sh”将dylib(通过optool)加载到给定的.ipa文件中。 详细信息在自述文件中。
  3. 在iOSDylibInjectionDemo文件夹中创建一个文件夹,以包含要注入到.ipa中的动态库二进制文件。 让我们称之为“ Dylibs
  4. 转到框架(在上述实验中的XCode中创建的框架)文件夹,然后检查框架文件夹的内容。

找到与框架文件夹同名的文件。 该文件是动态库二进制文件,我们将需要使用该文件来修改我们的ipa文件。 将此二进制文件复制到我们在第3点中创建的文件夹中。您的文件夹现在应如下所示

如果您的动态库包含Swift代码,则可能需要将标准的Xcode Swift dylib库复制到“ Dylibs ”文件夹中。 可以在/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift本地找到Swift dylib

添加标准Swift dylib文件后,您的文件夹就是这样。

5.让.ipa修改过程称为“补丁”。 转到iOSDylibPatchingDemo文件夹,然后在终端sh ./patchapp.sh cracked.ipa ./DYLIBS中运行以下sh ./patchapp.sh cracked.ipa ./DYLIBS ,其中“ cracked.ipa”是您要修补的ipa,“ ./ DYLIBS”是您要安装的dylib的文件夹修补。 修补程序脚本会将已修补的.ipa文件输出为“ cracked-patch.ipa”,并完成代码注入过程。 但是,此时,我们无法将该.ipa安装或侧面加载到任何非越狱设备中,因为即使“ cracked-patch.ipa”注入了代码,但经过调整后,.ipa代码签名现在无效。并修改了其内容。

6.从http://www.cydiaimpactor.com下载Cydia Impactor。 Cydia Impactor是一种工具,通过使用与设备链接的有效配置文件和凭据对.ipa及其内容进行签名,可以使我们将任何.ipa安装到非越狱设备上。

您可以通过将“ cracked-patch.ipa”拖放到Cydia Impactor Mac App中来开始.ipa安装过程。 然后,它将提示您输入Apple开发人员的登录名和密码。

Cydia Impactor(CI)尝试登录Apple开发人员中心并下载您的配置文件,并在本地钥匙串中检索iOS开发证书。 CI然后将尝试从最深的文件夹级别开始以深度优先的方式对.ipa内容进行签名,然后再扩展到.ipa文件夹级别。 之后,CI将安装.ipa并将其侧面加载到指定设备中。 使用CI的此过程之所以有效,是因为设备会认为.ipa是由用户开发并签名的,并允许修改后的应用程序成功在设备上启动。 如果您不习惯使用Cydia Impactor,则可以自行手动为.ipa签名,并使用XCode侧载.ipa。

7.观察设备控制台日志并搜索我们先前已插入动态库中的NSLog消息: "==== Code Injection in Action====" 。 如果您设法找到日志消息,则可以开始庆祝,因为您已经成功地对iOS .ipa文件执行了iOS代码注入。 您可以在任何.ipa文件上执行整个代码注入过程。

嗯… 对我来说这听起来很邪恶

我在11月的iOS Dev Scout Meetup组(新加坡)中介绍了此主题,并演示了如何使用代码注入来破坏PokemonGo App游戏。 在见面小组中,观众提出了从添加按键记录功能到打破其他游戏应用程序规则的骇客创意。 想出破解应用程序的代码并不容易,因为需要大量的猜测工作以及数小时的反复试验才能使其正确。

少数邪恶的想法

  • 键盘记录(https://gist.github.com/johndel/6df8aee01055ed21dd9a#file-keylogger-swift-L65)
  • 方法旋转(http://nshipster.com/method-swizzling/)
  • 通过Objective C运行时获取类,ivars,属性,方法信息(https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime)
  • 获取已注册类的列表(https://developer.apple.com/reference/objectivec/1418579-objc_getclasslist)

有了以上想法,流氓开发人员实际上可以阅读应用程序中使用的所有类及其内容和方法,并使用这些信息来计划一次恶作剧。 最重要的是,无需使用越狱设备。

如果您有兴趣阅读有关使用此代码注入技术来入侵真实应用程序的信息,这是我关于黑客入侵PokemonGo应用程序的下一篇文章(https://medium.com/@kennethpoon/hacking-the-pokemongo-ios-app-with- 3类-4b81589a9f39#.kz2vey8ir)

那么谁是邪恶的人呢?

在经历了本文中描述的整个iOS代码注入过程之后,我个人认为允许任何人都可以退出.ipa文件的功能是一个严重的安全漏洞。 一旦对ipa进行签名,它应该是不可变的,并且对其内容进行任何回火的尝试都将导致该ipa被损坏,并且iOS设备不应允许启动这些.ipa。

Kenneth Poon在2016年11月发布的iOS Dylib注入讲座

希望读者能从中找到启发。 随时通过de_poon@hotmail.com发表评论或向我发送嗡嗡声。

视频:2016年11月iOS代码注入讲座