我正在尝试将一个可执行二进制文件嵌入到另一个二进制文件中,然后将第一个二进制文件写入一个文件。
我使用纯文本文件成功实现了这一点,但是当涉及到编写可执行文件时,我无法让它工作。
例如,我想将 /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
正在 _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/