Взлом PS2-игр на примере СХО: gamer — LiveJournal
Нет такой игры, которую невозможно взломать. Даже на приставке. Церковь читерства представляет:Silent Hill: Origins
Увидеть на PS2 и не умереть
Начиная с нуля, необходимо:
1. Записать на диск образ программы uLaunchELF (например, отсюда).
2. Скопировать на USB-флэшку файл BOOT.ELF той же программы (архив находится здесь), а также CB10.ELF этого архива.
3. Запустить записанный диск, подключить флэшку к приставке.
4. Перекинуть соответствующие файлы с флэшки на карту памяти приставки. Файл BOOT.ELF удобнее разместить в директории mc0://BOOT/ (если такой нет — создать). Отключить флэшку.
5. Теперь можно запускать программу без диска. При загрузке консоли жмём R1.
6. Находим на мемкарте скопированный с флэшки файл CB10.ELF, запускаем.
7. В меню жмём Select Cheats, добавляем новую игру (кнопка [О]).
8. Пишем название игры, в нашем случае Silent Hill-Origins. Жмём [Start].
9. Нажимаем [->], чтобы открыть список кодов игры. [О], чтобы добавить. Вводим название основного кода: Enable Code. Аналогично подтверждаем нажатием [Start].
10. Нажимаем [->], чтобы открыть список значений выбранного кода. [О], чтобы добавить новое. Перед вами должна появиться клавиатура с цифрами и буквами A-F (не полный алфавит с набором символов, как при введении названия!). Набираем следующее значение: B4336FA9 4DFEFB79. Подтверждаем нажатием [Start].
11. Таким же образом необходимо добавить ещё три линии основного кода:
72D71355 9EC1C62E
FD6A5670 9514C6E2
8BD5631F 9D76F1FB
Подтверждаем нажатием [Start], выходим к названиям кнопкой [<-].
12. Теперь можно вводить любые читы из списка в конце записи.
Для чего нужны похожие коды, неизвестно. Их работоспособность проверена.
Примечание: в некоторых случаях при самостоятельном редактировании Codebreaker начинает виснуть после перезагрузки. Лечится удалением настроек программы с карты памяти. После этого придётся всё прописывать заново.
Других проблем не обнаружено, но в любом случае вы действуете на свой страх и риск. Во избежание, копируйте сохранения через uLaunchELF на флэшку.
В качестве альтернативы можно поискать готовые файлы базы данных программы (с расширением cbc), но для этого варианта необходима USB-флэш, запускающаяся через Codebreaker. В отличие от uLaunchELF, данная программа различает далеко не все флэшки.
И, конечно же, можно попробовать другие радости читера, однако возможность взлома СХО была обнаружена пока лишь для этой программы.
Cheats:
P1 Press Select To Skip FMV
4795DEA9 D2808F2A
21E46B4F 3A53E662
52802072 4502CA9E
Infinite Health
07AAFECB 677D4387
Never Reload
FA41D9AC 0038E346
Never Reload With Max Clip
C7771F63 07AB982F
Infinite Ammo
0C090A69 B97C4F28
Max Infinite Ammo
71D7C135 81656749
Extra Ammo
1D870FA9 4FF62BAC
Infinite Items
D4355A37 B29630EC
Max Infinite Items
DDDA8DF4 B5328A88
Extra Items
697B5946 AB56A8BF
Infinite Run (Never Exhausted)
83AF9BA1 27838516
Spotty Flashlight
CC92B5B5 4AD2E037
P1 Press L2+R2+L1+R1 To Replenish Health
40609782 5C46A8D8
44AB83A3 8FC233FD
A4535F8A 84D8389F
P1 Press L3+R3+L1+R1 To Suicide
092DF205 57668E48
212D3FB0 AA269721
CB086C0D 5F533872
5218421A 46FDC5AE
P1 Press R3+L1 For Double Speed
B626F9C4 41C534CA
D7F8BA7F 5649F28C
704A3812 C128EDDA
BEC4FE10 1E3DC57F
95A840E1 EC75C6DF
AF9AA09B CB1BFF11
P1 Press R3+L2 For Triple Speed
2CCD135D A20FBD22
BECA9A13 4DCF5540
704A3812 C128EDDA
BEC4FE10 1E3DC57F
95A840E1 EC75C6DF
AF9AA09B CB1BFF11
P1 Press R3+R2 For Normal Speed
440BAECF 8D0035C9
5D39CA6C B897D8DB
704A3812 C128EDDA
BEC4FE10 1E3DC57F
95A840E1 EC75C6DF
AF9AA09B CB1BFF11
P1 Press L3+L1 Enable Turbo Mode
966FA3A2 0E913D69
34692328 54CD5BFF
P1 Press L3+L2 Disable Turbo Mode
E8F59B25 32D5834E
AF6CF6AB 0D504748
P1 Press R3+L1 Enable Goggels Mode
946745AF 62D5BF86
B5F2DDAB 6352DE13
P1 Press R3+L2 Disable Goggels Mode
009318AB 63436F59
63E50736 EBF17814
Activate Cheat Codes:
God Mode
1869FF01 00E896B5
Quick Death Enemies
247B1162 E083EAFF
51015605 6AB3BFB8
Unlock Extra Options
03B7BD8E B082A7A5
Unlock All Maps
94072BF9 124D1572
Noise Filter
A71C5B56 06073336
Extra Blood
789D3383 9ECDEA44
Always Bloody Foot Steps
A282874C F1EDB013
Коды к другим PS2-играм есть на этом сайте.
Самое лучшее в игре — это её взлом. 😀
05-03-2009 © st-MK
Источник: Lost memories of st-MK
Crack — Взлом игр используя пакеты (Перехват пакетов) | Начало
Всем привет хочу предложить перевод
Please login or register to view links.
с одного забугор форума по хакингу игр. Насколько я понимаю здесь идёт описание, терминология, предложения инструментов для этого и несколько видео.
***Перевод:***
Для начала, если вы нуб: захват пакетов, их модификация и отправка — не для вас. Только адекватные геймхакеры с опытом минимум 1 год могут читать это.
(это было в начале статьи, но я не соглашусь так как в этой статье можно получить какую-то картину по даному топику)
Шаг за шагом в взломе игр с перехватом пакетов
Что для этого нужно:
1) изучить всё о пакетах (это будет в этом топике)
2) Найти пакеты которые выполняют функции в клиенте игры, реверснуть их (reverse them)
3) Перехватить пакетные функции и залогировать их
4) Произвести реверсинг структуры пакета
5) Внедрить DLL в которой внедрены наши изменения и которая может вызвать так скажем SendPacket() метод
Что такое пакет?
Ваш игровой клиент и сервер игры находятся в постоянном общении между собой. Каждая передача одной стороны другой называется пакетом. Иногда это может быть серия пакетов которая передается потоком, в других случаях это 1 пакет имеющий одну цель. В играх используются протоколы для передачи пакетов: TCP и UDP. Игра открывает порты, ОС получает пакеты и направляет их к процессу с правильным портом (процесс это наша игра). Как клиент так и сервер имеют функции отправки и принятия пакетов — это важно понимать. В основе этих функций должны быть нормальные функции Windows winsock — википедия по
Please login or register to view links.
(не реклама).
Почему геймхакеры «бегают» за пакетами?
Как выглядит передача пакета между клиентом и сервером?
Клиент использует зелье здоровья -> Клиент запускает функцию pickup() -> зелье здоровья увеличивает здоровье на 1
pickup() функция создаёт сообщение и отправляет его на сервер «клиент использовал порцию зелья здоровья В»
Игровой клиент заворачивает это сообщение в пакет в котором есть сообщение «клиент использовал зелье здоровья В»
Пакет также имеет дополнительную информацию типа размера данных, размер пакета, ИД пакета и т. д.
Давайте назовём эту функцию AssemblePacket()
После этого клиент вызывает функцию SendPacket() который в свою очередь вызывает функцию отправки через Winsock
Это сообщение сокрыто (инкапсулировано) в пакете TCP и отправлено серверу
Операционная система (ОС) сервера получает пакеты и направляет их в обработку, а именно
Winsock функция сервера получает пакеты
Сервер извлекает «пакет игры» из пакета TCP протокола
Теперь наше сообщение обрабатывает серверным обработчиком данных
И тут уже на серверной стороне вызывается функция pickup(), удаляется вещь из карты игры (или рюкзака где лежало зелье) и увеличивает здоровье на +1 на
Please login or register to view links.
(известный термин
Please login or register to view links.
)
Теперь сервер должен обновить информацию состояния игры (карта, рюкзак, здоровье), всё на стороне клиента
Новая информация отправляется в функцию AssemblePacket() на стороне сервера и потом отправляется через SendPacket() -> WinsockSend() клиенту
Если вы знакомы с Windows WndProc очередями сообщений, вы увидите некоторую схожесть
Ключевой момент сейчас понять процесс и то как делается соединение:
Winsock Layer
Network Layer TCP/UDP
game:: DissasemblePacket()
В более серьезных играх вы можете получить несколько слоёв дополнительных типа EncryptPacket() u DecryptPacket() — шифрование и расшифрование пакетов.
Winsock и Network слои в большинстве не важны для гейм хакинга
Нам всё равно на TCP/UDP и Winsock. Единственная причина, по которой нам нужен Winsock, состоит в том, что мы используем ссылки на эти функции winsock, чтобы найти функции AssemblePacket() и DisassemblePacket().
Почему? Потому что нас волнует то что нужно игре. Мы можем хакнуть игру используя игровую логику. Данные внутри пакета — вот важная часть игры!
Что такое Sniffing пакетов (перехват)?
Перехват пакетов — это действие, которое описывается как «человек по середине» (man in the middle) который логирует пакеты по мере их отправки. Самая популярная программа — Wireshark, всё что использует тот или иной порт будет залогировано.
Перехват пакетов важная составляющая, но для взлома игры это не особо, нам нужно логи пакетов, а не их перехват.
Программы которые помогут в этом деле:
WPE Pro & WPE Sonic (Winsock Packet Editor) — старая вещь (есть модификация работает и на х64 и на Win10). WPE использовался очень давно для взлома в простых играх. Но для игр нашего времени эта прога не будет работать. Программа не рабочая, это просто для истории.
Burp Suite — можно использовать для перехвата пакетов браузерных игр.
ColaSoft Packet Player — перехватывает, модифицирует и может отправить.
Advanced Packet Editor
WireEdit — наверное самый хороший инструмент (насколько понял, он только редактирует пакеты, удобный для редактир.)
Как найти пакетные функции?
Для логирования пакетов нужно найти пакетные функции. Функции Winsock всегда используются для отправки, получения данных на Windows, проверке импортируемых таблиц и конечно же поиска этих функций. Найдите перекрестные ссылки на эти функции. Все функции, которые вызывают пакетные функции должны быть реверснуты. Функция которая вызывается чаще всего — вероятнее всего будет главной пакетной функцией.
Вы захотите реверснуть все эти функции по вызову стека, по мере вызова функций, но главное получите общее представление что происходит, после точно определите точные пакетные функции Assemble & Disassemble. Реверсните их как можно лучше.
Логирование пакетов
Перехват пакетов на уровне сети считается низкоуровневым. Как только вы найдете функции которые собирают и отправляют, а с другой стороны получите их и перехватите тогда
HTTP логирование пакетов и манипуляция
Если игра использует HTTP тогда пробуйте использовать Fiddler и Burpsuite они две хороши в этом деле.
***Конец перевода***
Ниже я вставлю видео как доп. информацию где происодит реверсинг и информацию по реверсингу. Примеры старые, но если вы этого не уразумеете, тогда что можно говорить дальше. (Видео на англ)
Прошу простить, если где-то ошибся, так же можете внести своё понимание, если оно будет корректнее и более понятнее.
Если вам заинтересует данный топик, можно будет продолжить перевод (я увижу это по реакциях).
Please login or register to view medias.
Please login or register to view medias.
Please login or register to view medias.
Please login or register to view medias.
Please login or register to view medias.
Please login or register to view medias.
Please login or register to view medias.
Введение во взлом игр | Offensive Security
Введение во взлом игр
23 февраля 2022 г. Наступательная служба безопасности
Энтони «RedHatAugust» Радзикевич
Перед тем, как мы начнем
Прежде чем начать эту статью, нам нужно осветить некоторые вещи заранее. Прежде всего, автор и Offensive Security не одобряют взлом игр. Существуют этические проблемы, связанные с увеличением накладных расходов в игровой индустрии из-за постоянной борьбы с мошенниками, создателями ботов, взломщиками и т. п. Есть также проблемы с негативным влиянием на игры для других игроков, которые хотят играть в игру только по ее предполагаемой ценности. Игровые хакеры чаще всего портят опыт другим игрокам из-за разрушения понятия честной конкуренции и необходимости наращивать навыки в выбранной игре, чтобы доказать, что они лучшие игроки в сообществе.
Несмотря на этические соображения, эта статья может служить нескольким целям:
- Предоставить нынешним и будущим разработчикам игр представление о том, как работает взлом игр, чтобы лучше подготовить контрмеры против взломов.
- Предоставляет информацию о том, как анализировать компьютерные программы для определения ключевых элементов информации в памяти и того, как этими данными можно манипулировать в режиме реального времени для достижения результатов, выходящих за рамки обычной программы.
- Удовлетворить любопытство тем, как игровые хакеры работают с программой и содержимым ее памяти для создания читов.
Опять же, мы не одобряем использование этих знаний для взлома других игр. Мы бы предпочли, чтобы вы, как читатель, воспользовались этим пониманием для анализа компьютерных программ, о которых можно сообщить в рамках процесса ответственного раскрытия информации, чтобы помочь улучшить проблемы безопасности в мире. Хотя ни у автора, ни у Offensive Security нет конкретных методов для разработчиков игр, чтобы предотвратить этот метод взлома, мы призываем тех, кто создает игры, учитывать содержимое и пытаться найти творческие решения для борьбы с этими взломами.
Настройка игры и инструмента
Анализируемая игра называется AssaultCube. Если вы хотите пройти этот процесс вместе с этой статьей в блоге, последнюю загрузку можно найти по адресу https://assault.cubers.net/download.html. В этой статье будет использоваться версия 1.3.0.0 для Windows. Это последняя версия на момент публикации. Давайте быстро установим игру. После открытия загруженного exe-файла появится следующее диалоговое окно.
Щелкнем Далее .
Теперь мы столкнулись с лицензионным соглашением. Я хотел воспользоваться моментом, чтобы указать, что модификации двоичного файла — с целью получения несправедливого преимущества перед другими — прямо противоречат лицензионному соглашению. В этой статье мы анализируем часть взлома игр, чтобы изучить методологии и рабочий процесс того, кто анализирует двоичные файлы для изменения атрибутов в памяти. Понимая, что мы не будем использовать эти навыки неэтичным образом и/или способом, нарушающим настоящее соглашение, давайте нажмем 9.0035 Я согласен .
Мы сохраним компоненты по умолчанию и снова нажмем Next .
Для этой статьи будет выбран каталог установки по умолчанию.
Нажмите Next , чтобы продолжить.
Оставим имя таким же, как имя по умолчанию.
Наконец, мы можем нажать Установить , чтобы установить приложение.
По завершении установки нажимаем Далее снова.
Последнее диалоговое окно показывает, что установка завершена. Щелкнем Close , чтобы закрыть диалоговое окно. При этом автоматически открывается страница браузера, на которой отображаются примечания к выпуску загруженной версии.
Проблема, с которой мы столкнемся позже, заключается в том, что AssaultCube запускается в полноэкранном режиме. Это затрудняет работу с другим нашим приложением. Прежде чем мы перейдем к установке нашего приложения для анализа бинарных файлов (Cheat Engine), давайте откроем AssaultCube и переведем его в оконный режим.
Открытие игры приводит нас к карте с открытым меню.
Давайте выберем пункт меню Settings с помощью клавиш со стрелками
и
Нажмите
Теперь мы можем нажать клавишу со стрелкой вниз для полноэкранного режима и нажать
Теперь у нас есть работающая игра в оконном режиме. Чтобы выйти из игры и вернуться к хосту Windows, мы можем нажать
Инструмент бинарного анализа, который мы будем использовать для проверки адресов памяти, связанных с игрой, называется Cheat Engine. Вы можете найти последнюю версию Cheat Engine по адресу https://www.cheatengine.org/downloads.php. В этой статье использовалась версия 7.4.
При попытке установить Cheat Engine ваше антивирусное программное обеспечение может определить его как угрозу. Перед установкой необходимо сделать исключения для файла.
После ввода исключений давайте откроем исполняемый файл установки. Английский выбран в качестве языка установки этой статьи.
Появится диалоговое окно приветствия. Нажимаем Далее .
В этой статье установка дополнительных программ не рассматривается. С этим мы будем Пропустить все . После ее нажатия установка начнется автоматически.
Теперь мы можем нажать Готово для завершения установки.
Опять же, для запуска этого приложения может потребоваться сделать исключение для антивирусного программного обеспечения. На этом завершается настройка игры и инструмент, который мы будем использовать для управления памятью бинарного файла игры.
Цель взлома игры
Целью взлома игры в этой статье является контроль количества боеприпасов для основной винтовки. Если мы сможем найти адрес памяти, связанный с боеприпасами, мы можем изменить это значение, чтобы добавить больше боеприпасов в наше оружие или оставить значение постоянным на указанном числе.
Присоединение игрового процесса
После установки Cheat Engine возможно произошел сбой AssaultCube. Давайте удостоверимся, что Cheat Engine запущен и виден.
Теперь, когда Cheat Engine подтвержден как работающий, давайте снова откроем AssaultCube. Если он открывается в полноэкранном режиме, выполните те же шаги в разделе настройки, чтобы получить его в оконном режиме.
Теперь, когда оба приложения работают одновременно, давайте вернемся к
Cheat Engine, нажав
В Cheat Engine мы нажмем кнопку Select a Process .
Выделим процесс с ac-client.exe в нем и нажмем Открыть .
Несмотря на то, что в Cheat Engine ничего не изменилось, имя процесса
показывает, что мы успешно загрузили игровой процесс.
Поиск боеприпасов
Прежде чем мы сможем начать поиск боеприпасов, нам нужно определить, сколько боеприпасов у нас есть в нашем текущем оружии. Вернемся к игре и нажмем
Как мы видим внизу посередине игрового окна, у нас есть 20 патронов в винтовке и еще 40 патронов в резерве. Для этой статьи нас интересует только количество патронов в пистолете. После этого мы можем запустить наше первое сканирование адресов памяти в Cheat Engine и указать 20 в текстовом поле «Значение». При этом мы можем нажать First Scan .
В этой статье демонстрация, 6,965 адресов памяти, связанных с игровым процессом, имеют значение 20. Давайте изменим количество патронов в нашей винтовке, сделав пару выстрелов в игре.
Теперь в винтовке 18 патронов. Давайте изменим текстовое поле Value
на 18 и нажмем Next Scan .
Удивительно, но это уменьшило список адресов памяти до 2 записей. Обычно это не так. В обычном случае мы бы уменьшили количество боеприпасов еще ниже и сделали еще одно сканирование с Следующее сканирование . Теперь мы можем выделить и щелкнуть правой кнопкой мыши два найденных адреса памяти.
Теперь мы можем нажать Добавить выбранные адреса в список адресов . Это добавит
записей в нижнюю панель Cheat Engine.
Если все прошло правильно, то одним из этих адресов в списке адресов должен быть
адрес памяти, отвечающий за количество боеприпасов для винтовки.
Контроль количества боеприпасов
Контролировать и изменять количество боеприпасов можно двумя способами. Если мы хотим быть более осторожными, чтобы не привести к сбою игры, мы можем просто вернуться к игре и запустить больше раундов. Давайте сделаем это сейчас.
В этом случае мы произвели еще 2 выстрела и теперь имеем в общей сложности 16. Оба наших сохраненных адреса памяти также показывают значение 16 . Не похоже, что большее количество выстрелов приведет к немедленному разграничению двух сохраненных адресов памяти.
Еще один способ узнать, какой адрес памяти отвечает за количество боеприпасов, — это дважды щелкнуть поле адреса памяти значение в списке адресов и изменить значение. Если значение также меняется в игре, мы можем сделать вывод, что измененный адрес памяти отвечает за атрибут боеприпасов. Давайте изменим значение на 999 на первом указанном адресе памяти и посмотрим, что произойдет.
Мы видим, что второе значение адреса памяти осталось равным 16 и значение счетчика боеприпасов изменено на 999 в игре. Чтобы убедиться, что это правильно, давайте запустим несколько раундов в игре и снова проверим Cheat Engine и это значение.
Значения коррелируют, и второй адрес памяти можно исключить. При этом мы можем переименовать первый адрес памяти в ammo и удалить второй адрес памяти из списка. Чтобы изменить имя, мы дважды щелкаем поле «Описание» адреса памяти и вводим строку, которую мы хотели бы назвать.
Еще один способ контролировать боеприпасы — иметь бесконечные боеприпасы. Чтобы сохранить значение постоянным, мы можем установить активный флажок. Это сложно показать в формате блога, но если щелкнуть это поле, адрес памяти всегда будет изменен на указанное значение, независимо от того, сколько выстрелов было произведено.
При стрельбе в игре значение может уменьшиться на одно или два значения, поскольку исходный код уменьшает значение в зависимости от количества выстрелов. Однако после этого он быстро возвращается к указанному значению. В случае того, как он установлен сейчас, количество патронов всегда будет возвращаться к 9.0035 993 .
Заключение
Несмотря на то, что количество боеприпасов является лишь одним измененным нами атрибутом, мы могли бы использовать тот же процесс и рабочий процесс, чтобы найти значения для здоровья, брони, количества боеприпасов или снабжения других предметов, координаты в игре для создания ‘ режим полета и многое другое.
Помимо взлома игр, Cheat Engine также можно использовать для анализа памяти других приложений, чтобы найти строки внутри приложения и контролировать эти параметры. Это может быть полезно для снижения планки стандартного инструмента отладки в зависимости от того, что мы пытаемся найти в приложении.
Спасибо, что нашли время прочитать эту статью. Опять же, мы не публикуем эту информацию, чтобы побудить вас взламывать игры и получать несправедливое преимущество. Вместо этого мы надеемся, что вы воспользуетесь этой информацией, чтобы подумать о новых и творческих способах защиты текущих и будущих игр от возможности выполнить шаги, описанные выше. Автор и Offensive Security не оправдывают, не продвигают и не поощряют взлом игр неэтичными способами. Мы рекомендуем вам рассматривать Cheat Engine как утилиту, которую можно использовать для отладки адресов памяти и предоставления другой точки зрения на поиск ошибок в других приложениях, не являющихся играми.
Об авторе
Увлеченный обучением и обменом знаниями, Энтони Радзикевич (он же RedHatAugust) при каждой возможности воспитывает окружающих.
В настоящее время он работает на полную ставку разработчиком контента в Offensive Security. Он также преподает на полставки в качестве адъюнкт-профессора в общественном колледже GateWay, где он является ведущим инструктором программы Linux и прокладывает путь к программе кибербезопасности. С искренней верой в то, что обучение происходит в процессе работы, Энтони посвятил себя интерактивному обучению, цель которого состоит не в том, чтобы повторять термины и изрыгать слова, а в том, чтобы взяться за клавиатуру и доказать свои навыки. Имея это в виду, Энтони регулярно участвует в своей местной конференции по безопасности «CactusCon». Он также участвует в различных мероприятиях DEFCON. В восторге от нетворкинга, он всегда стремится расширить отношения в сообществе.
Если вы хотите связаться с Энтони, вы можете написать ему в Твиттере (@RedHatAugust) или по электронной почте на RedHatAugust @ protonmail.com.
Как мы написали игру для самостоятельного взлома на C++ | Закари Кананн | SquallyGame
Я усердно работал над Squally, игрой на C++ для обучения хакерству. Однако это создает небольшую проблему: если мы хотим опубликовать игру в Steam, мы не можем заставить людей сначала загружать хакерские инструменты. Наше решение? Поместите инструменты в игру и позвольте игре взломать себя.
Это имело еще одно непредвиденное последствие. Если игра взламывает себя, то нам нужен какой-то низкоуровневый контроль над игрой — а для этого нам нужен низкоуровневый язык. C# и Unity больше не были вариантами, поэтому нам пришлось начать рассматривать некоторые варианты C++.
Мы сузили выбор до двух вариантов. Первым вариантом, который мы рассмотрели, был Unreal Engine. К сожалению, этот движок не очень хорош для 2D-игр. Кроме того, Unreal забирает 5% доходов от игры, что не имеет смысла, если не добавляет ценности. По этим причинам мы остановились на менее известном движке под названием Cocos2d-x.
Для имитации настоящих хакерских инструментов нам нужны всего две вещи. Во-первых, дизассемблер для преобразования сырого машинного кода в человекочитаемую x86-сборку (или, по крайней мере, хакеро-читаемую). Второе, что нам нужно, это ассемблер, чтобы делать обратное.
С помощью этих двух инструментов у нас фактически есть игра, которая может читать и писать собственный код. Нам просто нужно указать игре, где именно искать, что мы и рассмотрим позже.
Отмена исцеляющего заклинания в Squally путем изменения `inc` на `dec`.Конечно, позволяя пользователям переписывать код на ассемблере, пользователь может легко сломать эту игру! Но, как известно любому хакеру, сбой всего лишь часть работы.
Однако есть несколько отличных способов смягчить это. Один из вариантов — сохранить состояние программы (регистры/стек) перед взламываемой областью кода и восстановить его после выполнения, чтобы предотвратить глупые ошибки.
Для любителей пожить немного опаснее есть библиотеки для игнорирования segfault и прочих ошибок, что изрядно пугает. Это не подходит для простой jmp 0x00000000
, но это может быть хорошим началом для облегчения некоторых неизбежных разочарований начинающего программиста на ассемблере.
Теперь о мельчайших подробностях. Завершенный пример проекта находится здесь: https://github.com/Squalr/SelfHackingApp
Для достижения нашей цели мы используем три библиотеки:
AsmTK + AsmJit для сборки: https://github. com/asmjit/asmtk+ https ://github.com/asmjit/asmjit
UDIS86, дизассемблер: https://github.com/vmt/udis86
Можно было бы ожидать, что шаги будут следующими:
- Найти инструкции, которые мы хотим отредактировать
- Разобрать их на ассемблерные инструкции x86/x64 в виде строк.
- Измените эти строки и соберите их обратно в необработанные байты.
- Запишите эти байты обратно в память, перезаписав исходные инструкции
Это кажется разумным, за исключением случаев, когда мы пытаемся… программа вылетает.
При более глубоком копании оказывается, что защита страницы памяти, содержащей код, помечена как Выполнить только
. Он должен быть доступным для чтения и записи. В Windows это можно сделать с помощью функции VirtualProtect
в windows.h
. В Unix это делается через mprotect
.
Следующая проблема, которую нам нужно решить, это найти код, который мы хотим собрать и разобрать. Чтобы решить эту проблему, мы размещаем маркеры вокруг разделов, которые мы хотим взломать, как показано ниже.
Важными функциями здесь являются HACKABLE_CODE_BEGIN()
и HACKABLE_CODE_END()
блока. Они выдают небольшую последовательность бесполезных инструкций x86.
Когда у нас есть эти маркеры, мы можем взять указатель на эту функцию и искать маркеры! Все, что находится между этими маркерами, должно быть кодом, который мы хотим, чтобы пользователь мог изменить.
Для тех, кто интересуется подробностями реализации синтаксического анализа, см. класс HackableCode
в примере проекта.
Теперь, когда все технические проблемы решены, просто склеиваем все вместе! Ниже мы создали функцию с именем hackableRoutineTakeDamage().
Обратите внимание на строку здоровье = урон
. Это инструкция, которую мы собираемся модифицировать самостоятельно.
В функции runExampleHealth()
мы извлекаем сегменты, которые можно взломать, а затем исправляем код с помощью hackableCode->applyCustomCode("nop")
.