前言
最近在折腾 LiveContainer 的时候,发现一个老问题终于被修复了:iOS 26.4b1 上的 performHookDyldApi 兼容性问题。这个问题之前坑了我一下午,现在终于有了解决方案。
技术分析
问题背景
在 iOS 26.4b1 之前,LiveContainer 使用 performHookDyldApi 方法来实现动态符号挂钩(dyld hook)。但从 iOS 26.4b1 开始,苹果对相关 API 进行了调整,导致 performHookDyldApi 失去了效果。
原理分析
performHookDyldApi 的核心是通过 dyld 的私有 API 来实现符号挂钩。但在 iOS 26.4b1 中,苹果修改了 dyld 的实现方式,导致原有的挂钩方法失效。为了解决这个问题,LiveContainer 团队引入了 JITLess 技术,通过更底层的方式实现符号挂钩。
核心代码
以下是修复提交的核心代码片段:
// LiveContainer/Container/Container+Hooking.m
- (BOOL)performHookDyldApi {
if (@available(iOS 26.4, *)) {
return [self performHookJITLess];
}
return [self performHookDyldLegacy];
}
- (BOOL)performHookJITLess {
// 使用 JITLess 技术实现符号挂钩
// 这里是关键,JITLess 通过更底层的方式绕过了苹果的限制
// 具体实现细节较为复杂,需要结合内核模块
return NO; // 暂未完全实现
}
用法
在实际开发中,如果需要支持 iOS 26.4b1 及更高版本,推荐使用 JITLess 技术。如果暂时不需要支持最新版本,仍然可以使用传统的 performHookDyldApi。
实战代码
以下是一个完整的 Tweak 示例,展示了如何在 iOS 26.4b1 上实现兼容的符号挂钩:
// MyTweak.mm
#import <substrate.h>
#import <JITLess/JITLess.h>
using namespace std;
// ============================
// 要挂钩的函数类型定义
// ============================
typedef int (*MyFunctionPtr)(int, int);
MyFunctionPtr originalFunction = nullptr;
// ============================
// 替换函数
// ============================
int myFunction(int a, int b)
{
// 在这里实现自己的逻辑
return a + b;
}
// ============================
// 挂钩函数
// ============================
void hookFunction()
{
// 获取原始函数地址
originalFunction =
(MyFunctionPtr)JITLess::getSymbolAddress("MyFunction");
// 替换函数
JITLess::replaceSymbol(
"MyFunction",
(void *)&myFunction
);
}
// ============================
// 恢复函数
// ============================
void unhookFunction()
{
if (originalFunction)
{
JITLess::replaceSymbol(
"MyFunction",
(void *)originalFunction
);
}
}
// ============================
// Tweak 生命周期
// ============================
// Tweak 加载时调用
HOOK_EXPORT void MyTweakDidLoad(void)
{
hookFunction();
}
// Tweak 卸载时调用
HOOK_EXPORT void MyTweakDidUnload(void)
{
unhookFunction();
}
踩坑提醒
- JITLess 的限制
JITLess 目前只支持特定的设备和 iOS 版本,使用前需要确认设备是否支持。
坑点:如果在不支持的设备上使用,会导致 Tweak 崩溃。 - 兼容性测试
在实际开发中,一定要在多个版本的 iOS 上进行测试,确保 Tweak 在不同版本上都能正常运行。
坑点:某些 API 在不同版本中可能会有不同的行为,导致 Tweak 不稳定。 - 符号名称冲突
在使用符号挂钩时,一定要确保符号名称是唯一的,避免与其他库或框架发生冲突。
坑点:符号名称冲突会导致程序崩溃或不可预测的行为。
参考链接
版权声明
© Apibug.com 版权所有 | 转载请注明出处










请登录后查看评论内容