yue狱检测和反yue狱检测

iOS 开发随笔 (__restrict 引起的 dyld 加载

2022-03-24  本文已影响0人  _涼城

前因

App 接入了动态库后,iOS 9.x 版本启动 Crash,报错如下:

dyld: warning, LC_RPATH @excutable_path/Frameworks in ... being ignored in restricted program because of @excutable_path/

dyld: warning, LC_RPATH @loader_path/Frameworks in ... being ignored in restricted program because of @loader_path/


dyld: Library not loaded : @rapth/...
Referenced from:
...
Reason: image not found 

为什么 iOS 9.x 会 Crash ?

由报错可知,dyld 未加载到对应动态库导致崩溃,通过对比不同版本手机的崩溃栈信息以及提示,发现dyld栈信息不同并且其他版本无dyld:warning,推测由于 dyld 版本不同导致。前往 dyld 源码查找 iOS 9.x 大致版本为 360.22 并下载。

通过 Crash 的栈信息,可知执行顺序为 _dyld_start -> dyldbootstrap::start() -> dyld::main() -> dyld::setContext() -> dyld::checkEnvironmentVariables() -> dyld::checkLoadCommandEnvironmentVariables() -> ...-> dyld::load() -> dyld::link()

dyld::link

在工程中搜索 error 关键字,通过下列信息找到 dyld::link() 调用时异常,通过函数名可确认为链接动态库时失败

getRPaths

由于控制台 dyld:warning ,推测是因为路径被忽略导致的动态库无法链接

在上面的代码中,发现警告出现的情况为 context.processIsRestricted && !context.processRequiresLibraryValidation

processIsRestricted

__RESTRICT

在工程中搜索 RESTRICT,发现 Other Linker Flags 中有这个字段 -Wl,-sectcreate,__RESTRICT,__restrict,/dev/null,将其删除后,App运行成功成功。

为什么 iOS 10.0及以后正常呢?

总结

-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null 在 iOS 10 以前对于防护动态库注入有效

上一篇下一篇

猜你喜欢

热点阅读