如何正确地逐字节复制可执行文件
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");
使用while
或for
循环来读取来自ret
和[=29=的每个字节]write/append 相同的值到磁盘文件中的字节 (notepad2.exe)。
我最近一直在尝试了解有关通过字节复制文件的更多信息,但我遇到了麻烦。当检查来自原始 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");
使用
while
或for
循环来读取来自ret
和[=29=的每个字节]write/append 相同的值到磁盘文件中的字节 (notepad2.exe)。