Цель: Создание программы-генератора, которая на базе вводимых данных создает программу-патч. Идеи решения: Программу-патч написать отдельно. Она будет загружать из себя директивы для патчения (как битовый ресурс) и делать с ними что нужно. Самое главное снабдить ее этими директивами, т.е. изменить(добавить) бинарный ресурс к существующему EXE. Конечно, это можно делать на WIN API, правда только в 2000\XP, но это не интересно. Хочется сделать это самостоятельно. Самый простой вариант реализации, это создать программу-патч с уже существующим бинарным ресурсом, размером, скажем в 1 байт. Далее этот ресурс уже и править из программы-генератора. Соответственно, тут придется править PE таблицы смещений и невесть что еще. Вопрос: Есть у кого-нибудь примеры решения данной задачи? (желательно не на ассемблере, но сгодится и он). А то мои потуги в изучении структуры EXE продвигаются весьма медленно, наглядный пример, думаю все бы упростил. Кстати, есть ли более разумные способы решения поставленной задачи? Понятно, что свой компилятор мы писать ради этого не будем.
Проще всего не делать бинарный ресурс, а "приклеить" свою информацию в конец exe-файла, как делают в SFX-архивах. Вот кусок, выдранный из исходника SFX-модуля (комментариии мои): Код (Text): w = _open(MyExeName, O_RDONLY|O_BINARY); _read(w, Buf, 64); // (Buf+60) = IMAGE_DOS_HEADER.e_lfanew _lseek(w, *(int*)(Buf+60) + 6, SEEK_SET); _read(w, Buf, 800); // Прочитать новый PE-заголовок, начиная с IMAGE_FILE_HEADER.NumberOfSections _close(w); align = *(int*)(Buf+54); // IMAGE_OPTIONAL_HEADER.FileAlignment p = Buf + 218 + *(USHORT*)Buf * 40; // NumberOfSections * 40, 40 - это размер структуры IMAGE_SECTION_HEADER u_SFX = *(int*)p + *(int*)(p+4); // SizeOfRawData + PointerToRawData последней секции - то есть размер exe-шника! if(u_SFX % align) // Выровнять до следующего бОльшего числа, кратного align u_SFX += align - u_SFX % align; Дальше делаешь seek на смещение u_SFX и читаешь то, что ты там приклеил к своему exe-шнику. Код не идеальный, но он работает. Можно написать лучше: заменить числовые смещения извлечением полей из структур, добавить обработку ошибок и т.п.
Выносить в ini файл, информацию по 3000 (или больше) байтам вместе с их смещениями и прочими инструкциями просто несолидно, а хранить в отдельном бинарнике некрасиво. К тому же что за патч, с которым нужно тащить дополнительные файлы? Глупый пользователь обязательно их сотрет как “ненужные”, конечно, это его проблемы, но защиту от дурака затем и придумали, чтобы не дать пользователю проявлять свои врожденные таланты. Добавлять данные в конец EXE можно, первую версию я сделал именно по предложенному алгоритму, но это тоже некрасиво, т.к. нарушает структуру EXE.
Grig de Griz запускаешь прогу, ищешь в ней, что нужно попатчить, пишешь в файлик поределенным образом, типа, смещение - байт -поведение. Далее, пишешь драйвер, который находу и будет патсить твой ехешник, даешь ему скушать тот файлик, он должен знать что с ним делать. Если exeшник упакованый, то ставим бряку на oep,там, в конфигурационном файле должно быть описано для драйвера в поле с поведением, бряка сработала, смотрим, распакован ли образ, если да, то смотрим вниз по образу и патчим нужные места, далее - отпускаем образ. Вот тебе примерно и универсальный патчер.