как узнать скрипт игры
Практическое руководство по взлому (и защите) игр на Unity
Когда речь идёт о программном обеспечении, термин «взлом» зачастую ассоциируют с пиратством и нарушением авторских прав. Данная статья не об этом; напротив, я решительно не одобряю любые действия, которые прямо или косвенно могут навредить другим разработчикам. Тем не менее, эта статья всё же является практическим руководством по взлому. Используя инструменты и методы о которых далее пойдёт речь, вы сможете проверить защиту собственной Unity игры и узнаете, как обезопасить её от взлома и кражи ресурсов.
Введение
В основе взлома лежит знание: необходимо понимать особенности компиляции Unity-проекта, чтобы его взломать. Прочитав статью, вы узнаете, каким образом Unity компилирует ресурсы игры и как извлечь из них исходные материалы: текстуры, шейдеры, 3D-модели и скрипты. Эти навыки будут полезны не только для анализа безопасности проекта, но также для его продвинутой отладки. В связи с закрытостью исходного кода, Unity часто работает как «черный ящик» и порой единственный способ понять, что именно в нём происходит — это изучение скомпилированной версии скриптов. Кроме прочего, декомпиляция чужой игры может стать серьёзным подспорьем в поиске её секретов и «пасхальных яиц». Например, именно таким образом было найдено решение финальной головоломки в игре FEZ.
Находим ресурсы игры
Рассмотрим для примера игру, собранную под ОС Windows и загруженную через Steam. Чтобы добраться до директории, в которой находятся нужные нам ресурсы, откроем окно свойств игры в библиотеке Steam и в закладке «Local files» нажмём «Browse local files…».
Извлекаем текстуры и шейдеры
Графический интерфейс программы не отличается удобством, а также она страдает от нескольких критических багов. Не взирая на это, программа вполне способна извлечь большинство текстур и шейдеров из игры. Полученные в результате текстуры будут иметь формат DDS, который можно «прочитать» с помощью Windows Texture Viewer.
С шейдерами ситуация обстоит сложнее: они извлекаются в уже скомпилированным виде и, насколько мне известно, решений для их автоматической трансляции в удобочитаемый формат не существует. Тем не менее, это обстоятельство не мешает импортировать и использовать полученные шейдеры в другом Unity-проекте. Не забывайте, однако, что подобная «кража» нарушает авторские права и является актом пиратства.
Извлекаем 3D-модели
Трёхмерные модели в типовой Unity-сборке «разбросаны» по различным ресурсам, а некоторые из них и вовсе могут генерироваться во время игры. Вместо копания в файлах, существует интересная альтернатива — получить данные о геометрии прямиком из памяти графического ускорителя. Когда игра запущена, вся информация о текстурах и моделях, видимых на экране, находится в памяти видеокарты. С помощью утилиты 3D Ripper DX можно извлечь всю эту информацию и сохранить в формате, понятном 3D-редакторам (например, 3D Studio Max). Учтите, что программа не самая простая в обращении — возможно, придётся обратиться к документации.
Взламываем PlayerPrefs
Защищаем PlayerPrefs
Помешать пользователю редактировать значения в системном реестре мы не в силах. А вот проверить, изменялись ли эти значения без нашего ведома — вполне реально. В этом нам помогут хеш-функции: сравнив контрольные суммы хранимых данных, мы сможем убедиться, что никто и ничто, кроме нашего кода эти данные не изменяло.
Приведенный выше класс — упрощенный пример реализации, работающий со строковыми переменными. Для инициализации ему необходимо передать секретный ключ и список PlayerPrefs-ключей, значения которых должны быть защищены:
Затем его можно использовать следующим образом:
Взламываем исходный код
Данных подход особенно эффективен для наших целей: Unity очень скупо оптимизирует исходный код игровых скриптов, практически не изменяя его структуру, а также не скрывает названия переменных. Это позволяет с легкостью читать и понимать декомпилированый материал.
Защищаем исходный код
Раз Unity не заботится о сохранности нашего кода — сделаем это сами. Благо, существует утилита, готовая автоматически зашифровать плоды нашего интеллектуального труда: Unity 3D Obfuscator.
И хотя программа отлично справляется со своими обязанностями, многие классы, адресуемые извне родной библиотеки, всё же не могут быть зашифрованы без риска нарушения связанности — будьте осторожны!
Взламываем память игры
Cheat Engine — широко известная программа для взлома игр. Она находит ту область оперативной памяти, которая принадлежит процессу запущенной игры и позволяет произвольно её изменять.
Эта программа пользуется тем фактом, что разработчики игр очень редко защищают значения переменных. Рассмотрим следующий пример: в некой игре у нас есть 100 патронов; используя Cheat Engine, можно выполнить поиск участков памяти, которые хранят значение «100». Затем мы делаем выстрел — запас патронов составляет 99 единиц. Снова сканируем память, но теперь ищем значение «99». После нескольких подобных итераций можно с легкостью обнаружить расположение большинства переменных игры и произвольно их изменять.
Защищаем память игры
Использовать нашу новую структуру можно следующим образом:
Если вы выводите значения переменных на экран, хакеры всё ещё смогут перехватить и поменять их, но это не повлияет на действительные значения, хранящиеся в памяти и использующиеся в логике игры.
Заключение
К сожалению, существует не так уж много способов защитить игру от взлома. Будучи установленной на пользовательское устройство, она фактически раскрывает все ваши текстуры, модели и исходный код. Если кто-то захочет декомпилировать игру и украсть ресурсы — это лишь вопрос времени.
Невзирая на это, существуют действенные методы, которые позволят серьёзно усложнить жизнь злоумышленникам. Это не значит, что нужно вдаваться в панику, шифровать весь исходный код и защищать каждую переменную, но по крайней мере задумайтесь, какие ресурсы вашего проекта действительно важны и что вы можете сделать для их защиты.
Читы для игр ВКонтакте и в Одноклассниках
Для поиска сигнатур нам понадобиться Cheat Engine и еще желательно Opera 12.16, т.к в ней всего !Эти два способа поиска сигнатур самые важные и советую прочитать все как Дальше опять изменяем значение (в нашем случае нам опять надо пострелять) и проверяем чтобы Нажимаем Next Scan 10-15 раз или пока строка Found (Всего значений) не будет меняться. После этого, выбираем в Scan Type: Changed value, стреляем и нажимаем на кнопку Next Scan, !Вам обязательно нужно всегда понимать увеличилось, уменьшилось или не Затем, когда мы нашли 1-2 значений переносим их в таблицу, нажатием на красную стрелку. Нажимаем по значению в таблице и замораживаем его, как заморозить смотрите на картинке Далее, когда вы заморозили значение попытайтесь изменить его (в данном случае нам нужно Нажимаем по этой строке (инструкции), далее нажимаем на кнопку «Show disassembler» У вас должно открыться такое окно. Дальше нажмите правой кнопкой мыши на то, что у вас выделилось, и выберите Goto address (На Теперь нажимаем куда на рисунке указано правой кнопкой мыши и нажимаем там на Replace with И нажимаем ОК. Теперь снова то, что у нас получилось копируем до 2-й желтой линии, У нас получилось так: 90 90 90 90 90 90 83 EC 0C 68 54 44, убираем цифры справа и у нас !Данный способ самый эффективный для поиска сигнатур, его можно !Виеодемонстрация пункта 1. 2. Поиск сигнатур на быстро изменяющиеся значения параметры которые обведены красным на скриншоте/ Для того чтобы, найти полет, нам нужно считать то что если мы стоим на земле (не прыгаем) то это Теперь в строку «Значение:» пишем 1 и нажимаем на кнопку «Поиск», после того как мы В поле «Значение:» пишем 0, потом заходим в игру прыгаем (Нажимаем пробел – Space), быстро !Нужно это делать во время прыжка (если мы ищем матрицу, то во время
Потом опять пишем 1 и нажимаем «Отсеять», далее пишем 0, прыгаем и во время прыжка Далее нажимаем по адресу в таблице правой кнопкой мыши и выбираем «Брейкпоинт на запись»/ Потом в появившемся окне у вас должна появится одна инструкция, нажмите по ней, и нажмите После перехода в отладчик окно которое указано выше на скриншоте можно закрыть/ Дальше нажимаем правой кнопкой мыши на то, что у нас выделилось когда мы зашли в отладчик Дальше нажимаем по первому байту левой кнопкой мыши, а потом нажимаем по ему правой После чего копируем байты до 2-й желтой строчки/ !Данный способ подойдет для значений, которые изменяются на короткое !Видеодемонстрация пункта 2. Почему никак не узнать исходный код игры?Объясните пожалуйста, почему я никогда не узнаю исходный код какой-нибудь игры пока разработчики его сами не выложат в открытый доступ или хакеры его не сольют? В обычных приложениях его можно узнать через DotPeek, но в большинстве игр нет. Почему нельзя узнать исходный код, как например достать текстуры из игры? Я понимаю вопросы глупые, но объясните мне пожалуйста как дурачку. Я просто не могу этого понять. =( (Объясните пожалуйста на простых словах, без википедии, я не понимаю что там написано) Вот и как голодному студенту узнать рецепт? Да, продукт перед ним. Да, он может расковырять свою порцию, отсортировать кукурузки и нарезку, по форме кубиков узнать каким ножом резали, подсчитать в граммах каждый ингридиент, фигакнуть соус на центрифуге, просветить спектроанализатором на химические элементы, прикинуть примерно из чего оно могло состоять. Но на это уйдет уйма времени и средств. Потому куда важнее дать пояснение чем просто посмотреть чужой код Всем привет, продолжаем изучать автоматизацию на основе программируемого автокликера. Начнём с подпрограмм, что это и зачем они нужны. при этом подразумевается, что вам нужно сделать так с множеством страниц, например 20 штук. Но что если нужно открывать другие страницы, а может, между делом совершать совсем другие действия (публиковать пост, писать комментарии и т.д.) Тогда имеет смысл выделить наш участок кода в отдельную функцию. Также важной возможностью является передача в вашу функцию какого-либо параметра, который менял бы исполнение этой функции в зависимости от значения переменной. Вот участок моей реальной программы: Да, ваш скрипт может целиком выглядеть как вызов различных функций, это нормально и даже очень хорошо. Я передаю в функцию TWPersonalPost переменную, которая имеет значение от 1 до 10, в зависимости от этого, функция открывает тот лист Excel с которого мне нужно скопировать информацию: и внутри подпрограммы с помощью команд IF или SWITCH сделать различные действия в зависимости от значения переменной. Анализ экрана позволяет добавить в вашу программу ту самую вариативность исполнения, программа будет менять исполнение действий в зависимости от происходящего на экране (вот мы и добрались до создания собственного искусственного интеллекта. ну почти) для этого clickermann представляет нам множество функций, главной из которой является GETSCREEN. Тогда в буфер сохранится выделенный красным криво-прямоугольником участок. Ну например если мы хотим нажать одну из этих зеленых кнопок, и мы знаем что они всегда находятся в этой области. Хорошо, мы сохранили изображение, как его проанализировать? Откуда мы узнали какой цвет пикселя нам нужно искать? Для этого достаточно навести на нужное место и посмотреть в окно определения цвета clickermann. Оранжевым изобразил указатель мыши в момент создания этого снимка. Но нужно быть осторожным, многие сайты меняют цвета кнопок при наведении на них, так и здесь на пикабу, кнопка «картинка» не меняет цвет при наведении, а вот видео и текст меняют и при наведении на них мы увидим цвет: Как видно, при наведении кнопка побледнела, в отличии от «картинка», кстати @SupportTech, а не баг ли это?)) Получается, чтобы узнать цвет пикселя нам нужно навести на кнопку, но при наведении, цвет меняется, в своё время я немало посидел, над причиной, почему моя программа не находит цвет, когда вот он туточки. Для этого мы можем пойти простым путём, делаем скриншот экрана одним из следующих способов, в зависимости от вашего просветления: Ну разве что последний способ не очень подходит, после чего открываем картинку и уже на ней наводим на кнопку и смотрим её цвет: С помощью этой функции, также можно проверять, открыто ли нужное окно у вас, или ваша программа начинает творить фигню. Например, мы знаем, что Excel выглядит так: наверху у него всегда цвет пикселя Теперь программа позовёт вас, если что-то пойдёт не так и будет ждать. Как вариант можно в действиях указать нажатие левой кнопкой мыши по значку Excel, для его раскрытия и потом ещё одну такую же проверку, в 90% случаев именно из-за лишнего закрытия-открытия окна что-то идёт не так. Мы разобрали случай, когда цвет пикселя не повторяется на экране, то есть у нас есть только одна кнопка «текст» например, но что, если у нас множество кнопок одного цвета, и цена ошибки слишком высока, как то так: Тогда следует использовать анализ экрана по совпадению картинки, а поможет нам функция Чтобы повысить вероятность нахождения, можно указать % точности совпадения. Например так: IF_PICTURE_IN (20,20, 300, 300, «somefile.bmp», 0, 90) тогда, 90% совпадения будет достаточно для запуска действий внутри IF. и второй способ, включаем режим лупы Теперь смотрим на окно лупы в clickermann и наводим на нужное место, нажимаем ALT + G и скриншот указанный на экране лупы будет сохранен в папке программы внутри папки screens. Теперь это изображение мы можем использовать для поиска его при исполнении скрипта. Мы рассмотрели две основные функции для анализа экрана, по пикселю и по изображению. Вы можете ознакомиться с остальными функциями в справке программы, возможно найдете функцию которая больше подходит вам для исполнения вашего скрипта, но эти две на 95% покрывают все потребности. Найдены дубликатыПрограммы и Браузеры166 постов 3.5K подписчика Правила сообщества-При возникновении споров относитесь с уважением друг к другу, а так же приводите аргументы. Разрешено всё, что не запрещено правилами Пикабу.
Да, но старался упростить, обычному пользователю это не особо важно.
Да, поэтому написал, что getscreen нужной области надо обновлять каждый раз перед анализом экрана
Тоже не особо нужная вещь для рядового пользователя, после всей нужной инфы выпущу пост, с подобными усложненными лайфхаками) За дополнение спасибо) Или это у меня какой-то бред открывается почему-то. Я тут качал, но винда ругает на вирус, вообще я очень подозрительно отношусь к скачиваниям со сторонних ресурсов.Но если особо выбора нет, то конечно тпридется качать. Я всегда качал с той ссылки что в посте, но её видимо подменили или чего, вирус логично что ругается, программа перехватывает управление мышкой и клавиатурой все таки)) Если терпит завтра могу просто свою папку с программой архивом на облако залить и ссылку дать Было бы просто замечательно. Здрастьте за софтинку подзабыли? где можно увидеть наглядные примеры с использованием этого софта? Программы и тд. Группа в вк чет мертвая совсем у них На ютубе, только там не густо. На оф. форум можно заглянуть, он потихоньку живёт http://crapware.aidf.org/forum/index.php В пятницу познала дзен с битриксом, всего-то 200 правил для купонов с 1 купоном создать. В субботу поняла, что можно использовать ваш совет про кликер, вручную вставляя в буфер обмена данные Да будет завтра битва! 😉 А подскажите, какие функции нужны что бы сделать так: Кликер работает, доходит до поля где нужно вручную ввести текст с бумажки, ждёт ввода, после ввода продолжает дальше. Это можно как-то на горячую клавишу вывести? Например, ввели текст, нажали «энтер» и он пошёл дальше. Делать проверку через анализ экрана сильно замороченно, я уверен, что это можно как то проще сделать. Реализовал кучу функций аля LCLICK(512,331) //клик по адресу Понял, что уже реализованы горячие клавиши в разделе шаблонов. Вроде инженерное образование, вроде умею читать. Прочёл все три поста несколько раз, но так и не смог написать ничего работающего( Мне больше BurundukPro подходит, есть два режима, для тех кто не хочет морочиться с программированием и для программистов. Ответ на пост «Как автоматизировать однотипную, монотонную работу бесплатно и без навыков программирования»Эх, сколько раз меня выручала автоматизация! Вспомнил тут пару случаев. (если что то использую скрипты в AutoHotkey (AHK)). Да и мелкие задачи, если их можно автоматизировать, тоже переносятся в АНК. Из того что помню: — тоже из учётки. Перешла к нам в отдел женщина, которая в работе разбиралась но с пк была на Вы. Очень мне не нравилось что она постоянно просила меня подойти и поставить апостроф, т.к. у неё не получалось (много раз в день, Карл!). На очередную просьбу я просто сделал ей скрипт который этот апостроф ставит по нажатию на Pause, а на клавиатуру напечатал на самоклейке этот апостроф и на эту кнопку наклеил. Если вы подумали, что для того чтобы сделать всё тут описанное нужны навыки програмирования, то вы ошибаетесь. Большая часть примеров была сделана путем копирования скрипров которые записаны в русской документации по программе (прямо напрячься пришлоь только в скрипте для игры). Да и на самом деле сейчас есть много других программ, в которых даже не нужно ничего писать текстом, записывай действия и все (как в оригинальном посте).
|