如何正确地逐字节复制可执行文件

How to properly copy an executable byte by byte

我最近一直在尝试了解有关通过字节复制文件的更多信息,但我遇到了麻烦。当检查来自原始 notepad.exe 与 notepad2.exe 的字节时,即使 fread 和 frwite 的大小在读取和写入中是一致的,我也会得到不同的结果。

typedef unsigned char BYTE;
FILE* file;
FILE* ofile;

file = fopen("notepad.exe", "rb");

fseek(file, 0, SEEK_END);
long fSize = ftell(file);
rewind(file);

BYTE* ret = new BYTE[fSize];

fread(ret, 1, fSize, file);

fclose(file);

ofile = fopen("notepad2.exe", "w");
fwrite(ret, 1, fSize, ofile);

fclose(ofile);

我可能错误地假设它甚至是这样工作的,我对处理较低级别的内存操作还很陌生。在此先感谢大家的帮助。

下载免费的 hex 编辑器 并在那里目视检查两个文件的字节。这将使您更容易看到哪里出了问题。

显然你有一些额外的字节(可能有很多 00 值)但是......它是在复制文件字节的前面还是后面?

  • 检查 Fsize 的值和 ret 的长度(在 fwrite 之前检查),
    是否都符合您的预期数量?

  • 而不是:ofile = fopen("notepad2.exe", "w");
    尝试设置为:
    ofile = fopen("notepad2.exe", "wb");

  • 使用whilefor循环来读取来自ret和[=29=的每个字节]write/append 相同的值到磁盘文件中的字节 (notepad2.exe)。