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

标签 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;
    }
    
  • 编译:gcc main.c lss.o

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

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

我能做到吗?

最佳答案

正如@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;
}

关于c - 将嵌入式可执行二进制文件从 C 程序写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52102737/

相关文章:

java - 空文件构造函数既不是文件也不是目录

c - 为纯 X11 应用程序向 Unity 的全局菜单栏添加项目

c++ - struct声明中的冒号是什么意思,如:1, :7, :16,或:32?

mysql - Laravel 代客 Linux : Can't connect MariaDB/Mysql

Ruby:如何获取文件锁以进行写入?

python - 如何提高读取文件程序的运行时性能

c - GCC -nostdlib 失败, undefined reference `__libc_csu_fini'

c - 以下 gcc 编译错误意味着什么以及为什么它有一部分看起来编码已损坏?

linux - 在带列的 csv 文件中导出命令树的结果

python - 从 Mac 和 Linux 机器获取本地用户