$USER로 로그인하고 top을 실행하여 내가 소유한 프로세스를 볼 수 있는 경우 프로세스 이름을 바꿀 수 있습니까?
그렇다면 어떻게 해야 할까요? 그렇지 않은 경우 루트가 외부 프로세스의 이름을 바꿀 수 있습니까? 그렇다면 어떻게 해야 할까요? 그렇지 않다면 왜 그렇습니까?
답변1
"이름 바꾸기"의 의미에 따라 다릅니다. 프로세스에 해당 이름이 없습니다. 프로세스에는 명령줄이 있습니다. 프로그램이 시작된 후에는 명령줄을 유지할 필요가 없습니다. 모든 Unix 변형은 명령줄의 복사본을 유지하지만 잘리거나 수정될 수 있습니다(예: 인수는 중간 공백으로 실행되므로 와 foo 'hello world'
구분할 수 없습니다 foo hello world
).
대부분의 Unix 변형에서는 프로세스가 ps
함수 인수의 내용을 수정하여 표시된 명령줄을 수정할 수 있습니다. 버퍼를 제자리에 덮어쓸 수만 있으므로 버퍼를 더 길게 만들 수는 없지만 항상 더 짧게 만들 수는 있습니다(각 인수는 첫 번째 Null 바이트로 끝납니다).argv
main
프로세스 외부에서 디버거를 실행하고 프로그램을 편집할 수 있습니다 argv
. 아래는 Linux에서 GDB를 사용하는 데모입니다.
$ sleep 999999.00000000000000000000000000000000000000000000000 &
[1] 2131
$ ps 2131
PID TTY STAT TIME COMMAND
2131 pts/8 S 0:00 sleep 999999.0000000000000000000000000000000000000000
$ gdb -pid 2131
…
(gdb) bt
#0 0x00007fa1206286e0 in __nanosleep_nocancel ()
at ../sysdeps/unix/syscall-template.S:81
#1 0x0000000000403f3f in ?? ()
#2 0x0000000000403d58 in ?? ()
#3 0x00000000004016c9 in ?? ()
#4 0x00007fa120592b45 in __libc_start_main (main=0x401540, argc=2,
argv=0x7fffc8b1bf18, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffc8b1bf08) at libc-start.c:287
#5 0x00000000004017d5 in ?? ()
(gdb) frame 4
#4 0x00007fa120592b45 in __libc_start_main (main=0x401540, argc=2,
argv=0x7fffc8b1bf18, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffc8b1bf08) at libc-start.c:287
(gdb) p argv
$1 = (char **) 0x7fffc8b1bf18
(gdb) p argv[0]
$2 = 0x7fffc8b1d27e "sleep"
(gdb) p argv[1]
$3 = 0x7fffc8b1d284 "999999.", '0' <repeats 47 times>
(gdb) argv[1][9] = 'z'
Undefined command: "argv". Try "help".
(gdb) p argv[1]
$4 = 0x7fffc8b1d284 "999999.00z", '0' <repeats 44 times>
(gdb) detach
Detaching from program: /bin/sleep, process 2131
(gdb) quit
$ ps 2131
PID TTY STAT TIME COMMAND
2131 pts/8 t 0:00 sleep 999999.00z0000000000000000000000000000000000000
시스템 구성 방법에 따라 디버거에 의해 시작되지 않은 프로그램에서 디버거를 실행할 수도 있고 실행하지 못할 수도 있으며, 사용자가 실행하지 않은 프로그램에서는 디버거를 실행할 수 없습니다. 추가 권한이 없습니다(디버거를 루트로 실행하는 경우 제외). 이는 시스템 호출을 사용하는 권한을 통해 제어됩니다 ptrace
.