我正在尝试使用readfile读取文件,将其存储到一个宽数组中,然后将其写入另一个文件中。问题是,当我将它们并排放置在HxD中时,某些字节是正确的(例如文本),但其他所有内容完全不同。我也无法运行
struct a
{
BYTE* buff;
long siz;
};
int main()
{
HANDLE hFile;
a struct_a;
if (hFile = CreateFileW(L"C:\\Windows\\System32\\notepad.exe", GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr))
{
long lFileSize = GetFileSize(hFile, nullptr);
if (lFileSize)
{
struct_a.siz = lFileSize;
struct_a.buff = new BYTE[struct_a.siz];
if (ReadFile(hFile, struct_a.buff, struct_a.siz,
nullptr, nullptr))
{
CloseHandle(hFile);
}
}
}
HANDLE h = CreateFileA("C:\\Users\\USER\\Desktop\\notepad_new.exe", GENERIC_WRITE, FILE_SHARE_WRITE, nullptr,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);
WriteFile(h, struct_a.buff, struct_a.siz, nullptr, nullptr);
return 0;
}
我希望它能够正确读取文件,然后将其写入并让我能够运行它。
作为奖励,我还尝试在读完文件后在文件末尾写一些字节
struct_a.buff[struct_a.siz - 5] = L'A';
但是它从来没有出现在任何地方。但是当我尝试在一开始编写它(去掉括号)时,它写得很好。
编辑:我尝试稍后再阅读,并且它足够奇怪地阅读了正确的字母
答案 0 :(得分:4)
屏幕截图中的左侧文件是32位EXE文件。您突出显示的字节是文件中IMAGE_NT_HEADERS结构的地址。
在地址0xFC处,此结构中有4个字节,这2个字节是4C01。这是IMAGE_FILE_HEADERS中的Machine字段,该值表示该机器是“ i386”(即32位程序)。
在正确的文件中,地址改为0xEC,字节为64 86,即“ AMD64”(即,这是一个64位程序)。
您的程序可能是32位程序,因此由于称为file system redirection的Windows功能而访问了System32的32位版本(感谢Paul Sanders提供的链接)。在64位Windows上,32位程序将System32重定向到另一个文件夹(实际上称为SysWOW64)-根据此表:
32-bit System32 64-bit System32
32-bit program C:\Windows\System32 C:\Windows\sysnative
64-bit program C:\Windows\SysWOW64 C:\Windows\System32
您可以通过从sysnative读取notepad.exe来解决此问题,或者将其与SysWOW64中而不是System32中的notepad.exe进行比较,或者将程序编译为64位。