Начинающий
- Статус
- Оффлайн
- Регистрация
- 10 Апр 2025
- Сообщения
- 76
- Реакции
- 3
Приветствую дорогие пастерочки и не только, сегодня я бы хотел показать процесс реверса и непосредственно хука Skybox.
Возможно, уже опытные в данной теме люди скажут: "Ну это же база" попрошу заметить, сколько в ветке "вопросы и помощь новичкам" появляется постов по типу "как искать паттерны".
В данной теме я хочу закрыть данную тему раз и навсегда. Также я думаю, что появятся индивиды, которые предложат чекнуть чужой сурс и стащить паттерн, с такими людьми лучше не иметь дружеских отношений. Ведь когда они пастять с любой базы они либо стремятся выдать чужой труд за свой, либо почувствовать себя умнее, я не могу полноценно представить что у них в голове в этот момент поэтому не буду продолжать.
Данный гайд направлен на то, чтобы те, кто действительно хочет чему-то научится могли подчерпнуть для себя важные знания не шерстя весь интернет и не спрашивая всех подряд. Конечно, я не говорю что не нужно самостоятельно искать информацию, это очень важное умение для хорошего кодера. Но как я уже писал выше многие новички не стараясь найти нужную им информацию лезут засорять соседнюю ветку.
Что ж мое вступление уже затянулось - оно было сделано чтобы отбросить большинство претензий на корню. Можно считать что это мой подарок форуму на новый год. Начнем!
Процесс реверса
Для начала давайте определимся с DLL в которой будем дальше работать. Скажу сразу что за большую часть визуалов отвечает
scenesystem.dll, для дальнейшей работы нам понадобится дизассемблер IDA Pro, сама по себе она платная но я уверен что вы знаете где ее достать. А также нам нужно 2 плагина SigMaker и ClassInformer их можно найти в свободном доступе, достаточно добавить их в папку plagins и запустить. Впрочем это написано на GitHub'ах самих плагинов.
После того как все готово запускаем иду и нас встречает окно выбора файла:
Далее идет стандартный процесс выбора .dll
путь до нужно нам видно на скрине.
У вас появятся окна при загрузке файла
везде прокликивайте "Yes" кроме окошка с файлом
pdb.
Далее у вас появится окно с ассемблерным кодом
Но мы ничего не делаем и ждем полной загрузки файла пока в левом нижнем углу не появится надпись "idle"
После этого нажимаем сочетание клавиш Shift + Alt + I у вас появится окно ClassInformer'а там ничего не трогаем и нажимаем "OK".
Далее у вас появится список названий классов (Это работает за счет того что компилятор MSVS оставляет некоторые символы в бинаре что и позволяет преобразовать имена классов в нормальные названия) нажимаем Ctrl + F и в поиске вводим слово "sky"
У вас появится на выбор 4 класса
Из них нам нужно выбрать последний, данный выбор я комментировать не буду
Т.к. это можно сделать просто просмотреть содержимое и посмотреть количество
функций в классе.
Нажимаем на выбранный нами класс 2 раза и попадаем на его содержимое:
Тут отчетливо видно список функций
(Они начинаются на "sub" и
заканчиваются на свой адрес)
Сегодня нам понадобится только первая из них
Она уже подписана т.к. я в том же файле иды что реверсил ранее.
Важно понимать что все эти функции относятся к
SkyBox и размещены они здесь не случайно
Нажимаем на первую из них 2 раза чтобы попасть на ее содержимое и нажимаем F5 чтобы открыть псевдокод функции
Тут вам пригодятся знания C-подобных языков чтобы понять логику программы.
Пропустив передачу аргументов и объявление локальный переменных мы попадаем на тело функции. Скорее всего у вас появится вопрос
почему переменные уже с названия, ответ на поверхности, названия остались с моих прошлых
действий над кодом. Названия можно менять на кнопку "N" наведясь на нужную переменную или функцию. Нам стоит обратить внимание на skybox_data такое название я дал потому что в коде частое идет обращение к данной переменной и прибавлению к нему смещения (На скрине видно переменную v9 которая тоже является частью skybox_data.
Для полноты картины покажу вам аргументы
которые передаются в функцию
их названия можно также определить из тела функции
Возможно тут будут ошибки в нейминге но это не столь важно
Теперь нам надо вгетать skybox_data и составить класс с нужными нам смещениями (Их можно находить анализируя используемые
переменные и смещения от skybox_data. Если переменных не так много можно попробовать перебором)
А вот и наш цвет смотрим, на смещение - 0x128
Значит и смещение в нашем классе будет 0x128
от начала класса и структура Vector3 (это было понятно потому что был import и названия сохранились
Теперь нам необходимо создать паттерн нашей функции
Сделать это можно нажав Ctrl + Alt + S
Откроется меню SigMaker'а. Проставляйте настройки как на скрине и нажимайте "OK"
В консоли внизу появится паттерн нашей функции
Его надо перенести в код
И сделать hook
Создание хука
Для создания хука вам понадобится библиотека MinHook или любая удобная вам а также фунция PatternScan/FindPattern
чтобы найти адрес самой функции в памяти данные функции вы можете найти в интернете или написать самим
Ищем адрес функции из выше перечисленных переменных
Создаем сигнатуру функции как показано на скрине
для понимания можно соотнести с объявлением из иды
И понять принцип работы
Создаем хук через библиотеку выше сказанную (Подробности работы с MinHook можно в большом количестве найти все там же в интернете)
Самое важное сейчас сделать саму функцию хука
Можно сказать что тут мы переписывает игровую функцию
Я воспользовался формулой нахождения
SkyBoxData прямо как написано в ида
Привел его к классу о котором мы говорили выше
В данном варианте цвет определяется от 0.f до 1.f
(Но если мы поставим значения выше будет красивый эффект)
skybox_color это структура Vector3 т.е.
просто float x, y, z
после проделанной работы не забываем вызывать оригинальную функцию
Осталось только сделать класс но его можно избежать если для вас это не удобно и просто
прибавить офсет ручками как это написано в закомментированной строчке
Дальше дело за малым добавляем настройку в меню и кайфуем
результат:
+rep Cimoy за помощь
результат:
+rep Cimoy за помощь
Последнее редактирование:
