这里涉及到三个组件:
- 主程序:加载
loader.so
的主程序 loader.so
:使用-Bsymbolic
编译,重写puts
并加载other.so
other.so
:调用puts
,且不可修改
如何让 other.so
使用被 loader.so
重写的 puts
?
请注意,我希望仅从 loader.so
开始(包括 other.so
)重写 puts
,而不影响主程序。
以下是示例代码:
main.c
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char *argv[]){
dlopen("./loader.so", RTLD_NOW | RTLD_GLOBAL | RTLD_DEEPBIND);
puts("Normal");
return 0;
}
loader.c
#include <stdio.h>
#include <dlfcn.h>
extern int puts(const char *s){
fputs("Hooked: ", stdout);
fputs(s, stdout);
fputc('\n', stdout);
return 0;
}
__attribute__((constructor))
void ctor(void) {
puts("Something");
void *other = dlopen("./other.so", RTLD_NOW);
}
other.c
#include <stdio.h>
__attribute__((constructor))
void ctor(void) {
puts("Hello!");
}
make.sh
#!/bin/bash
gcc main.c -o main -ldl
gcc loader.c -fPIC -shared -Wl,-Bsymbolic -o loader.so
gcc other.c -fPIC -shared -o other.so
Desired output
Hooked: Something
Hooked: Hello!
Normal
实际输出
Hooked: Something
Hello!
Normal
other.so
的符号搜索顺序,以便它可以解析loader.so
中的puts
。 - Smx