Некоторые особенности:
1 PE32 DLL 4.5 кб
2 Функция поиска паттерна
3 Паттерны текст вида
4 Функция обмена патч байтами
5 Если версия не совпадает - MessageBoxW и FreeLibrary
6 Клавиши работают только в активном окне игры
7 Меню и клавиши используют поток игры
8 Рисовка на базе D3DXCreateFontW->DrawTextW
9 100% unicode
NASM: https://www.nasm.us -> nasm-2.xx.xx-win64.zip -> nasm.exe
Linker: http://www.godevtool.com/Golink.zip -> golink.exe
Редактор: https://notepad-plus-plus.org
Приступим...
Создадим txt файл и переименуем в "dragon commander hack.asm"
Открываем файл в notepad++
Добавим EntryPoint, структуры, импорт апи
Создадим секцию кода
Добавим функцию DllMain, resd 1 - для пропуска адреса возврата а ret 3*4 значит что у функции 3 параметра.
Добавляем функцию инициализации, получаем базу/размер модулей из PE хидера, поиск патч опций, DX9Binding.dll там будем ставить хуки для менюхи.
Добавляем функцию поиска. Она не особо сложная, быстрая и может пропускать мусорные байты. Принимает паттерны текст вида.
и функцию обмена байтами, позволяет не копировать оригинал код для откл опций.
Теперь создадим функцию меню.
Место где установили перехват - достает D3D_Device, нам он нужен для D3DXCreateFontW, сохраним его, а потом вернем игре.
Добавим код для проверки активности окна. Также код используется для получения hGameWnd, следовательно, после инжекта, меню нарисуется только после клика в окно игры.
Добавим кнопку скрыть/показать меню. cmp + setz = 0/1 aka откл/вкл
Добавляем все опции...
После опций, добавим код создания шрифта и получения размера видимой области окна, также передвинем меню в правый угол а для копирования Rect структуры - используем SSE2.
Для вывода текста опций - используем DrawTextW
Возвращаем игре D3D_Device, убираем стек буфер, восстанавливаем важные регистры и ставим ret для возврата на код игры
Добавляем функцию освобождения ресурсов которые были созданы D3DXCreateFontW, если их не освободить - игра просто вылелит в момент изменения размера окна. Обнуление hFont нужно чтобы D3DXCreateFontW мог создать новый шрифт и для получения нового размера окна.
и остальные функции для обработки перехвата. там также находится "оригинал код" который был заменен на call
Создадим секцию данных для: паттернов, патчей, строк
Создадим секцию неинициализ. данных, которые не занимают место в длке
Сборка:
ps справка по опциям линкера на оф сайте.