É possível renomear um processo seu fora desse processo?

1

Se eu estou logado como $ USER, e eu corro de cima e vejo um processo que eu possuo, posso renomear esse processo?

Se sim, como? Se não, root pode renomear um processo estranho? Se sim, como? Se não, por quê?

    
por Evan Carroll 29.11.2015 / 11:12

1 resposta

1

Depende do que você quer dizer com "renomear". Processos não possuem nomes como tal. Processos possuem uma linha de comando. A linha de comando não precisa ser preservada após o início do programa. Todas as variantes Unix mantêm uma cópia da linha de comando, mas ela pode ser truncada ou modificada (por exemplo, executando argumentos junto com espaços intermediários, para que foo 'hello world' não seja distinguível de foo hello world ).

A maioria das variantes Unix permite que um processo modifique a linha de comando que ps mostra, modificando o conteúdo do parâmetro argv da função main . Você só pode sobrescrever o buffer no local, portanto, pode não ser possível tornar o buffer mais longo, mas ele sempre pode ser menor (cada argumento termina no primeiro byte nulo).

Do lado de fora do processo, você pode executar um depurador e editar o argv do programa. Aqui está uma demonstração no Linux com o 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

Dependendo de como seu sistema está configurado, você pode ou não ser capaz de executar um depurador em um programa que não foi iniciado pelo depurador, e você não poderá executar um depurador em um programa que não é t executando como seu usuário sem privilégios extras (exceto executando o depurador como root). Isso é controlado pela permissão para usar a chamada do sistema ptrace .

    
por 30.11.2015 / 01:14