#inject #hook #instrumentation #object-file

build pai-inject-so

用于将共享对象文件注入进程的工具

3 个版本

0.1.2 2024 年 3 月 9 日
0.1.1 2024 年 3 月 4 日
0.1.0 2024 年 2 月 13 日

#113构建工具

Download history 2/week @ 2024-05-20

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