LiveContainer/LiveContainer
GitHub: LiveContainer/LiveContainer
LiveContainer 是一个 iOS 应用启动器,允许用户在无需真正安装的情况下于容器内运行第三方 IPA 应用。
Stars: 9115 | Forks: 749
LiveContainer
一款无需真正安装即可运行 iOS 应用的应用启动器!
Crowdin 项目: [](https://crowdin.com/project/livecontainer) | 文档:[liveconainer.github.io](https://livecontainer.github.io/docs/intro) # LiveContainer - LiveContainer 是一个应用启动器(非模拟器或 hypervisor),允许你在其内部运行 iOS 应用。 - 允许你仅使用一个应用和 App ID 来安装无限数量的应用(3 个应用 / 10 个 App ID 的免费开发者账号限制在此不适用)。你还可以通过多个数据容器安装同一应用的多个版本。 - (iOS 26 以下)当 JIT 可用时,代码签名将被完全绕过,无需在安装前对你的应用进行签名。否则,你的应用将使用与 LiveContainer 相同的证书进行签名。 # 安装 **LiveContainer 提供独立版本和内置 SideStore 的版本。[请在此处阅读安装指南](https://livecontainer.github.io/docs/installation)** 如果你遇到任何问题,请[在此阅读我们的常见问题解答](https://livecontainer.github.io/docs/faq) ### 独立版
| Stable |
|
|
| Nightly |
|
|
|
|
## 环境要求
- iOS/iPadOS 15+
+ 多任务处理需要 iOS/iPadOS 16.0+
- AltStore 2.0+ / SideStore 0.6.0+
# 功能与指南
### 安装应用
- 打开 LiveContainer,点击右上角的加号图标并选择要安装的 IPA 文件。
- 在下次启动时选择你想要打开的应用。
- 你可以长按应用来进行管理。
### [将应用添加到主屏幕](https://livecontainer.github.io/docs/guides/add-to-home-screen)
### [多个 LiveContainer](https://livecontainer.github.io/docs/guides/multiple-livecontainers)
使用多个 LiveContainer 允许你同时运行多个不同的应用,并且在 LiveContainer 之间的数据传输*几乎*是无缝的。
### [多任务处理](https://livecontainer.github.io/docs/guides/multitask)
你现在可以在应用内的虚拟窗口中同时启动多个应用。这些窗口可以调整大小、缩放,甚至可以使用原生的画中画 功能进行显示。在 iPad 上,应用可以在原生窗口模式下运行,在每个独立的系统窗口中显示每个应用。如果你愿意,可以选择在设置中将多任务处理设为应用的默认运行模式。
要使用多任务处理,请按住其横幅并点击 **“Multitask”**。你也可以在设置中将“Multitask”设为默认启动模式。
### [JIT 支持](https://livecontainer.github.io/docs/guides/jit-support)
### [安装外部 tweak](https://livecontainer.github.io/docs/guides/tweaks)
### [多个容器/外部容器](https://livecontainer.github.io/docs/guides/containers-and-external-data)
### [隐藏应用](https://livecontainer.github.io/docs/guides/lock-app)
### 修复文件选择器和本地通知
某些应用在 LiveContainer 中可能会遇到文件选择器的问题,或者无法申请通知权限。要解决此问题,请在特定应用设置中相应地启用“修复文件选择器”和“修复本地通知”。
### “在应用内打开”支持
- 点击“应用”标签右上角的链接图标并输入 URL。LiveContainer 会检测合适的应用并询问你是否要启动它。
- 此外,你可以使用[此快捷指令](https://www.icloud.com/shortcuts/44ea82ce7ed8469ea24198c375db09a0)将网页共享给 LiveContainer。请务必在共享表单操作中将此快捷指令添加到“收藏夹”。
## 兼容性
遗憾的是,并非所有应用都能在 LiveContainer 中运行,因此我们提供了一份[兼容性列表](https://github.com/LiveContainer/LiveContainer/labels/compatibility),用于说明哪些应用存在问题。如果它们不在此列表中,则很可能会正常运行。但是,如果它无法运行,请提交一个 [issue](https://github.com/LiveContainer/LiveContainer/issues/new/choose)。
## 编译
打开 Xcode,将 `xcconfigs/Global.xcconfig` 中的 `DEVELOPMENT_TEAM[config=Debug]` 修改为你的团队 ID,然后进行编译。
## 项目结构
### 主可执行文件
- LiveContainer 的核心
- 包含设置 guest 环境和加载 guest 应用的逻辑。
- 如果未选择任何应用,它将加载 LiveContainerSwiftUI。
### LiveContainerSwiftUI
- LiveContainerUI 的 SwiftUI 重写版本(由 @hugeBlack 完成)
- 多语言支持的语言文件 `Localizable.xcstrings` 位于此处。要帮助我们翻译 LiveContainer,请访问[我们的 crowdin 项目](https://crowdin.com/project/livecontainer)
### MultitaskSupport
- 包含多任务处理功能的实现。
- 基于 [FrontBoardAppLauncher](https://github.com/khanhduytran0/FrontBoardAppLauncher)
### SideStore
- 用于 SideStore 应用刷新集成的支持代码
### TweakLoader
- 一个简单的 tweak 注入器,用于加载 CydiaSubstrate 并加载 tweak。
- 被注入到你在 LiveContainer 中安装的每个应用中。
### ZSign
- LiveContainer 附带的应用签名工具。
- 最初由 [zhlynn](https://github.com/zhlynn/zsign) 制作。
- LiveContainer 使用由 khcrysalis 修改的 [Feather's](https://github.com/khcrysalis/Feather) 版本的 ZSign。
- 进行了一些更改以满足 LiveContainer 的需求。
## 它是如何工作的?
### 修补 guest 可执行文件
- 修补 `__PAGEZERO` 段:
+ 将 `vmaddr` 更改为 `0xFFFFC000` (`0x100000000 - 0x4000`)
+ 将 `vmsize` 更改为 `0x4000`
- 将 `MH_EXECUTE` 更改为 `MH_DYLIB`。
- 注入加载命令以加载 `TweakLoader.dylib`
### 修补 `@executable_path`
- Hook `dyld4::APIs::_NSGetExecutablePath`
- 调用 `_NSGetExecutablePath`
- 替换 `config.process.mainExecutablePath`
- 使用 `dyld4::APIs` 实例(作为第一个参数传递)计算 `config.process.mainExecutablePath` 的地址
- 使用 `builtin_vm_protect` 或 TPRO 解锁使其可写
- 用我们控制的地址替换它
- 将原始的 `dyld4::APIs::_NSGetExecutablePath` 放回原处
### 修补 `NSBundle.mainBundle`
- 此属性会被 guest 应用的 bundle 覆盖。
### 绕过库验证
- JIT 对于绕过代码签名是可选的。在无 JIT 模式下,所有可执行文件都已签名,因此这不适用。
- 源自 [Restoring Dyld Memory Loading](https://blog.xpnsec.com/restoring-dyld-memory-loading)
### dlopening 可执行文件
- 使用 guest 应用的可执行文件调用 `dlopen`
- TweakLoader 加载所选文件夹中的所有 tweak
- 查找入口点
- 跳转到入口点
- guest 应用的入口点调用 `UIApplicationMain` 并像任何其他 iOS 应用一样启动。
### 多账号支持与 Keychain 半隔离
创建了 [128 个 keychain 访问组](./entitlements.xml),LiveContainer 会将它们随机分配给同一应用的每个容器。因此,你可以创建 128 个具有不同 keychain 访问组的容器。
## 限制
- guest 应用的 Entitlements 不会应用于 host 应用。这不是什么大问题,因为侧载应用只需要基本的 Entitlements。
- 应用权限是全局应用的。
- guest 应用容器未进行沙盒隔离。这意味着一个 guest 应用可以访问其他 guest 应用的数据。
- 不支持应用扩展。它们无法注册,原因如下:LiveContainer 受到沙盒隔离,SpringBoard 不知道 LiveContainer 中安装了哪些应用,并且它们会占用 App ID。
- 可以通过使用多个 LiveContainer 和多任务处理功能来实现多任务处理。然而,虽然我们能够修复 iPadOS 上的物理键盘输入问题 (https://github.com/LiveContainer/LiveContainer/issues/524),但 iPhone 镜像使用了不同的检查机制,这仍然会破坏它 (https://github.com/LiveContainer/LiveContainer/issues/793)。
- 远程推送通知将无法工作
- 查询自定义 URL scheme 可能无法工作 (?)
## 待办事项
- 使用 ChOma 替代自定义的 MachO 解析器
## 许可证
[Apache License 2.0](https://github.com/khanhduytran0/LiveContainer/blob/main/LICENSE)
## 致谢
- [xpn 的博文:Restoring Dyld Memory Loading](https://blog.xpnsec.com/restoring-dyld-memory-loading)
- [LinusHenze 的 CFastFind](https://github.com/pinauten/PatchfinderUtils/blob/master/Sources/CFastFind/CFastFind.c):[MIT 许可证](https://github.com/pinauten/PatchfinderUtils/blob/master/LICENSE)
- [litehook](https://github.com/opa334/litehook):[MIT 许可证](https://github.com/opa334/litehook/blob/main/LICENSE)
- @haxi0 & @m1337v 提供图标
- @Vishram1123 提供初始快捷指令实现
- @hugeBlack 提供 SwiftUI 贡献
- @Staubgeborener 提供自动 AltStore/SideStore 源更新器
- @fkunn1326 改进应用隐藏功能
- @slds1 提供动态颜色功能
- @Vishram1123 提供 iOS 26+ JIT 脚本支持
- @StephenDev0 提供 AltStore 源支持标签:iOS, NIDS, 免签安装, 动态加载, 容器化, 应用启动器, 移动开发工具