【记录】上周末 macOS 折腾应用注入

上周末开始想玩玩在 macOS 下注入一个应用,自己写了一个简单的动态库想通过

DYLD_INSERT_LIBRARIES=./yourlibraryname.dylib path/to/your/apps/binary

这样的方式启动应用,但是弄了一了发现动态库怎么也加载不起来。Console 有相关的提示(具体没有记下来,但是确实有)查了一下发现是 Hardened Runtime 阻止了注入,当时有如下选项可以让我继续下去:

  1. Mach-O 把我的动态库注入进去;
  2. 关闭 SIP;

这两个选择都不是我想要的(不想破坏应用二进制以及不想关闭 SIP),今天突然想到既然 Hardened Runtime 是通过 codesign 加入的,那我直接把二进制重签一份没有 Hardened Runtime 的不就行了,立马测试了一下,发现动态库可以加载了:white_check_mark:
重签的代码如下(来源):

codesign -fs - anyname.app --deep

接下来只需要想一想怎么样让应用每次启动的时候都会带上 DYLD_INSERT_LIBRARIES 的信息就行了,马上能想到的办法是套个壳,不知道还有没有更好(修改最少)的办法。

套个壳的话需要怎么做啊

就是写一个“空”的 macOS 应用,这个空的 macOS 应使用命令行启动你想要的目标应用。启动的参数就是类似 DYLD_INSERT_LIBRARIES 那样

1 个赞

可不可以使用optool注入动态库呢?

当然可以,不过我不希望去改目标应用的任何东西

我试过了可以用optool重签,然后重签动态库就可以启动了。

codesign -fs - anyname.app --deep会改变应用的签名信息,应该还有其他的方式

是的 重签 仍然是改变了原app的信息

是不是可以绕过公证

可以绕 但就怕它代码里有签名校验

绕过公证的方法除了 sudo xattr -rd com.apple.quarantine /Applications/ 这个还有其他的吗

不是太懂 公证是啥?签名吗?

我重签了,直接跑不起来了。
codesign -fs - ./curl --deep
./curl: replacing existing signature

./curl
[1] 20665 killed ./curl