Open / read Unix Arquivo executável [fechado]

0

Existe uma maneira nativa (sem instalar ou baixar coisas extras) para ler um arquivo executável do Unix? Eu só preciso ler o arquivo para ver o que está nele e aprender o que posso usá-lo.

O que estou realmente tentando fazer é saber o que o aplicativo de Diagnóstico sem fio faz, ou melhor , como ele faz isso. Eu estou olhando para construir o meu próprio aplicativo de diagnóstico de rede para o meu mac. Então, eu estava querendo ler o que o aplicativo de diagnóstico sem fio (localização: / System / Library / CoreServices / Applications / Wireless Diagnostics.app), então eu encontrei o arquivo executável no aplicativo para ver se eu poderia recolher qualquer coisa. Isso é o que eu estou querendo tirar disso.

    
por masterninja01 05.04.2015 / 22:51

2 respostas

2

Se estamos falando de um comando que você pode executar no prompt do shell, deve haver uma página de manual:

$ man someprogram

Se você receber algo como No manual entry for foo , poderá experimentar o GNU info :

$ info someprogram

Nem todos os sistemas operacionais Unix e Unix têm informações GNU sobre eles, mas fazem muito, e geralmente fornecem mais informações sobre um determinado comando do que a clássica página man faz.

Se você tiver info e não souber sobre o comando, você receberá algo como No menu item 'someprogram' in node '(dir)Top' na parte inferior da tela. Pressione Q para deixar info .

Os programas geralmente pertencem a algum gerenciador de pacotes nesses sistemas, e você também pode perguntar ao gerenciador de pacotes sobre o programa. Por exemplo, diremos que você está interessado em someprogram e está usando um shell com o comando which . Se o último não estiver disponível, você pode fornecer manualmente o caminho para o executável, como /usr/bin/someprogram .

Linuxes baseados em RPM (RHEL, Fedora, CentOS ...)

Primeiro, descubra a qual pacote o programa pertence:

$ rpm -qf 'which someprogram'
somepackage-1.2.3-4

Em seguida, pergunte ao RPM sobre o pacote:

$ rpm -qi somepackage
Name      : somepackage
Version   : 1.2.3
Release   : 4
...etc...

Linuxes baseados em DEB (Debian, Ubuntu, Mint ...)

O padrão é o mesmo que para o RPM. Primeiro, descubra quem é o proprietário do arquivo:

$ dpkg -S 'which someprogram'
somepackage: /usr/bin/someprogram

Depois, pergunte sobre o pacote em si:

$ dpkg -s somepackage
Package: somepackage
Essential: no
Status: install ok installed
...etc...

Mac OS X

O gerenciador de pacotes OS X "nativo" é um recurso oculto do sistema operacional e não é usado para tudo, mas vale a pena tentar. O padrão é o mesmo que acima:

$ pkgutil --file-info 'which someprogram'
volume: /
path: /usr/bin/someprogram
pkgid: com.example.bundles.somepackage
pkg-version: 1.2.3
...etc...

Em seguida, para obter mais informações sobre somepackage :

$ pkgutil --pkg-info com.example.bundles.somepackage
$ pkgutil --files com.example.bundles.somepackage
...etc...

Se você instalou um dos gerenciadores de pacotes de terceiros ( Homebrew , MacPorts , ou Fink ) existem comandos similares para obter informações sobre os pacotes que eles possuem.

Se você está lidando com um programa instalado fora de qualquer um desses sistemas, você provavelmente está lidando com um programa de GUI que fica feliz em falar sobre si mesmo usando mecanismos internos. (Sobre caixa, ajuda, etc.)

FreeBSD

Classicamente, os BSDs não usaram gerenciadores de pacotes formais, mas nos últimos anos, o FreeBSD tem caminhado lentamente em direção ao uso de pkg , também conhecido como PkgNG.

Ele também compartilha o mesmo padrão de uso dos sistemas acima:

$ pkg which 'which someprogram'
/usr/bin/someprogram was installed by package somepackage-1.2.3-4
$ pkg info somepackage
somepackage-1.2.3-4
Name :           somepackage
Version :        1.2.3-4
...etc...

Talvez um dia a grande maioria dos programas instalados em uma caixa do FreeBSD seja instalada via pkg , mas não hoje.

Se você tiver um programa instalado por meio de Portas e puder descobrir qual Port o instalou, é possível provavelmente consegue o que quer com isso:

 $ cd /usr/ports
 $ ls -d */somepackage
 net/somepackage
 $ cat net/somepackage/pkg-descr
    
por 05.04.2015 / 23:44
2

od -tx1 somefile | less permite procurar um dump binário (bem, hexadecimal) do arquivo. Isso diz o que está no arquivo, mas é claro que não em uma linguagem legível por humanos normais. Como regra geral, executáveis binários não são legíveis por humanos. Mesmo os scripts não são legíveis pela maioria dos humanos.

Aqui estão algumas maneiras de obter informações de executáveis:

  • file myprogram informa que tipo de arquivo é, por exemplo que tipo de máquina é para.
  • ./myprogram --help pode mostrar algumas informações de uso. Mas é uma convenção que o autor do programa pode ou não ter seguido, não uma obrigação. Se ./myprogram --help reclamar que --help não é uma opção válida, pode sugerir outra coisa, como ./myprogram -h , ./myprogram -help , ./myprogram -? ou executar o programa sem argumento.
  • ldd myprogram , para um executável vinculado dinamicamente, informa qual biblioteca ele carrega.
  • strings myprogram lista todos os bits do arquivo que consistem em caracteres imprimíveis ASCII. Nem todos são significativos, porque nada no arquivo distingue seqüências significativas de seqüências de bytes que coincidentemente são caracteres imprimíveis.
  • objdump -d myprogram desmonta o executável, ou pelo menos tenta.

Realmente, não há nenhuma maneira mágica de obter as informações que você espera. Ele simplesmente não está lá (a menos que a saída de myprogram --help satisfaça você neste caso específico). Os executáveis são destinados a serem lidos por computadores, não por humanos.

    
por 06.04.2015 / 01:51

Tags