最近改了一个插入和删除dylib或者framework一个工具。insert_remove_dylib。
最新添加了支持-w 可选选项,让你插入的库以LC_LOAD_WEAK_DYLIB引用形式在loadcommand里面。识别@loader_path和@rpath前缀。这虽然没技术含量。但是我还是要说的。
使用: ./insert_remove_dylib -i -w @rpath/zzz.framework/zzz xxxx
效果:
如XCode的:
WX20190522-160208.png
linkFrameworks是status使用optional选项。
或者:
WX20190522-160440.png
在Other link flags 添加 -weak_framework zzz.framework
,不知道你们还记不得Reveal从2.0版本把自己的library有dylib变成了Framework .他们们文档就是这样让你手动添加Framework的:-ObjC -weak_framework RevealServer
WX20190522-161022.png
。
以LC_LOAD_WEAK_DYLIB方式引用库,有什么好处呢。好处就是当你这个库不存在或者丢失时,照样能运行起来,dyld加载可执行文件时绑定库时,找不到时不会抛出异常。
那么好了,我们在注入别人APP时,可以以这种形式注入库。这样库文件移除或者丢失完全不会报错。
那你运行起来时。你引用这个库里面的东西会变成 什么样呢。测试一下,用ARKit的。
WX20190522-164303.png
要求iOS11.那我们用个iOS9的系统。
WX20190522-164407.png
link 方式改为optional; WX20190522-170107.png WX20190522-165329.png
你互发现你引用ARKit里面的ARSKView创建的对象变成nil.不会崩溃,也不提示找不到库。
WX20190522-165540.png跑到iOS9.1系统上完全无压力。
改回requried时。注意缓存,不然还是LC_LOAD_WEAK_DYLIB。
最后说下我改好的insert_remove_dylib
github:https://github.com/LoveSVN/Insert_Remove_dylib.git
网友评论