20120327

Делаем трейнер на C# - часть первая.

Название говорит само за себя. :)

[Вот] и видеоурок. Довольно длинный, аж на тридцать минут, так что запаситесь чаем и бутербродами перед просмотром. В этом уроке я покажу, как создать простенький каркас, найти процесс, открыть его и записать в его память несколько байт.

Visual Studio, которая в уроке использовалась, можно скачать [вот отсюда]. А меня можно найти ещё и [вот тут].

20120321

Трейнеры на HLL.

Сейчас я малость простыл (весна же!), но скоро начну выкладывать первые видеоуроки по созданию трейнеров на HLL - Highlevel Language - языках высокого уровня. Думаю начать с C# и C++. Научимся рисовать формочки, подключать нужные нам WinAPI-функции (возможностями .NET-фреймворка я буду стараться не использовать - только чистые WinAPI), само собой - будет показан процесс отладки кода, потому что это очень полезное и увлекательное занятие.

В качестве IDE (это такая штука, где пишется код - некий навороченный блокнот) буду использовать Microsoft Visual Studio. Редакция Express бесплатна для некоммерческого использования и её можно радостно скачать с сайта этих самых Microsoft - ссылку я дам.

Подумываю о том, нужно ли выкладывать исходный код куда-нибудь помимо блога - например, на [GitHub]. Напишите в комментариях, что вам удобней будет. (:

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-функцию, задающую режим отрисовки.

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

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

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