一、下载安装
Cycript 官方完整
资源下载完成后,解压。目录如下:
二、执行
打开命令终端,cd到对应目录,然后执行./cycript
#第一步:cd到解压的目录
cd /xx/cycrpt_0
#执行:
./cycript
2.1、报错Library not Loaded
果然不出所料报错如下:
可以看到,Library not loaded 错误, ./cycript执行时,dyld加载libruby.2.0.0.dylib, 但找不到相应路径。查看自己电脑的ruby环境是,/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib。怪不得。
那就想办法弄一个,网上找了很多方案,发现都是复制粘贴,由于苹果不同系统SIP的原因,并不能在系统文件夹里新建文件,因为只有只读权限。
在 OS X El Capitan 系统以后有一个跟安全相关的模式叫 SIP(System Integrity Protection ),它禁止让软件以 root 身份来在 Mac 上运行,在升级到 OS X 10.11 中或许你就会看到部分应用程序被禁用了,这些或许是你通过终端或者第三方软件源安装。对于大多数用户来说,这种安全设置很方便,但是也有些开发者或者高级 Mac 用户不需要这样的设置
网上说了很多关闭SIP,建立软链接,但都不起作用。既然都不靠谱,还是得自己再研究下。
2.2、分析原因
若不关注具体原因,可以直接跳过出,查看第三部分解决办法。
既然是dyld加载动态库时报错,谁用到了libruby.2.0.0.dylib,仔细看报错,可以看出:
可以看到是由于Cycript.lib下的cycript-apl,引用了。 那用otool 分析下,执行otool -l cycript-apl,
otool -l cycript-apl
从上图的输出可以看出,果然cycript-apl 加载了 libruby.2.0.0.dylib。说明cycript-apl是用到了libruby2.0.0.dylib提供的方法。
ruby是向后兼容的,2.6的版本提供的能力是大于2.0的。既然是加载动态库,那岂不是可以更改链接的动态库。
对,就是将动态库2.0的版本改动自己2.6的版本。
2.3、install_name_tool 改变dyld加载ruby的路径
1、通过install_name_tool 更改 cycript-apl 加载动态库的路径
install_name_tool -change xxx旧ruby.dylib路径 xxx新ruby.dylib路径 cycript-apl
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/cycript-apl
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/cycript-apl
2、执行上述命令后,再次查看cycript-apl加载的动态库
#再次查看cycript-apl加载的动态库
otool -l cycript-apl
看到使用ruby.dylib已经更改为自己的了。
3、再次执行./cycript
还是报错Library not loaded,但仔细观察报错,会发现虽然还是libruby.2.0.0.dylib,但引用ruby.dylib的已经变成libcycript.dylib不是前面的cycript-apl。说明上面的更改加载动态路径是生效的。我想这个报错你应该会自己解决了。
对,同理通过install_name_tool,更改libcycrippt.dylib加载 ruby.dylib的路径。
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/libcycript.dylib
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/libcycript.dylib
2.4、再次执行./cycript
执行./cycript成功了。
三、解决办法
3.1、 更改 cycript-apl加载ruby的路径
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/cycript-apl
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/cycript-apl
3.2、更改libcycript.dylib的加载ruby路径
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/libcycript.dylib
install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.2.6.dylib ~/Downloads/cycript_0/Cycript.lib/libcycript.dylib
install_name_tool -change xxx旧ruby.dylib路径 xxx新ruby.dylib路径 需要更改的文件
注:上述的路径,请根据自己的路径进行修改。
3.3、再次执行./cycript
执行./cycript成功了。
至此问题便解决了,请开心的使用cycript吧。