Почему не запускается программа записанная из массива байтов?

я из 16-ричного редактора беру байты и записываю их в массив :

unsigned char DllData[11264] = {
0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,...}

потом записываю в exe файл:

std::fstream DllData_s("test.exe", std::ios::in | std::ios::out | std::ios::app);
for (int i = 0; i < sizeof(DllData); i++)
{
    DllData_s << DllData[i];
}
DllData_s.close();

И пытаюсь его запустить,но он не запускается и показывает что невозможно запустить это приложение на вашем пк.


Ответы (2 шт):

Автор решения: Harry

Ну и что вы хотите?

  1. Вы пишете в текстовый файл, так что, например, 0x0A превратится в два байта - 0x0A 0x0D.
  2. Но это не так важно, потому что все равно вы пишете с использованием оператора <<, так что в файле будут просто текстом записанные числа.
  3. По названию судя, вы берете DLL и пытаетесь переписать ее в EXE. Мелочь по сравнению с 1 и 2, но тоже неприятно...

Вы бы хоть заглянули после записи внутрь файла, что у вас получилось. Или сравнить размеры исходного файла и получившегося.

→ Ссылка
Автор решения: Виктор

Чтобы компилятор не вставлял лишние символы надо текстовый вывод переключить на двоичный примерно так:

std::fstream DllData_s("test.exe", std::ios::in | std::ios::out | std::ios::app | std::ios::binary);

Ну а вывод файла лучше сделать через fstream.write(char *ptr, int size) примерно так:

DllData_s.write(&DllData[0], sizeof(DllData));

Но если вы динамическую библиотеку пытаетесь запустит, как исполнимый файл - из этого толку не будет. Её надо подключать к приложению, а это отдельная история.

→ Ссылка