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

时间:2018-08-30 17:43:53

标签: c linux file

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

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

例如,我想将/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;
    }
    
  • 编译:{{1​​}}

该代码已成功编译,但是当我尝试gcc main.c lss.o时,没有任何内容写入lss。

(我正在使用Arch Linux 4.18.5和gcc 8.2.0。)

我可以实现吗?

1 个答案:

答案 0 :(得分:2)

如@jww所述,您应该使用fwritefprintf在_binary_lss_start处寻找一个0终止的字符串,该字符串可能在第一个字节中遇到,并且不写任何内容。

#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 bytes\n", size_to_write);
        fwrite(&_binary_lss_start, 1, size_to_write, f);
        fclose(f);
    } else {
        printf("File not found [%s]\n", "lss");
    }
    return 0;
}