ReadFile неправильно читает байты - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь прочитать файл, используя 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';

, но он нигде не появлялся.Но когда я попытался написать его вначале (снимая скобки), он написал это отлично.

РЕДАКТИРОВАТЬ: Я попытался прочитать его потом, и он прочитал правильное письмо довольно странно

РЕДАКТИРОВАТЬ 2: Изображение выпуска: enter image description here

1 Ответ

4 голосов
/ 26 марта 2019

Левый файл на скриншоте - это 32-битный EXE-файл.Выделенный байт, который отличается, - это адрес IMAGE_NT_HEADERS структуры в файле.

По адресу 0xFC, 4 байта в этой структуре, 2 байта равны 4C 01. Этополе Machine в IMAGE_FILE_HEADERS , и это значение указывает, что машиной является «i386» (то есть 32-разрядная программа).

В правом файле вместо этого адрес равен 0xEC, а байты64 86, что означает «AMD64» (то есть это 64-битная программа).

Вероятно, ваша программа является 32-битной программой, и поэтому она обращается к 32-битной версии System32 из-зафункция Windows под названием перенаправление файловой системы (спасибо Полу Сандерсу за ссылку).В 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

Эту проблему можно решить, прочитав блокнот.exe из sysnative, или сравнение его с тем в SysWOW64 вместо того, что в System32, или путем компиляции вашей программы как 64-битной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...