由于似乎没有一种“官方”的方式来控制创建套接字的位置,因此您可以通过编写自己的共享对象(插入connect()
并重写AF_FILE
/tmp 中的任何地址)来走“大锤破解”之路:
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
#include <assert.h>
#include <linux/un.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen)
{
static int (*real_connect)(int, const struct sockaddr *, socklen_t) = NULL;
if (!real_connect)
real_connect = dlsym(RTLD_NEXT, "connect");
if (addr->sa_family == AF_FILE) {
// mutate sockaddr
assert(addrlen >= sizeof(struct sockaddr_un));
const struct sockaddr_un u = { AF_UNIX, "/foo/bar/path" };
// but only if it is in /tmp
if (!strncmp(((const struct sockaddr_un*)addr)->sun_path, "/tmp", 4)) {
return real_connect(sockfd, (const struct sockaddr*)&u, sizeof u);
}
}
return real_connect(sockfd, addr, addrlen);
}
编译:
gcc -Wall -Wextra test.c -ldl -shared -o interpose.so -fPIC
然后运行为:
LD_PRELOAD=./interpose.so soffice -headless -invisible -nocrashreport -nodefault -nologo -nofirststartwizard -norestore -conversionmode -accept='pipe,name=marcin_OOffice;urp;StarOffice.ComponentContext'
这似乎可以通过读取 strace 输出来工作(但我不知道如何实际使用套接字来证明它确实有效)。