3 个版本
0.1.2 | 2024 年 3 月 9 日 |
---|---|
0.1.1 | 2024 年 3 月 4 日 |
0.1.0 | 2024 年 2 月 13 日 |
#113 在 构建工具
111 每月下载量
21KB
178 代码行
pai-inject-so
用于将共享对象 (SO) 文件注入使用 pai 创建的进程的工具
安装
cargo install --force pai-inject-so
交叉编译
cargo-make 用于控制构建过程。 cross 用于支持交叉编译。为了简化构建过程,即使编译主机目标也会使用 cross
。
构建目标的命令是
cargo make [build|release] [target(s)]
输出将被放置在 output/<target>/<debug|release>/pai-inject-so
。
Android 示例
$ cargo make release aarch64-linux-android
$ ls output/aarch64-linux-android/release/pai-inject-so
output/aarch64-linux-android/release/pai-inject-so
示例
testdata/ 包含一些示例代码以进行测试。下面是一个加载共享对象文件并覆盖 puts
函数调用的示例。
启动程序
$ make -C testdata/
$ cargo run -- -i testdata/sofile.so -o puts testdata/demo
constructor was called
prog wrote: Hello World!
结果几乎与使用 LD_PRELOAD
相同。如果你尝试使用 LD_PRELOAD
,输出会略有不同
LD_PRELOAD=testdata/sofile.so testdata/demo
prog wrote: constructor was called
prog wrote: Hello World!
LD_PRELOAD
,正如其名,在加载其他对象之前加载共享对象,因此钩子立即生效。我们在程序启动后加载共享对象,因此钩子稍后生效。这种影响很小,但意味着我们可以预加载已运行的程序。
附加程序
要使此操作正常工作,您需要具有适当的权限,使用以下命令修复
cat /proc/sys/kernel/yama/ptrace_scope
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
cat /proc/sys/kernel/yama/ptrace_scope
然后在第一个终端中启动 demo2
,每秒它将打印
$ ./testdata/demo2
Hello World!
Hello World!
然后在第二个窗口中写入
cargo run -- -i testdata/sofile.so -o puts --attach demo2
第一个窗口现在应该开始打印
constructor was called
prog wrote: Hello World!
prog wrote: Hello World!
...
依赖关系
~13–28MB
~474K SLoC