使用PRELOAD环境变量优先加载so文件,在kylin上老版本wps可以查看到打开的文件,在新版本上打开doc文件没有下面代码输出
ssize_t read(int fd, void *buf, size_t count)
{
ssize_t nbyte = org_read(fd, buf, count);
char path[4096] = {0};
char fd_path[128] = {0};
sprintf(fd_path, "/proc/self/%d", fd);
readlink(fd_path, path, 4096);
printf("read %s\n", path);
return nbyte;
}
深入分析发现,打开文件时read系统函数的调用路径中包含了
ssize_t
__read_nocancel (int fd, void *buf, size_t nbytes)
{
return INLINE_SYSCALL_CALL (read, fd, buf, nbytes);
}
libc中使用汇编代码实现了read系统调用,而plt hook的read符号是libc中的read符号,因此失效