即将离开这个问题,我修补了内核,以求在 Linux 上启动 SQL Server 2017。现在我已经走得更远了,但我被关闭了,
strstr("TracerPid:\t0\n", "TracerPid:") = "TracerPid:\t0\n"
strtol(0x7fe0cf01840b, 0x7ffd380d5eb0, 10, 0) = 0
free(0x7fe0cf018400) = <void>
fclose(0x7fe0cf011980) = 0
getpid() = 3474
getpid() = 3474
getauxval(31, 9, 5, 0x7fe0d034ea67) = 0x7ffd380dcfe0
strncpy(0x7ffd380d5f00, "/opt/mssql/bin/sqlservr", 4095) = 0x7ffd380d5f00
realpath(0x7ffd380d5f00, 0x7ffd380d6f00, 0, 0x7fe0d0323720) = 0x7ffd380d6f00
getpid() = 3474
abort( <no return ...>
--- SIGABRT (Aborted) ---
我相信在检查之后proc
,SQL Server会做一些其他的巫术来做同样的事情作为后备,只是为了“额外安全”,没有人试图让他们的软件工作。
现在,我想知道是否getauxval(3)
可以用来确定进程是否正在被跟踪?看来CAPABILITIES
表明这在CAP_SYS_ADMIN
和中是可能的CAP_SYS_PTRACE
答案1
我相信第一个论点GETAUXVAL()
说明了一些事情,
getauxval(31, 9, 5, 0x7fe0d034ea67)
开放/usr/include/x86_64-linux-gnu/bits/auxv.h
, 我理解了
#define AT_EXECFN 31 /* Filename of executable. */
因此,他们试图获取可执行文件的文件名 - 实际上是文档和下面示例的路径名。在本例中,这是跟踪器的路径名,而不是目标。然后他们打电话realpath
以确保路径相同。你可以看到什么getauxval()
,
$ LD_SHOW_AUXV=1 strace sleep 1
AT_SYSINFO_EHDR: 0x7ffd6d96f000
AT_HWCAP: bfebfbff
AT_PAGESZ: 4096
AT_CLKTCK: 100
AT_PHDR: 0x5640b6cad040
AT_PHENT: 56
AT_PHNUM: 9
AT_BASE: 0x7fc9ce4fc000
AT_FLAGS: 0x0
AT_ENTRY: 0x5640b6d09440
AT_UID: 1000
AT_EUID: 1000
AT_GID: 1000
AT_EGID: 1000
AT_SECURE: 0
AT_RANDOM: 0x7ffd6d909669
AT_HWCAP2: 0x0
AT_EXECFN: /usr/bin/strace
AT_PLATFORM: x86_64