Изучение будет производиться на примере Online Free MM0RPG RF Online. Сию статью я представляю вашему вниманию для ознакомительных целей, так как большинство людей пользуются чит-программами(алсо - читы, трейнеры, патчи), но подавляющие большинство не понимают как это устроено и почему оно работает... Руководство не рассчитано на школоту и паразитов, по-этому вам понадобятся некоторые знания, а именно: Знания языков программирования, а именно Delphi (т.к. писать такие программы на C++ - верх извращения) или активное использование g00gl'a (если есть голова на плечах) Знать, что такое редактирование памяти игр через ArtMoney/CE (или курить мануалы на RU для первого и на ENG для второго) Знать, что такое 16-ричная система и уметь переводить между системами Немного теории: Чит-программы/трейнеры – это программы, которые позволяют использовать баг более адекватно и быстро(те же хоткеи). В природе известны таких видов как: Пакетные(использование TCP/IP пакетов для отправки на сервер или клиент модифицированных данных(Wpe pro, WPF) Memory-edit баги(модификация значений в памяти клиента), Файловые баги(модификация файлов клиента) Текстурные баги(в нашей подопытной игре их более чем тонны) Баги игрового клиента Читающие, надеюсь, люди не глупые и разжевывать ничего не надо. Нас интересуют только Memory баги. Точнее я бы сказал это не баги, это тупо изменение памяти клиента в корыстных целях Копипаста: На этом, пожалуй, закончим теорию... теории в интернете тьма... пользуйтесь на здоровье Практика: Рассмотрим написание чит программы на примере всем известного “SpeedHack”. Как использовать “SpeedHack” через ArtMoney я расскажу вкратце так это руководство не по поиску багов а по написанию программ с их применением. Дам несколько советов по поиску значения скорости, так как в игре скорость является дробью, то тип значения выбираем с точкой. Размерность выбираем 4 байта, так как большинство значений в современных играх 4-х байтные (за некоторым исключением). Указав такие условия поиска, мы значительно его сократим. Затем устанавливаем значение поиска равное значению в игре, выполняем поиск. Заходим в игру, одеваем оружие на бег и отсеиваем новое значение. И так пока не останется одно значение. Добавляем его в таблицу и видим адрес этого значения в памяти (для использования “SpeedHack’а”, нужно установить желаемое значение и “заморозить” его). Допустим оно у нас равно 0134EA80. Но так ига использует DMA, просто адрес нас не устроит, так как при следующем входе в игру он изменится. Поэтому мы будем искать указатель на этот адрес, который как говорилось выше не изменяется. Как искать указатели я тут рассказывать тоже не буду, так как статья не об этом (читайте руководство пользователя ArtMoney). После поиска указателя он оказался равным 00D1B4F0 а смешение адреса в котором находится значение скорости равно 2356. Важно отметить, что указатель в ArtMoney указывается в шестнадцатеричной системе счисления, а смещение в десятичной. Ну да ладно, что же нам теперь делать с найденными значениями. А вот теперь-то мы и будем писать программу, которая по этим значениям будет модифицировать память игрового клиента. Создадим новый проект в Delphi и разместим на форме элементы: Label, SpinEdit, Button, Timer всех по одному. Label будет содержать просто информацию, в SpinEdit будем задавать желаемое значение скорости, Timer будет осуществлять функцию “заморозки” (каждые 100 миллисекунд он будет обновлять наше значение), Button будет активировать/деактивировать Timer(“SpeedHack”). Для работы с памятью игры мы будем использовать следующие API функции Windows: Подробное описание функций и значения их параметров я приводить не буду, кого заинтересует, могут посмотреть MSDN. Основными функциями записи и чтения из памяти являются: ReadProcessMemory и WriteProcessMemory. Ну вот собственно исходный код таймера который изменяет значение по найденному выше указателю: Code: procedure TForm1.Timer1Timer(Sender: TObject); var speed : single; //Это значение скорости hWin: hWnd; ProcId: Cardinal; hProc: THandle; NBW: Cardinal; Adress: dword; //сюда прочитаем адрес из указателя. readwrite: cardinal; begin hWin := FindWindow(nil, WindowTitle); if hWin = 0 then begin Timer1.Enabled := False; Button1.Caption := 'Включить SpeedHack'; exit; end; //Проверяем запущена ли игра если нет то выключаем "SpeedHack" speed := SpinEdit1.Value; GetWindowThreadProcessId(hWin, @ProcId); hProc := OpenProcess(Process_All_Access, False, ProcId); ReadProcessMemory(hProc, ptr($00D1B4F0), @Adress, 4, readwrite); //Читаем адрес из указателя Adress := Adress + 2356; //Прибавляем к адресу смещение нашего значения WriteProcessMemory(hProc, ptr(Adress), @speed, 4, NBW); //Записываем желаемое значение по полученному адресу CloseHandle(hProc); end; Как оказалось все те так уж страшно, как было на первый взгляд. И если вдумчиво прочитать статью, думаю практически любой, хоть немного разбирающийся в программировании человек сможет написать подобную программу. Руководство было написано моим другом "Тигрь" Я лишь немного переработал И от себя еще добавлю, что любой memory чит выполняется в таком же духе. Я писал под эту игру Wallhack, FlyHack, ChatHAck и прочие интересные вещи. Если потом будет время, дополню руководство реализацией FlyHack(там немного подругому надо обращаться к памяти) Всем успехов в начинаниях
TikTik, та статья про модифицирование пакетов в играх В моих планах есть пункт - написать руководство по кодингу программы, которая будет отсылать произвольные пакеты указанные юзером
Лучше напиши про обход защит типа lame/gameguard'a, фроста; пакетхак в условиях шифрования трафика клиент<->сервер и т.д. Что-нибудь по-интереснее)
В таймер нужно вносить непосредственно только WriteProcessMemory, дабы не совершать дальшейших бесмысленных попыток открыть процесс. Трейнеры построенные на данном примере - очередной шлак, который в некоторых случаях будет все время фатально завершаться. Это критика в адрес того, что это писал. Лучше учите оптимицию ПО, полезней будет.
FQziT, чем вам так не нравится фрост?) делаете процесс игры видимым(фрост его скрывает) и выполняете любые операции над памятью клиента. Обход пакетной шифрации фроста пока никому не удался. Да и если получится, то иннова и прочие проекты тут же обновятся. Derec, в этой статье лишь описан пример. Как именно вы будете его реализовывать - это ваше дело Тут таймер используется для "заморозки" значения, хотя да, признаюсь, я бы использовал в таймере только запись.