Патч-русификатор средствами NSIS

  1. Оффлайн

    Leserg

    Звание: Эксперт

    Команда сайта.

    Сообщений: 581

    Создано тем: 72

    Рейтинг: 7

    Репа: (109|109|0)

    Патч-русификатор средствами NSIS.


    Предлагаю вашему вниманию небольшой пример по созданию установщика языкового файла для программ от разработчика FRANZIS, а именно "BLACK WHITE projects", "COLOR projects", "HDR projects", "ANALOG projects", "FOCUS projects", "DENOISE projects" и "SHARPEN projects". Если эта серия программ продолжится, где используются общие языковые файлы, то наш русификатор подойдет и для неё. Дополнительной опцией нашего установщика мы сделаем возможность эксплуатировать эти программы в полной мере, без каких-либо ограничений. Создавать патч-русификатор будем средствами конструктора инсталляторов NSIS в комплекте с плагинами, расширяющими его возможности.
    Что нам понадобится? Во-первых, знания по скриптовому языку NSIS, без них ничего не получится. Во-вторых, конечно же сам NSIS плюс плагины (о них будет рассказано ниже). В-третьих, пути установки программ, соответственно на 32-бит и 64-бит системах. Это можно выяснить при тестовой установке. В-четвертых, конечно же готовый языковой файл, который мы хотим установить. В-пятых, определенные байты для патча исполняемых файлов, которые помогут раскрыть весь потенциал программ. Эти данные можно получить, занимаясь исследованием и анализом исполняемого кода.

    Инструменты:

    1) NSIS v3.0b3 с поддержкой 8192 символов. Можно использовать другую версию NSIS, но тогда, возможно, в код сценария нужно будет внести некоторые изменения.
    2) Плагин Linker v1.2, автор Slappy, модифицированный Flix (http://forum.oszone.net/post-2412784-1327.html). Используется для создания кликабельного брандинг текста на страницах инсталлятора (по желанию).
    3) Плагин nsisFile v1.0, автор Olivier Marcoux (http://wiz0u.free.fr/prog/nsisFile). Используется для патчинга исполняемых файлов.
    4) Плагин AdvSplash и др. из комплекта стандартной поставки NSIS.
    5) Заголовочный файл ProcessFunc.nsh (для NSIS v3.0), автор kotkovets (http://forum.oszone.net/post-2390157-1284.html). Используется для завершения запущенных процессов.
    6) Дизайнер диалогов NSIS Dialog Designer v1.4.1 (http://coolsoft.altervista.org/en/nsisdialogdesigner). Используется для создания собственных (дополнительных) страниц инсталлятора.
    7) Ваш любимый графический редактор, например, Paint.Net (http://www.getpaint.net), для создания изображения мастера установки, заставки и прочей графики.
    8) Редактор ресурсов, например, Resource Hacker или Restorator. Рекомендую использовать Resource Hacker v3.6.0.92. Новая версия (из последних) может испортить файл, проверено. Restorator хорош, но лепит везде свои метки "BOME", типа "Здесь был Вася!". В принципе, если это для вас несущественно, то можете использовать и его. Редактор нужен для модификации ресурса диалогов инсталлятора для возможности использования плагина Linker. Если не будете применять этот плагин, то и редактировать ничего не нужно.
    9) Любой текстовый редактор для создания сценария NSIS (или среда разработки HM NIS EDIT (http://hmne.sourceforge.net/), а также сопутствующих документов TXT, RTF.

    Вот, пожалуй, и всё. Если что забыли, по ходу изложения добавим.

    Алгоритм

    Прежде чем садиться за написание кода сценария, нужно сначала продумать алгоритм работы будущего инсталлятора, что он должен делать и как. Установить языковой файл — это понятно, но куда? Если бы у нас была одна программа, то все довольно просто — указал путь установки и поехали. У нас же программ несколько,.. а если у пользователя установлены не все из них, а только некоторые... Вариантов решения такой задачи может быть несколько, предлагаю вам следующий.
    Инсталляторы FRANZIS содержат обе редакции программ: 32-бит и 64-бит. Соответственно выполняется их установка: на 32-бит ОС устанавливается 32-бит версия программы, а на 64-бит ОС — 64-бит версия. Путь установки по умолчанию стандартный — программная группа файлов, папка с именем поставщика, плюс папка с именем программы. Т.е. вот так
    - на 32-бит ОС: $PROGRAMFILESFranzis{папка с именем программы}
    - на 64-бит ОС: $PROGRAMFILES64Franzis{папка с именем программы}

    Чтобы облегчить себе задачу, будем считать, что у пользователя все программы FRANZIS (или некоторые из них) установлены в каталоге по умолчанию. По этой причине наш инсталлятор не будет предлагать выбрать путь установки. Чтобы не прописывать в коде имя папки для каждой из программ (мы не знаем, какие из них установлены у пользователя), то будем определять полные пути при работе нашего патч-русификатора. Для этого воспользуемся именами исполняемых файлов программ и поручим нашему инсталлятору произвести их поиск в подкаталогах папки "Franzis". Этим мы можем убить сразу несколько зайцев. Во-первых, найдя такой файл, мы узнаем путь для установки языкового файла, Во-вторых, мы можем модифицировать его на предмет некоторых улучшений. В-третьих, если ничего не будет найдено, значит ни одна программа от FRANZIS не установлена. Возможно пользователь установил их в другим месте, но этот вариант мы рассматривать не будет. Упрощенная блок-схема алгоритма выглядит следующим образом:

    Рисунок 1

    Патч-русификатор средствами NSIS


    Продолжение следует...
    Сообщение отредактировал WYLEK 3 августа 2018 - 23:35

    Кто ищет, тот всегда найдет!

    25 февраля 2016 - 16:11 / #1
  2. Оффлайн

    Leserg

    Звание: Эксперт

    Команда сайта.

    Сообщений: 581

    Создано тем: 72

    Рейтинг: 7

    Репа: (109|109|0)

    Продолжение

    Сценарий

    Ниже приведен полный текст сценария с подробными комментариями. Если вам какие-то команды не понятны, обратитесь к справочной документации NSIS.


    Продолжение следует...
    Сообщение отредактировал WYLEK 3 августа 2018 - 23:47

    Кто ищет, тот всегда найдет!

    25 февраля 2016 - 16:15 / #2
  3. Оффлайн

    Leserg

    Звание: Эксперт

    Команда сайта.

    Сообщений: 581

    Создано тем: 72

    Рейтинг: 7

    Репа: (109|109|0)

    Продолжение

    Пояснения

    Инсталлятор показывает пользователю заставку и проигрывает звуковой файл. За эти функции отвечает плагин AdvSplash. После заставки отображается страница приветствия.

    Рисунок 2
    Патч-русификатор средствами NSIS

    Это дополнительная страничка и для её создания был использован редактор NSIS Dialog Designer (файл странички welcome.nsdinc).

    Далее идет страница для отображения текста лицензионного соглашения. Страница стандартная и не имеет каких-либо особенностей.


    Рисунок 3


    Наконец, завершающая страница — установка русификатора и применение патча.

    Рисунок 4


    Для интерфейса инсталлятора выбран тип sdbarker_tiny: небольшой размер диалогов, минималистский дизайн. При этом файл с ресурсами интерфейса был модифицирован для применения плагина Linker. Для этого откройте файл sdbarker_tiny.exe (находится в каталоге NSIS по пути ..ContribUIs) в редакторе ресурсов, перейдите на диалог с ID 105 и в тексте формы найдите элемент управления 1028. По умолчанию этот элемент не активный и недоступен для перехвата фокуса. Чтобы сделать его активным и доступным для кликом мышкой, необходимо удалить флаг WS_DISABLED.

    Рисунок 5


    У вас должно получиться вот так:

    Рисунок 6


    Нажмите "Compile Script" и сохраните файл под новым именем — sdbarker_tiny_modl.exe. Готово.

    Для локализации строк интерфейса и сообщений инсталлятора патч-русификатора используется модифицированный языковой файл Russian.nlf (находится в каталоге NSIS по пути ..ContribLanguage files). В нём слово "Установка" заменено на "Русификация" и сделаны ещё незначительные правки. Файл сохранён под именем Russian_rus.nlf и используется в сценарии.
    Поиск исполняемых файлов программ выполняется по маске *projects*.exe. Часть имени "projects" является общей у всех файлов для всей линейки продуктов FRANZIS. Других исполняемых файлов с такой частью имени в каталогах установки нет, поэтому будут найдены именно те файлы, которые нам нужны. В функции FindFilesEXE найденные полные пути к исполняемым файлам сохраняются в одну переменную $R0, которая выполняет функцию мнимого одномерного массива. Данные в нём записываются в формате /{индекс}={полный_путьимя_файла}. Этот способ временного хранения данных предложил пользователь K.A.V. на форуме OSzone.net, рекомендую взять на заметку, очень удобно. Затем в цикле, пробежав по индексам, мы можем получить строку с путём к каждому файлу и соответственно выполнить определенные действия (в нашем случае установить языковой файл и пропатчить исполняемый).
    Модификация исполняемых файлов выполняется при помощи функций плагина nsisFile. В стандартной поставке NSIS уже имеется инструмент (GenPat.exe) для создания файла различий, а также соответствующий плагин Vpatch. Но в нашем случае плагин nsisFile был выбран из следующих соображений: отсутствует привязка к конкретному файлу (по версии, контрольной сумме), одни и те же сигнатуры (низменная последовательность байт) у всех исполняемых файлов (соответственно для 32-бит и 64-бит приложений) проекта, возможность применения патча на будущую версию программ при условии, что разработчик не изменит алгоритма защиты. Таким образом, работа нашего русификатора будет похожа на патчи, которые можно создать при помощи инструментов "diablo2oo2's Universal Patcher", "AT4RE Patcher" и им подобных. При желании и необходимости можно навесить дополнительные проверки или определенные ограничения, к примеру, в нашем сценарии не предусмотрена функция создания резервных копий файлов перед их последующей модификации. Попробуйте сделать это самостоятельно. Замечу, что вместо плагина nsisFile можно использовать плагин Vpatch, но тогда наш патч-русификатор не будет таким гибким.
    В приведенном выше тексте сценария вместо выражения {исходная сигнатура} необходимо поставить реальные данные сигнатур, а вместо {новая сигнатура} — те, которые нужно записать в файлы. Все эти данные определяются при помощи отладчика (дизассемблера), и те из вас, кто занимался созданием патчей, например, в dUP, прекрасно знают, как это делается. Модификация файла не будет выполнена: 1) если по каким-то причина не удалось открыть файл (например, занят другим процессом); 2) если не удалось найти заданную сигнатуру.

    ЗАКЛЮЧЕНИЕ:

    В итоге у нас получился небольшой, компактный инсталлятор для программ FRANZIS, который выполняет установку языкового файла и модифицирует исполняемые файлы. Единственным условием его успешного применения является установка всех программ ("BLACK WHITE projects", "COLOR projects", "HDR projects", "ANALOG projects", "FOCUS projects", "DENOISE projects" и "SHARPEN projects") в каталогах по умолчанию. Не имеет значения одна программа установлена, две, три или все: установщик выполняет поиск определённых исполняемых файлов, и если таковые были найдены, то выполняет заданные действия. Если ничего не было найдено, значит ни одной программы FRANZIS не установлено или они были установлены пользователем в другие каталоги. Как было сказано ранее, наш патч-русификатор не имеет какой-либо привязки к версии программы, размерам или контрольной сумме файлов, также не проверяет наличие уже установленного языкового файла. Поэтому при повторных запусках установщика языковой файл будет просто перезаписан, а модификация исполняемых файлов будет выполнена только при соблюдении заданных условий, в противном случае — пропущена. Обращаю ваше внимание, что создание резервных копий не предусмотрено. Это касается как языкового файла (перезаписывается оригинальный файл hdrprojects_en.qm), так и исполняемых файлов. Также не предусмотрена функция удаления русификатора. При желании или необходимости предлагаемый код сценария может быть доработан с учётом необходимых требований и задач.

    Патч-русификатор: скачать
    Сообщение отредактировал WYLEK 2 марта 2019 - 13:39

    Кто ищет, тот всегда найдет!

    25 февраля 2016 - 16:17 / #3
  4. Оффлайн

    Metabolic

    Участники

    Сообщений: 13

    Создано тем: 0

    Репа: 0

    Restorator хорош, но лепит везде свои метки "BOME", типа "Здесь был Вася!"

    Чтоб программа не метила модифицированные ресурсы, необходимо отключить в настройках функцию:
    "Основные настройки -> Сохранение файлов -> Создавать метки на измененных ресурсах [стрелочка]"
    biggrin
    Сообщение отредактировал WYLEK 3 августа 2018 - 23:50
    26 февраля 2016 - 21:51 / #4
  5. Оффлайн

    Leserg

    Звание: Эксперт

    Команда сайта.

    Сообщений: 581

    Создано тем: 72

    Рейтинг: 7

    Репа: (109|109|0)

    Тю, блин, действительно. Верное замечание, спасибо. beer
    Кто же знал, что визуальная метка изменённого ресурса привязана к "BOME". Фиг догадаешься. biggrin
    Сообщение отредактировал WYLEK 3 августа 2018 - 23:51

    Кто ищет, тот всегда найдет!

    27 февраля 2016 - 00:33 / #5
  6. Оффлайн

    AlexSergeev

    Звание: Сталкер

    Проверенные

    Сообщений: 110

    Создано тем: 0

    Рейтинг: 3

    Репа: 0

    Цитата: Metabolic/26.02.2016, 22:51/18413
    Чтоб программа не метила модифицированные ресурсы, необходимо отключить в настройках функцию:"Основные настройки -> Сохранение файлов -> Создавать метки на измененных ресурсах [стрелочка]"

    Осмелюсь спросить — отключить в настройках СИСТЕМЫ? Тогда конкретно где и как? Или при установке патча-русификатора — в его настройках?
    С уважением
    Сообщение отредактировал WYLEK 3 августа 2018 - 23:51
    1 октября 2016 - 16:31 / #6
  7. Оффлайн

    Автор темы

    WYLEK

    Звание: Мастер

    Админ

    Сообщений: 1163

    Создано тем: 238

    Рейтинг: 10

    Репа: (63|63|0)

    Цитата: AlexSergeev/01.10.2016, 16:31/19136
    отключить в настройках СИСТЕМЫ? Тогда конкретно где и как? Или при установке патча-русификатора — в его настройках?


    В настройках Restorator

    Патч-русификатор средствами NSIS
    Сообщение отредактировал WYLEK 2 марта 2019 - 13:40

    1 октября 2016 - 17:11 / #7

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
862
Всего сообщений
7533
Пользователей
14569
Новый участник
ReshkaD