20120229

Трейнеры.

Пока мы радостно и упорно грызём гранит ассемблера, я попробую найти время и записать серию уроков по созданию каркаса трейнера "с нуля" на основных языках - Visual Basic, C++, C#. С Delphi у меня отношения были очень давно и очень неправда, но могу попробовать и на ней.

Из функционала - запись в память, работа с указателями. Дальше, думаю, уже разберётесь сами.

PS: Наро-од! Как там у вас дела? Отпишитесь! Не очень хочется вести блог в стол, хочется видеть результаты. Кто что курочит? Кто над чем работает? Как получается? Пишите в комментариях. :)

Небольшие, но полезные утилитки.

Может быть, уже упоминал - так что извините за повтор.

Бывает так, что игра отказывается работать в оконном режиме, запуская исключительно на весь экран. Это ни разу не удобно и часто мешает взлому.

Как с этим бороться? Есть две хороших утилиты:

1. [D3DWindower]. Открываем файл с правами администратора (правой кнопкой на .ехе - запустить с правами администратора), жмём на кнопку с плюсиком, выбираем .ехе-файл игры, жмём ок. Дальше запускаем игру двойным щелчком по названию в окне программы.

2. [3D-Analyze]. Открываем программу, жмём кнопку Select, выбираем .ехе-файл игры, дальше во вкладке Performance ставим галочку (вроде бы, самая нижняя) force windowed mode, после чего тыкаем Run.

Сразу предупрежу, что многие игры могут вести себя не совсем адекватно, будучи запущенными в окне.

Улучшаем wallhack для Quake II.

Если вдруг кому не понравился режущий глаза розовый цвет, которым заполняются стены (мне он тоже не нравится), то можно воспользоваться функцией [glClearColor].

Что она делает? Делает одну простую вещь - очищает буфер цвета. Новый цвет задаётся в аргументах, синтаксис вот такой:

glClearColor(GLclampf  red, GLclampf  green, GLclampf  blue, GLclampf  alpha)

Red, Green, Blue - цвет в формате RGB (от 0 до 255 на каждый цветовой канал, 0-0-255 - синий), alpha - прозрачность, которую мы не трогаем и всегда выставляем в 255.

В случае с квейком всё просто - открываем W32Dasm (или любимый дизассемблер), ищем текст glClearColor, находим, чуть ниже ищем махинации с регистром еах (помня, что в еах помещается указатель для вызова функции). Находим два адреса, методом тыка выясняем рабочий. Дальше изменяем наш скрипт в Cheat Engine - перед вызовом функции DrawWorld вызываем glClearColor с нужными аргументами, примерно вот так:


push 1B01 //GL_LINES
push 408 //GL_FRONT_AND_BACK
call dword ptr [10055CC4] //glPolygonMode
push 3F80 //1
push 3F40 //0.75
push 3F //0.5
push 3F80 //0
call dword ptr [100551BC] //call glClearColor
call 1000C080 //call drawworld original
push 1B02 //GL_FILL
push 408 //GL_FRONT_AND_BACK
call dword ptr [10055CC4] //glPolygonMode
ret
Аргументы запихиваем в обратном порядке (читаем про стек и работу с ним!). На С это выглядело бы примерно так:

glClearColor(0.0, 0.5, 0.75, 1);

Аргументы тут имеют тип float, так что не забываем перевести из float в hex (шестнадцатиричную систему счисления). Сделать это можно например [тут], ещё есть замечательный аналог Cheat Engine со встроенным конвертером - [TSearch].

Форум.

Всем известно, что я - резиновый и могу 400% своего времени посвящать записи уроков и ответам на вопросы интересующихся, обходясь без еды, сна и пищи. (:

Но есть очень классная штука - [форум по взлому игр], на котором обитаю в том числе и я, а помимо меня - куча очень светлых голов, гораздо более опытных и подкованных, чем я сам.

Объединившись в хайвмайнд, мы готовы отвечать на ваши вопросы и помогать в решении проблем практически 24 часа в сутки, так или иначе - с форума сообщения о проблемах никуда не  денутся, а я могу и потерять письмо, например.

Поэтому очень рекомендую зайти и хотя бы зарегистрироваться - обсуждая проблемы с другими участниками решать их гораздо проще, проверено опытом. :)

[VideoTutorial] Zoomhack.

Коротенький видеоурок, в котором показан процесс создания Zoomhack - хака, позволяющего сломать оптический прицел снайперской винтовки и приближать на бОльшее расстояние, чем это было задумано разработчиками.

[Ссылка] на урок.

[VideoTutorial] Wallhack.

А вот и [ссылочка] на урок. Теорию и подробности читаем чуть ниже.

PS: Дизассемблер, используемый в видео, можно взять [тут].

Ещё немного про блог.

Совсем забыл - чудо-дизайнеры гугла допиливают потихоньку блог, так что меня можно читать по RSS и даже смотреть архив блога - пошарьтесь в правом верхнем углу главной страницы - там будет серенькая плашка сбоку и на ней - две кнопки.

Wallhack - теория.

Где-то через час выложу урок по созданию wallhack'а - метода, позволяющего видеть врагов сквозь стены. Очень забавная штука, рекомендую посмотреть!

Видео я записал, руководствуясь одной очень старой статьёй от cppdude, демонстрируемый метод подходит для любой игры, написаной на движке Quake 2\3, возможно, и 4 тоже. Таких игр - много, так что будет на чём попрактиковаться.

Штука тут состоит в том, что есть две большие библиотеки для отрисовки графики, которые между собой конкурируют - [OpenGL] и [Direct3D]. Последняя входит в набор DirectX, который суть отвечает за графику, звук и много чего ещё в играх.

Обе технологии служат одной и той же задаче, но по-разному реализованы, так что и способы взлома для них различаются. Мы сначала попрактикуемся на OpenGL, а затем перейдём к Direct3D, потому что она более популярна сейчас.

Суть большинства воллхаков состоит в двух техниках:

1. Делаем стены прозрачными, чтобы сквозь них можно было видеть.
2. Делаем нужные вещи (модельки врагов, например) видимыми сквозь всё остальное.

В обоих случаях мы отталкиваемся от функции рисования мира - это такая специальная функция, которая в буквальном смысле рисует всё, что должно быть в данный момент на экране - стены, травку, патроны, врагов, количество здоровья и так далее. Вызывается она в цикле, поэтому нам кажется, что картинка в мониторе двигается - враги бегают, пули летят и вообще красота.

Вклинившись в эту функцию, мы, по сути, её перехватываем (по-хорошему это называется hook, но очень похоже на обычную инъекцию кода), а затем заставляем работать так, как нам нужно.

В первом случае мы заставляем рисоваться стены без текстур, вызывая специальную OpenGL-функцию, задающую режим отрисовки.

Во втором же случае мы должны найти место, когда рисуются модельки врагов (это я покажу в следующих уроках), и изменить для них буфер глубины.

Что за буфер такой, да? Всё просто. Есть три оси - верх\низ, право\лево и вперёд (от нас) \ назад (к нам). Последнюю ось можно представить как "глубже в экран - ближе к нам" - вот это вот и есть буфер глубины. Он показывает, должны ли мы видеть некоторый объект в данный момент, или мы до него ещё не добежали. Или он за стеной, например. Говорим - мы всегда должны видеть этот объект (модель врага) - и он будет рисоваться всегда, не взирая на расстояние и препятствия.

Такая вот хитрая штука. Как увидите всё это на примере - быстро поймёте.

20120226

Забыл упомянуть.

...что таки вплотную подбираемся к Direct3D и прочим графическим вкусностям! Морально готовьтесь, поначалу будет сложно. :)

Видео! Rapid-fire hack!

Товарищи, first of all, хочу извиниться за моё отсутствие - как-никак, почти два месяца без публикаций.

Но я не говорил, что это конец. Всё только начинается! :)

Смотрим очередное [видео], в котором я пытаюсь, как могу, рассказать и показать процесс создания rapid-fire хака - это когда мы стреляем из любого оружия со скоростью больше 9000 патронов в минуту.

Комментарии отписываем тут, или же на youtube. Кстати, я перешёл на HD-формат - были жалобы. ;)