macos - 如何将代码注入 macOS 中的 arm64e 进程?
问题描述
我编写了一个实用程序mach_inject
,它通过使用旧方法将已编译的代码(以 dylib 的形式)注入 Dock 来修改系统行为。但是,mach_inject
现在几年没有更新,并且不适用于 Apple Silicon mac。
我可以使用另一种方法将代码从 dylib 注入并执行到 arm64e 进程中吗?mach_inject
在目标进程中创建一个线程并在该线程中执行有效负载,所以我需要它来做类似的事情。
我一直认为frida是一种可能的替代方案,但它似乎是为了通过 javascript 运行时与目标进程进行交互,而不是将已经编译的代码注入到进程中。我无法弄清楚它是否可以满足我的需求。
解决方案
Frida 有一个名为 Frida-core 的组件,其中包含一个用于将代码注入进程的 C API。可以在此处找到演示其使用的示例:frida-core-example-unix.c。
它可用于使用 javascript 注入 dylib,如下所示:
var RTLD_NOW = 0x02;
var _dlopen = new NativeFunction(Module.findExportByName(null, "dlopen"), 'pointer', ['pointer', 'int']);
var path = Memory.allocUtf8String("/path/to/dylib");
_dlopen(path, RTLD_NOW);
不幸的是,它是一个非常重的库,导致生成的二进制文件大小约为 50 MB,通用二进制文件大小为 100 MB,但到目前为止,它是我发现的唯一一个有效的!