Ler área "code" de outro processo [RESOLVIDO]

1. Ler área "code" de outro processo [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 29/08/2014 - 14:51h

É possível ler a área de "code" de outro processo usando C no Linux? Eu queria usar isso num teste, tipo, quero interroper um processo e então reexecutá-lo usando system mas com alguns argumentos a mais, isso em processos de mesmo usuário.
Eu estou lendo o capítulo sobre processos no Beginning Linux Programming mas não vi nada relacionado ao que quero fazer.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/08/2014 - 17:26h

Sam L. escreveu:

É possível ler a área de "code" de outro processo usando C no Linux? Eu queria usar isso num teste, tipo, quero interroper um processo e então reexecutá-lo usando system mas com alguns argumentos a mais, isso em processos de mesmo usuário.
Eu estou lendo o capítulo sobre processos no Beginning Linux Programming mas não vi nada relacionado ao que quero fazer.


Resposta curta: não, pois os processos são independentes uns dos outros. O que você poderia fazer seria comunicar um processo com outro por meio de sinais, sockets ou pipes.

Resposta longa: depende. Se você estiver efetuando o trace de um processo, semelhante ao que fazem o gdb ou strace, você pode interferir na memória e mesmo executar código como se fosse esse outro processo. Dentro do seu programa, eu não sei dizer exatamente como você faria. Contudo, eu já consegui usar, com sucesso, o gdb para interferir num processo que já estava em execução e que não podia ser interrompido, forçando-o a trocar o diretório corrente (ele estava usando uma área da rede que tinha de ser migrada). Foi simples assim:

echo 'call chdir("/tmp")' | gdb -p numero_do_processo 


Note, porém, que chdir() é uma chamada praticamente atômica ao kernel. Já tentei algumas outras estripulias, como fork() e malloc(), e acabei com programas que capotaram. Tentar executar coisas no meio do programa que ele não está preparado para tratar é sempre uma temeridade.

Se você quiser fazer sem o gdb, mas com um programa seu, provavelmente vai precisar estudar a função ptrace. Olhando rapidamente a manpage, no entanto, não vi como fazer com que o programa execute a chamada a uma função, mas somente como ler/alterar valores de posições de memória e registradores.

3. Re: Ler área "code" de outro processo [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/09/2014 - 14:16h

Sam L. escreveu:

Surgiu uma outra dúvida. Pelo que vi você usou assembly para chamar chdir, então, seria possível eu fazer o mesmo só que com uma função minha de uma biblioteca minha também já carregada na memória?
Por exemplo, um processo pai carrega a biblioteca e um subprocesso executa em assembly um call 'minha_funcao()'. O subprocesso conseguiria executar com sucesso a minha_funcao?


Não usei Assembly, não. Esse “call” é um comando do GDB, não a instrução do Assembly.

Para poder chamar uma função pelo nome, o GDB precisa da tabela de símbolos usada pelo programa. No caso do programa que eu testei, a função chdir() ficava na biblioteca dinâmica correspondente à libc. O simples fato de ser uma biblioteca dinâmica permite que o GDB resolva o nome do símbolo. Eu não sei se um programa compilado estaticamente, ou mesmo uma chamada a uma função interna de programa, que não gere um símbolo exportado, permitiria esse tipo de coisa; acho que não permitiria.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts