LiveContainer 深度解析iOS 应用免安装侧载如何实现完整运行【免费下载链接】LiveContainerRun iOS apps without actually installing them!项目地址: https://gitcode.com/gh_mirrors/li/LiveContainerLiveContainer 是一款 iOS 应用容器兼启动器——它不经过安装流程就能把 iOS 应用跑在 iPhone 里一个已签名宿主应用承载任意多宾客应用支持多容器、多版本与多账号并存。适合侧载用户、应用测试人员以及需要快速沙盒化验证应用的开发者。一个签名凭什么装下无限个应用先说清它不是什么不是模拟器不是虚拟机。本质是一个进程级启动器——宾客应用以动态库的形式被dlopen进 LiveContainer 自身进程启动后就在宿主应用的地址空间里运行。这一点绕开了侧载的两个硬约束签名数量免费开发者账号侧载只有 3 个 App 额度LiveContainer 只占用宿主应用那一个 App ID宾客以库的身份藏在宿主里版本与账号同一应用可以建多个独立数据容器不同版本、不同账号同时存在运行要求是 iOS/iPadOS 15多任务窗口需要 16通过 AltStore 2.0 或 SideStore 0.6.0 分发。界面就是三个标签Apps、Tweaks、Settings右上角导入 IPA。跑出第一个容器的最短路径两条路线按阻力从小到大预构建版从项目的 release 页面拿到LiveContainer.ipa另有内置 SideStore 的合并版本用 SideStore 或 AltStore 安装到设备想之后用多任务窗口安装时必须勾选Keep App Extensions打开 LiveContainer点右上角选择 IPA 导入下次启动即可挑选要运行的应用源码构建克隆仓库并打开 Xcode 工程git clone https://gitcode.com/gh_mirrors/li/LiveContainer # 克隆仓库 cd LiveContainer open LiveContainer.xcodeproj # 打开工程把xcconfigs/Global.xcconfig里的DEVELOPMENT_TEAM[configDebug]改成你自己的 Team ID连接真机编译导出 IPA 装回设备与普通应用工程相比唯一多出来的一步就是填 Team ID。应用的可执行文件为什么能被当成动态库加载 现象导入 IPA 后 LiveContainer 从不把它装给 SpringBoard只改写二进制本身启动时直接dlopen。原理dlopen只接受MH_DYLIB类型所以第一步是把可执行文件库化。全部改写发生在 LiveContainer/LCMachOUtils.m 的LCPatchExecSlice里Mach-O 头的filetype从MH_EXECUTE改为MH_DYLIB清掉MH_PIE位置位MH_NO_REEXPORTED_DYLIBS重写__PAGEZERO段vmaddr改为0xFFFFC000即0x100000000 - 0x4000vmsize缩到0x4000。原段在地址 0 处预留的巨额虚拟地址空间两个同类段进同一进程必然撞车这就是经典的 out of address space 崩溃缩成单页零页后宿主与宾客共享地址空间插入一条指向loader_path/../../Tweaks/TweakLoader.dylib的LC_LOAD_DYLIB命令dyld 装载主二进制时会顺带拉起 Tweak 注入器同时补上loader_path与executable_path/../../Tweaks两条LC_RPATH让路径能解析空间不够时不硬来load command 区放不下LC_ID_DYLIB就复用LC_LOAD_DYLINKER的空间改写重复的 dylib 引用则标记为无效命令号忽略启动阶段由 LiveContainer/LCBootstrap.m 找到宾客的LC_MAIN入口跳过去宾客main照旧调用UIApplicationMain——对 UIKit 而言一切如常它根本不知道自己是被加载的。宾客应用如何以为自己在自己进程里运行装进宿主进程后环境必须整段伪造否则宾客一查executable_path就露馅executable_path 重定向iOS 15 起 dyld4 把主可执行路径缓存在内部 config 结构里所有executable_path相对查找都读它。LiveContainer 临时 hook dyld4 的_NSGetExecutablePath直接改写内部mainExecutablePath指针——偏移随版本变化iOS 15~18.3.2 在0x1018.4 挪到0x20iOS 27 还多缓存了一份长度——通过裸系统调用builtin_vm_protect或 TPRO 把只读的 dyld 内存临时变可写写完立即恢复原函数NSBundle.mainBundle 覆盖主 bundle 指向宾客的资源包Info.plist、图标、资源文件全部看起来像原装系统框架行为 hook实现集中在 LiveContainer/Tweaks/覆盖NSUserDefaults、SecItemKeychain、NSFileManager、NSURLSessionConfiguration的重定向外加 IDFV 伪装与个别崩溃点dead 10cc的定点修复这套组合构成完整宾客环境每个应用只是 LiveContainer 目录里的一堆文件运行时却拥有自己的 bundle、自己的偏好、自己的钥匙串。JIT 与无 JIT 两种模式代码签名怎么过现象IPA 导入前不需要预签名但无 JIT 时首次运行明显更慢。JIT 可用装了 JIT enabler直接绕过代码签名。实现在 LiveContainer/dyld_bypass_validation.mhookmmap当内核拒绝给未签名代码执行权限时把这段内存改映为匿名读写页memcpy文件内容进去再mprotect加执行权限同时 hookfcntl的F_ADDFILESIGS_RETURN把文件签名范围扩到整个文件。思路源自 xpnsec 的 Restoring Dyld Memory Loading 方案无 JIT所有可执行文件用签 LiveContainer 的同一张证书重签签名引擎是 ZSign/Feather 的修改版运行期dlopen加载ZSign.dylib后批量签名所以无 JIT 设备上慢的那几秒就是在给整个应用包补签名。多账号并存从哪来128 个 Keychain 访问组钥匙串隔离是多账号的难点应用账号凭据存在 Keychain而访问权限由keychain-access-groups权限位控制。LiveContainer 的解法很直接entitlements.xml里静态声明 128 个com.kdt.livecontainer.shared.N形式的组外加一个基础组每新建一个容器从池子里随机分配一组编号写进该容器的 Info.plist 作为keychainGroupId宾客的SecItem调用经 hook 重定向到对应组效果是半隔离同一应用最多 128 个容器的钥匙串互不干扰。注意这只覆盖钥匙串层面文件系统层面容器之间并无严格隔离。常见坑文件选择器、通知权限与多任务窗口 文件选择器抽风、申请不到通知权限部分应用的文件选择流程或本地通知链路在容器里会断在对应应用的设置页打开Fix File Picker或Fix Local Notifications重启应用生效多任务窗口不可用多任务依赖包内保留的应用扩展LiveProcess安装时没勾 Keep App Extensions 就得重装给多任务中的应用开 JIT 需要支持按PID 附加的 enablerStikDebug。用法是长按应用横幅选 Multitask或在设置里把它设为默认启动方式Tweak 加载失败把.dylib或.framework放进 Tweak 目录即可重命名.disabled跳过加载失败会弹窗显示具体错误并支持一键复制到剪贴板应用打不开先看项目 issues 里的 compatibility 标签没被标记的应用大多能跑确认崩溃就带日志提 issue远程推送收不到已知限制。SpringBoard 不认识宾客应用远端推送无法投递本地通知不受影响工程视角模块怎么拆边界在哪里仓库按进程与职责切块读代码可以按这条线走LiveContainer/C 入口与宾客引导核心。main.c先dlopenLiveContainerShared.framework并尾调用LiveContainerMain未选应用时引导层改去加载LiveContainerSwiftUI.framework跑管理界面LiveContainerSwiftUI/管理界面与数据模型多语言文件是Resources/Localizable.xcstringsTweakLoader/注入器递归dlopenTweak 目录下全部 tweak依赖捆绑的 CydiaSubstrate 框架MultitaskSupport/虚拟窗口、dock、画中画基于 FrontBoardAppLauncherSideStoreSupport/、ShareExtension/、LaunchAppExtension/SideStore 续期集成与系统共享表的 Open In App安全边界有几条必须知道宾客容器之间不沙盒化一个应用可以读到其他宾客应用的数据宾客自带的 entitlements 不生效权限是宿主应用的全局一份应用扩展无法注册宿主在沙盒内、SpringBoard 不知情、且扩展会额外占用 App ID项目 README 有专门警告第三方闭源修改版对你导入的全部应用和钥匙串数据有完全访问权只应使用官方开源构建想深入内核的话入口就是两个文件读LCMachOUtils.m的LCPatchExecSlice看可执行文件变库在字节层面怎么做再读LCBootstrap.m的引导流程看从库到完整应用如何走完全程。项目 TODO 里也写明了下一站——用 ChOma 替换手写的 Mach-O 解析。而 issues 里的 compatibility 标签本质上是一份活的测试用例集挑一个跑不起来的复现它就是参与这个项目最直接的方式。【免费下载链接】LiveContainerRun iOS apps without actually installing them!项目地址: https://gitcode.com/gh_mirrors/li/LiveContainer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?