В последнее время меня часто спрашивают как включить буфер обмена в клиентах грации-ХФ. Иногда вижу что ради включения этой опции люди копируют в свою папку с игрой какую-то странную dll, накрытую вмпротектом. Серьезно? Все гораздо проще, поэтому я решил написать небольшой гайд.
Итак, нам понадобится файл nwindow.dll из папки system клиента игры, инструмент для реверса Ghidra. По желанию простой хекс-редактор и программа detect it easy, если вы не уверены что ваша dll без темиды. Для примера будет использоваться анпакнутая nwindow.dll для HF5 отсюда.
1) Для начала закинем nwindow.dll в DiE и посмотрим результат:
Отлично, dll анпакнута и почищена от темиды.
2) Запускаем ghidra, импортируем nwindow.dll, открываем и подтверждаем выполнение автоанализа, дожидаемся его завершения.
3) Теперь нам нужно найти функцию NConsoleWnd::IsFinalRelease. От результата ее выполнения зависит работа буфера обмена. Но как ее найти, если она не экспортируемая? Большая часть функций в dll имеет обработчик ошибок, который содержит название функции. Будем искать по нему. Открываем окно Defined Strings и вводим NConsoleWnd::IsFinalRelease:
Такая строка найдена, но ссылок на нее нет. Копируем адрес строки и открываем поиск:
Смотрим результат:
Найден участок кода, который ссылается на эту строку. Но код не был дизассемблирован во время автоанализа. Не проблема - выделяем байты и нажимаем D:
Отлично. Это тот обработчик ошибок, который нам нужен. А функция, которую мы будем патчить, находится прямо перед ним. Откроем эту функцию:
Видим, что функция всегда возвращает 1. Для включения буфера обмена нужно вернуть 0. Для этого патчим одну инструкцию:
на
Сохраняем изменения и экспортируем dll в папку system, заменяем оригинальную nwindow.dll на пропатченную.
По желанию патч можно сделать в простом хекс-редакторе, а не в ghidra. Чаще всего я делаю именно так.
Всё, готово. Замена всего лишь одного байта включила буфер обмена. Аналогичным образом можно пропатчить nwindow.dll клиентов грации финал, эпилога, фреи и тд (интерлюд и ниже не проверял).
Прикрепляю пропатченную nwindow.dll для hf5 (ссылку на оригинал указывал выше)
Пароль:
Дополню свой пост.
На самом деле для того чтобы включить только буфер обмена, можно пропатчить функцию "NCEditBox::IsEnableCopynPaste". Способ поиска этой функции ничем не отличается от "NConsoleWnd::IsFinalRelease".
Вот как выглядит IsEnableCopynPaste:
Для включения буфера обмена можно изменить условный переход jnz на jz (при этом не трогая IsFinalRelease)
Опять же всего один байт изменений.
Но почему же я делаю патч именно IsFinalRelease?
Условный переход в функции IsEnableCopynPaste, который я показал выше, выполняется после вызова IsFinalRelease и проверки ее результата. И функция IsEnableCopynPaste не единственная, чье выполнение зависит от результата IsFinalRelease.
Я думаю, все знают команды билдера ///stat fps, ///show fog, ///show particles, ///reloadui и тд. Данные команды любят биндить в user.ini на ц4 и интерлюд клиентах. Однако, на клиентах грация и выше бинд многих команд не работает, если у игрока нет ГМ-прав. Патч IsFinalRelease позволяет обойти это ограничение и выполнять данные команды даже через ввод в игровой чат, не изменяя user.ini. Поэтому я всегда делаю патч IsFinalRelease и заменой одного байта решаю 2 проблемы. Однако, если вам это не нужно, вы можете ограничиться патчем IsEnableCopynPaste. Удачи
Итак, нам понадобится файл nwindow.dll из папки system клиента игры, инструмент для реверса Ghidra. По желанию простой хекс-редактор и программа detect it easy, если вы не уверены что ваша dll без темиды. Для примера будет использоваться анпакнутая nwindow.dll для HF5 отсюда.
1) Для начала закинем nwindow.dll в DiE и посмотрим результат:
Отлично, dll анпакнута и почищена от темиды.
2) Запускаем ghidra, импортируем nwindow.dll, открываем и подтверждаем выполнение автоанализа, дожидаемся его завершения.
3) Теперь нам нужно найти функцию NConsoleWnd::IsFinalRelease. От результата ее выполнения зависит работа буфера обмена. Но как ее найти, если она не экспортируемая? Большая часть функций в dll имеет обработчик ошибок, который содержит название функции. Будем искать по нему. Открываем окно Defined Strings и вводим NConsoleWnd::IsFinalRelease:
Такая строка найдена, но ссылок на нее нет. Копируем адрес строки и открываем поиск:
Смотрим результат:
Найден участок кода, который ссылается на эту строку. Но код не был дизассемблирован во время автоанализа. Не проблема - выделяем байты и нажимаем D:
Отлично. Это тот обработчик ошибок, который нам нужен. А функция, которую мы будем патчить, находится прямо перед ним. Откроем эту функцию:
Видим, что функция всегда возвращает 1. Для включения буфера обмена нужно вернуть 0. Для этого патчим одну инструкцию:
на
Сохраняем изменения и экспортируем dll в папку system, заменяем оригинальную nwindow.dll на пропатченную.
По желанию патч можно сделать в простом хекс-редакторе, а не в ghidra. Чаще всего я делаю именно так.
Всё, готово. Замена всего лишь одного байта включила буфер обмена. Аналогичным образом можно пропатчить nwindow.dll клиентов грации финал, эпилога, фреи и тд (интерлюд и ниже не проверял).
Прикрепляю пропатченную nwindow.dll для hf5 (ссылку на оригинал указывал выше)
Пароль:
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
Дополню свой пост.
На самом деле для того чтобы включить только буфер обмена, можно пропатчить функцию "NCEditBox::IsEnableCopynPaste". Способ поиска этой функции ничем не отличается от "NConsoleWnd::IsFinalRelease".
Вот как выглядит IsEnableCopynPaste:
Для включения буфера обмена можно изменить условный переход jnz на jz (при этом не трогая IsFinalRelease)
Опять же всего один байт изменений.
Но почему же я делаю патч именно IsFinalRelease?
Условный переход в функции IsEnableCopynPaste, который я показал выше, выполняется после вызова IsFinalRelease и проверки ее результата. И функция IsEnableCopynPaste не единственная, чье выполнение зависит от результата IsFinalRelease.
Я думаю, все знают команды билдера ///stat fps, ///show fog, ///show particles, ///reloadui и тд. Данные команды любят биндить в user.ini на ц4 и интерлюд клиентах. Однако, на клиентах грация и выше бинд многих команд не работает, если у игрока нет ГМ-прав. Патч IsFinalRelease позволяет обойти это ограничение и выполнять данные команды даже через ввод в игровой чат, не изменяя user.ini. Поэтому я всегда делаю патч IsFinalRelease и заменой одного байта решаю 2 проблемы. Однако, если вам это не нужно, вы можете ограничиться патчем IsEnableCopynPaste. Удачи