将嵌入式可执行二进制文件从 C 程序写入文件



我正在尝试将一个可执行二进制文件嵌入到另一个二进制文件中,然后将第一个二进制文件写入文件。

我用纯文本文件成功地实现了这一目标,但是在编写可执行文件时,我无法使其工作。

所以例如我想/usr/bin/ls复制到ls2,所以在这里我尝试了什么

  • 第一:objcopy --input binary --output elf64-x86-64 --binary-architecture i386 /usr/bin/ls lss.o

  • C 代码:

    #include <stdio.h>
    FILE *f;
    extern char _binary_lss_start;
    extern char _binary_lss_end;
    main()
    {
    f = fopen("lss", "w");
    fprintf(f, &_binary_lss_start);
    fclose(f);
    return 0;
    }
    
  • 编译:gcc main.c lss.o

代码已成功编译,但是当我尝试时./a.out没有任何东西写入lss。

(我使用的是 Arch Linux 4.18.5 和 gcc 8.2.0。

我能做到这一点吗?

正如@jww提到的,你应该使用fwrite.fprintf正在寻找一个 0 终止的字符串,_binary_lss_start它可能在第一个字节中遇到并且不写入任何内容。

#include <stdio.h>
FILE *f;
extern char _binary_lss_start;
extern char _binary_lss_end;
int main(int c, char *v[])
{
size_t size_to_write = &_binary_lss_end - &_binary_lss_start;
f = fopen("lscpu2", "w");
if (f != NULL) {
printf("Writing %ld bytesn", size_to_write);
fwrite(&_binary_lss_start, 1, size_to_write, f);
fclose(f);
} else {
printf("File not found [%s]n", "lss");
}
return 0;
}