Включаем буфер обмена (CTRL+C CTRL+V) в HF клиенте

Charmant

Путник
Участник
Сообщения
26
Розыгрыши
0
Репутация
37
Реакции
52
Баллы
80
В последнее время меня часто спрашивают как включить буфер обмена в клиентах грации-ХФ. Иногда вижу что ради включения этой опции люди копируют в свою папку с игрой какую-то странную dll, накрытую вмпротектом. Серьезно? Все гораздо проще, поэтому я решил написать небольшой гайд.

Итак, нам понадобится файл nwindow.dll из папки system клиента игры, инструмент для реверса Ghidra. По желанию простой хекс-редактор и программа detect it easy, если вы не уверены что ваша dll без темиды. Для примера будет использоваться анпакнутая nwindow.dll для HF5 отсюда.

1) Для начала закинем nwindow.dll в DiE и посмотрим результат:
1734437114330.webp
Отлично, dll анпакнута и почищена от темиды.

2) Запускаем ghidra, импортируем nwindow.dll, открываем и подтверждаем выполнение автоанализа, дожидаемся его завершения.

3) Теперь нам нужно найти функцию NConsoleWnd::IsFinalRelease. От результата ее выполнения зависит работа буфера обмена. Но как ее найти, если она не экспортируемая? Большая часть функций в dll имеет обработчик ошибок, который содержит название функции. Будем искать по нему. Открываем окно Defined Strings и вводим NConsoleWnd::IsFinalRelease:
1734437742298.webp

Такая строка найдена, но ссылок на нее нет. Копируем адрес строки и открываем поиск:
1734437824699.webp

Смотрим результат:
1734437964884.webp

Найден участок кода, который ссылается на эту строку. Но код не был дизассемблирован во время автоанализа. Не проблема - выделяем байты и нажимаем D:
1734438107045.webp

Отлично. Это тот обработчик ошибок, который нам нужен. А функция, которую мы будем патчить, находится прямо перед ним. Откроем эту функцию:
1734438381865.webp

Видим, что функция всегда возвращает 1. Для включения буфера обмена нужно вернуть 0. Для этого патчим одну инструкцию:
1734438446732.webp на 1734438470347.webp
Сохраняем изменения и экспортируем dll в папку system, заменяем оригинальную nwindow.dll на пропатченную.

По желанию патч можно сделать в простом хекс-редакторе, а не в ghidra. Чаще всего я делаю именно так.
1734438764880.webp

Всё, готово. Замена всего лишь одного байта включила буфер обмена. Аналогичным образом можно пропатчить nwindow.dll клиентов грации финал, эпилога, фреи и тд (интерлюд и ниже не проверял).

Прикрепляю пропатченную nwindow.dll для hf5 (ссылку на оригинал указывал выше)
Пароль:


Дополню свой пост.
На самом деле для того чтобы включить только буфер обмена, можно пропатчить функцию "NCEditBox::IsEnableCopynPaste". Способ поиска этой функции ничем не отличается от "NConsoleWnd::IsFinalRelease".
Вот как выглядит IsEnableCopynPaste:
1734453088558.webp
Для включения буфера обмена можно изменить условный переход jnz на jz (при этом не трогая IsFinalRelease)
1734453192815.webp Опять же всего один байт изменений.

Но почему же я делаю патч именно IsFinalRelease?
Условный переход в функции IsEnableCopynPaste, который я показал выше, выполняется после вызова IsFinalRelease и проверки ее результата. И функция IsEnableCopynPaste не единственная, чье выполнение зависит от результата IsFinalRelease.

Я думаю, все знают команды билдера ///stat fps, ///show fog, ///show particles, ///reloadui и тд. Данные команды любят биндить в user.ini на ц4 и интерлюд клиентах. Однако, на клиентах грация и выше бинд многих команд не работает, если у игрока нет ГМ-прав. Патч IsFinalRelease позволяет обойти это ограничение и выполнять данные команды даже через ввод в игровой чат, не изменяя user.ini. Поэтому я всегда делаю патч IsFinalRelease и заменой одного байта решаю 2 проблемы. Однако, если вам это не нужно, вы можете ограничиться патчем IsEnableCopynPaste. Удачи✌️
 

Вложения


Удобно. Что касаемо клиентских команд, раньше патчил две функции: NConsoleWnd::ExecuteClientBuilderCommand и NCChatWnd::ExecuteBuilderUnrealCommand. В начале этих функций идет вызов NConsoleWnd::GetBuilderAuthority. В первой нужно было заменить jnz на jmp после вызова, а во второй занапить прыжок.
 
Если я правильно помню , то чтобы реализовать CTRL+C CTRL+V достаточно UnrealScript, не нужно внедрять модуль .
 
было бы не плохо если бы для разных хроник а для ХФ а так есть в общем доступе
 
Назад
Сверху Снизу