嵌入二进制文件并执行它,可行性

嵌入二进制文件并执行它,可行性

我有一个二进制守护进程,它在运行时依赖于另一个二进制守护进程的存在;我不喜欢这个安排。 (我的代码可以在 OS X 和 Linux 上运行,我说 linux 是因为我相信只假设elf文件格式是可以的)

我知道xxd但幸运的是也发现了这篇文章:如何将二进制文件转储为 C/C++ 字符串文字?它使用objdump.

我认为应该可以创建特定于 arch 的 obj 文件,然后在运行时进行如下匹配:

在伪 OCaml 中

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

我认为这从表面上看应该可行,假设嵌入二进制文件的库存在于正确的位置,以及其他实现细节。

这是否可能或浪费时间?

答案1

你的方法完全没问题。

下面是一个嵌入 的 C 示例cat,并在执行时将其写入临时文件,并将其标记为可执行:

//$ 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;
}

对我来说效果很好。

相关内容