Incorporando um binário e exec, viabilidade

2

Eu tenho um daemon binário que depende de outro daemon binário em tempo de execução; Eu não gosto desse arranjo. (Meu código funciona tanto no OS X quanto no Linux, eu digo linux porque acredito que é correto assumir apenas elf formatação de arquivo)

Eu sabia sobre xxd , mas felizmente encontrei este post também: Como despejar um arquivo binário como um literal de string C / C ++? que usa objdump .

Eu estava pensando que deveria ser possível criar arquivos obj específicos para o arco e, em tempo de execução, fazer uma correspondência assim:

No pseudo OCaml

match arch with 
| Linux_32_bit -> 
  write_to_file "/tmp/foo" "linux_bin_32"; 
  Child_process.popen "/tmp/foo"
| Darwin_64_bit ->
  ...

Eu estava pensando que isso em face disso deveria funcionar, assumindo que as bibliotecas que o binário embutido existem nos locais apropriados, outros detalhes de implementação.

Isso é possível ou uma perda de tempo?

    
por Edgar Aroutiounian 17.02.2016 / 20:50

1 resposta

2

Sua abordagem está perfeitamente bem.

Aqui está um exemplo de C que incorpora cat e, após a execução, grava-o em um arquivo temporário e o marca como executável:

//$ xxd --include /bin/cat
//^ create _bin_cat and _bin_cat_len
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
int main(){
  //TODO: error checking everywhere
  char tmp[] = "/tmp/cat-XXXXXX"; 
  mkstemp(tmp);
  FILE* f = fopen(tmp, "w");
  fwrite(_bin_cat, _bin_cat_len, 1, f);
  fchmod(fileno(f), 0700);
  puts(tmp); //print the name of where the embeded cat got copied to
  return 0;
}

Funciona bem para mim.

    
por 17.02.2016 / 21:21

Tags