离开这个问题后,我修补了我的内核以寻求在 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
我相信第一个论点
GETAUXVAL()
说明了什么,打开
/usr/include/x86_64-linux-gnu/bits/auxv.h
一看就知道了所以他们试图获取可执行文件的文件名——实际上是每个文档的路径名和下面的示例。在这种情况下,这是跟踪器的路径名,而不是目标。然后他们打电话
realpath
来确保路径是相同的。你可以看到什么getauxval()
,