私の考えではLinuxのSQL Serverが確認し、/proc/self/status
そうTracerPID
でない場合は停止します。0
。テストしたいです。楽しいです、これはstraceです。
... lots of stuff
openat(AT_FDCWD, "/proc/self/status", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(5, "Name:\tsqlservr\nUmask:\t0022\nState"..., 1024) = 1024
close(5) = 0
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
getpid() = 28046
gettid() = 28046
tgkill(28046, 28046, SIGABRT) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=28046, si_uid=999} ---
gettid() = 28046
write(2, "Dump collecting thread [28046] h"..., 59Dump collecting thread [28046] hit exception [6]. Exiting.
) = 59
exit_group(-1) = ?
ltrace
さらに悪いことは、神に感謝して、彼らがこれを見せるためにstrstr
使用しているということです。本物たぶん私の理論が正しいかもしれません。
strstr("PPid:\t28515\n", "TracerPid:") = nil
__getdelim(0x7ffc0b7d2330, 0x7ffc0b7d2328, 10, 0x7f12f5811980) = 17
strstr("TracerPid:\t28515\n", "TracerPid:") = "TracerPid:\t28515\n"
strtol(0x7f12f581840b, 0x7ffc0b7d2320, 10, 0) = 0x6f63
free(0x7f12f5818400) = <void>
fclose(0x7f12f5811980) = 0
abort( <no return ...>
--- SIGABRT (Aborted) ---
syscall(186, 6, 0, 0) = 0x6f64
fprintf(0x7f12f6ec4640, "Dump collecting thread [%d] hit "..., 28516, 6Dump collecting thread [28516] hit exception [6]. Exiting.
) = 59
fflush(0x7f12f6ec4640) = 0
exit(-1 <unfinished ...>
を使用して確認するファイルの最後の行はstrstr
前のabort()
行ですが、TracerPid:
my/proc/self/status
の後には行がたくさんあります。
/proc/self/status
優先的に届けたいです。
...stuff...
TracerPid: 0
...stuff...
このプロセスのために。これが不可能な場合は、0
すべてのプロセスについて報告したいと思います。
TracerPID
forの値を変更し/proc/self/status
てから、exec
指定されたパラメータを変更してアクセスできないようにするラッパーを作成できますかTracerPID
?
ベストアンサー1
私が見つけた唯一の方法は次のとおりです。カーネルをパッチする。これをハッキングするためにも使用できると思いますが、LD_PRELOAD
後で確認してみましょう。