Incrustar un binario y ejecutarlo, viabilidad

Incrustar un binario y ejecutarlo, viabilidad

Tengo un demonio binario que depende de otro demonio binario en tiempo de ejecución para existir; No me gusta este arreglo. (Mi código funciona tanto en OS X como en Linux. Digo Linux porque creo que está bien asumir únicamente elfel formato de archivo)

Lo sabía xxdpero afortunadamente también encontré esta publicación:¿Cómo volcar un archivo binario como un literal de cadena C/C++?que utiliza objdump.

Estaba pensando que debería ser posible crear archivos obj específicos de arch y luego, en tiempo de ejecución, hacer una coincidencia de esta manera:

En pseudo OCaml

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

Estaba pensando que esto, a primera vista, debería funcionar, suponiendo que las bibliotecas en las que se encuentra el binario incrustado existan en las ubicaciones adecuadas, otros detalles de implementación.

¿Es esto posible o una pérdida de tiempo?

Respuesta1

Tu enfoque está perfectamente bien.

Aquí hay un ejemplo de C que incrusta caty, tras la ejecución, lo escribe en un archivo temporal y lo marca como ejecutable:

//$ 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 bien para mí.

información relacionada