Автогенерация программы-патча

Тема в разделе "WASM.ZEN", создана пользователем Grig de Griz, 26 дек 2005.

  1. Grig de Griz

    Grig de Griz New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2005
    Сообщения:
    15
    Цель: Создание программы-генератора, которая на базе вводимых данных создает программу-патч.



    Идеи решения: Программу-патч написать отдельно. Она будет загружать из себя директивы для патчения (как битовый ресурс) и делать с ними что нужно. Самое главное снабдить ее этими директивами, т.е. изменить(добавить) бинарный ресурс к существующему EXE.

    Конечно, это можно делать на WIN API, правда только в 2000\XP, но это не интересно. Хочется сделать это самостоятельно.

    Самый простой вариант реализации, это создать программу-патч с уже существующим бинарным ресурсом, размером, скажем в 1 байт. Далее этот ресурс уже и править из программы-генератора. Соответственно, тут придется править PE таблицы смещений и невесть что еще.



    Вопрос: Есть у кого-нибудь примеры решения данной задачи? (желательно не на ассемблере, но сгодится и он). А то мои потуги в изучении структуры EXE продвигаются весьма медленно, наглядный пример, думаю все бы упростил.

    Кстати, есть ли более разумные способы решения поставленной задачи? Понятно, что свой компилятор мы писать ради этого не будем. :)
     
  2. Topor

    Topor New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    31
    Нафига извращаться со своим же ехе-шником ? Выносим настраиваемые параметры в ini-файл и все.
     
  3. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Проще всего не делать бинарный ресурс, а "приклеить" свою информацию в конец exe-файла, как делают в SFX-архивах. Вот кусок, выдранный из исходника SFX-модуля (комментариии мои):
    Код (Text):
    1. w = _open(MyExeName, O_RDONLY|O_BINARY);
    2. _read(w, Buf, 64); // (Buf+60) = IMAGE_DOS_HEADER.e_lfanew
    3. _lseek(w, *(int*)(Buf+60) + 6, SEEK_SET);
    4. _read(w, Buf, 800); // Прочитать новый PE-заголовок, начиная с IMAGE_FILE_HEADER.NumberOfSections
    5. _close(w);
    6. align = *(int*)(Buf+54); // IMAGE_OPTIONAL_HEADER.FileAlignment
    7. p = Buf + 218 + *(USHORT*)Buf * 40; // NumberOfSections * 40, 40 - это размер структуры IMAGE_SECTION_HEADER
    8. u_SFX = *(int*)p + *(int*)(p+4); // SizeOfRawData + PointerToRawData последней секции - то есть размер exe-шника!
    9. if(u_SFX % align) // Выровнять до следующего бОльшего числа, кратного align
    10.    u_SFX += align - u_SFX % align;


    Дальше делаешь seek на смещение u_SFX и читаешь то, что ты там приклеил к своему exe-шнику. Код не идеальный, но он работает. Можно написать лучше: заменить числовые смещения извлечением полей из структур, добавить обработку ошибок и т.п.
     
  4. Grig de Griz

    Grig de Griz New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2005
    Сообщения:
    15
    Выносить в ini файл, информацию по 3000 (или больше) байтам вместе с их смещениями и прочими инструкциями просто несолидно, а хранить в отдельном бинарнике некрасиво. К тому же что за патч, с которым нужно тащить дополнительные файлы? Глупый пользователь обязательно их сотрет как “ненужные”, конечно, это его проблемы, но защиту от дурака затем и придумали, чтобы не дать пользователю проявлять свои врожденные таланты.

    Добавлять данные в конец EXE можно, первую версию я сделал именно по предложенному алгоритму, но это тоже некрасиво, т.к. нарушает структуру EXE.
     
  5. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Grig de Griz

    запускаешь прогу, ищешь в ней, что нужно попатчить, пишешь в файлик поределенным образом, типа, смещение - байт -поведение. Далее, пишешь драйвер, который находу и будет патсить твой ехешник, даешь ему скушать тот файлик, он должен знать что с ним делать. Если exeшник упакованый, то ставим бряку на oep,там, в конфигурационном файле должно быть описано для драйвера в поле с поведением, бряка сработала, смотрим, распакован ли образ, если да, то смотрим вниз по образу и патчим нужные места, далее - отпускаем образ. Вот тебе примерно и универсальный патчер.