Strace
可以使用 getauxval 來確定您是否被追踪嗎?
離開這個問題後,我修補了我的核心以尋求在 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()
說明了什麼,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