抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

一、EasySIMBL简介

用户想给应用增加功能的话,最快捷的方法就是给应用写插件打补丁。

EasySIMBL(Easy SIMple Bundle Loader)macOS系统的一个工具,能够很方便地把插件注入到目标应用里,从而使应用能按我们想要的方式运行。

二、安装EasySIMBL

EasySIMBL需要安装到/System/Library/ScriptingAdditions/路径,安装过程如下:

1、关闭SIP

由于macOS X 10.11启用了SIP,用户没有权限修改系统目录下的文件,因此安装EasySIMBL之前要先关闭SIP。

首先重启系统,开机时按住 command + R 不放,直到进入系统恢复模式。

然后点击 实用工具 菜单,打开终端,执行csrutil disable命令关闭SIP,再重启系统。

2、安装EasySIMBL

点击SIMBL-0.9.9.zip下载文件并解压。

然后打开终端,cd到SIMBL-0.9.9目录,执行以下命令进行安装:

1
2
3
4
5
sudo installer -verbose -pkg SIMBL-0.9.9.pkg -target /
sudo rm -rf /System/Library/ScriptingAdditions/SIMBL.osax
sudo mv /Library/ScriptingAdditions/SIMBL.osax /System/Library/ScriptingAdditions/
sudo cp -p /System/Library/ScriptingAdditions/SIMBL.osax/Contents/Resources/SIMBL\ Agent.app/Contents/Resources/net.culater.SIMBL.Agent.plist /System/Library/LaunchAgents/
sudo sed -e "s/Library/System\/Library/" -i "" /System/Library/LaunchAgents/net.culater.SIMBL.Agent.plist

3、启用SIP

安装完可以启用SIP,对系统进行保护。

进入系统恢复模式,执行csrutil enable --without debug,并重启系统。

加上--without debug参数,才可以让lldb附加进程进行调试。

三、安装插件

将插件放在/Library/Application Support/SIMBL/Plugins目录里,应用启动时会自动加载插件。

四、插件开发

以系统自带的计算器应用/Applications/Calculator.app为例编写一个插件。

1、安装插件模板,地址为 https://github.com/poboke/EasySIMBL-Bundle-Template

2、使用Xcode创建一个Project,选择SIMBL Bundle模板。
This is a picture without description

3、设置工程名字为CalculatorPlugin
打开/Applications/Calculator.app/Contents/Info.plist,可以看到计算器的bundle identifiercom.apple.calculator
This is a picture without description

下图里的Target App Bundle Id就是我们要注入的app的包标识符,当app启动时,SIMBL就会把填有该app包标识符的插件注入到该app中。

填写后的工程信息为:
This is a picture without description

4、工程默认的初始化代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#import "CalculatorPlugin.h"

@interface CalculatorPlugin()

@end


@implementation CalculatorPlugin

/**
* @return the single static instance of the plugin object
*/
+ (instancetype)sharedInstance
{
static CalculatorPlugin *plugin = nil;
@synchronized(self) {
if (!plugin) {
plugin = [[self alloc] init];
}
}
return plugin;
}

/**
* A special method called by SIMBL once the application has started and all classes are initialized.
*/
+ (void)load
{
CalculatorPlugin *plugin = [CalculatorPlugin sharedInstance];
NSLog(@"++++++++ %@ plugin loaded ++++++++", plugin);
}

加载插件时会先执行类方法load的代码,因此可以在该方法里编写初始化的代码。

5、编辑插件的Info.plist文件,可以看到里面有一个SIMBLTargetApplications数组:
This is a picture without description

字段的含义为:

  • BundleIdentifier : 要注入的app的包标识符。
  • MaxBundleVersion : 要注入的app的版本号最大值,默认为99999。
  • MinBundleVersion : 要注入的app的版本号最小值,默认为0。

版本号是指CFBundleVersion的值:
This is a picture without description

由计算器的信息可知,目前计算器的版本号是123,而非10.8

处于MinBundleVersionMaxBundleVersion版本号之间的app才能够加载插件。
因为app升级后可能导致插件失效,严重的话可能会导致app闪退。所以为了保证插件能够正常工作,可以使用app当前版本号的值,也就是最大值和最小值都填上123
不过这种情况是很少出现的,一般来说使用模板默认的0 ~ 99999就可以了。

6、工程编译成功后会在/Library/Application Support/SIMBL/Plugins目录下生成一个CalculatorPlugin.bundle插件。

7、先运行控制台Console.app,再运行计算器Calculator.app
如果在控制台里能看到++++++++ <CalculatorPlugin: 0x7f980488e970> plugin loaded ++++++++等字样,就说明我们的插件已经成功注入到计算器里了。

8、接下来就可以使用逆向工程的方法来修改app的逻辑了。

五、示例工程

插件模板 https://github.com/poboke/EasySIMBL-Bundle-TemplateSamples目录里有一个CalculatorPlugin示例工程。

编译该工程后,点击计算器菜单栏的 计算器 –> 关于计算器 时,会出现一个Hello world的弹出框:
This is a picture without description

感兴趣的话可以去看工程里的代码,由于代码比较简单,这里就不多费笔墨了。

六、图形界面的mySIMBL

使用图形化软件可以更方便地管理插件,mySIMBL是一个开源的macOS插件管理器,它不但可以很方便地安装SIMBL,而且还自带了插件列表,能够下载其他用户分享的插件。

1、安装说明

点击这里下载最新的安装包,下载后解压,将mySIMBL.app移动到应用程序里。

第一次运行时,会提示用户安装SIMBL,按照上面的方法关闭SIP,并安装EasySIMBL

运行mySIMBL.app后便可看到本地的插件列表:
This is a picture without description

2、功能介绍

  • Manage菜单里可以管理本地的插件,把插件拖到插件列表里可以安装插件。点击状态图标可以开启/禁用插件,绿色图标为开启,红色为禁用。
  • Discover菜单里可以下载其他用户分享的插件。
  • Updates菜单里可以更新其他用户分享的插件。
  • SIMBL菜单里可以把某些应用加入黑名单,这些应用启动时就不会加载任何插件。

3、分享插件

如果你想把自己写的插件分享给别人使用,可以把插件提交到mySIMBL的插件仓库里,仓库地址为:https://github.com/w0lfschild/macplugins

首先Fork该插件仓库,将你编译好的插件压缩为zip格式,放到仓库的bundles目录里。

编辑packages_v2.plist文件填写插件信息,再提交Pull Request就可以啦。

评论