Привет, народ. Учимся писать трейнер на более менее нормальном ЯП (языке программирования) Если везде почти все исходники либо на асме (ассемблере), либо на си или си ++, то мы же будем писать на PureBasic'е, который отлично для этого годится, как я считаю. Он не такой сложный в использовании, не такой страшный в создании проектов, как студия, поэтому он мне так нравится. К тому же он не сильно уступает по возможностям тому же С++. ЯП платный, но немного погуглив можно найти и бесплатные версии. У меня версия 5.30 х32 плюс установлены пользовательские библиотеки, самая полезная это DroopyLib, она в свободном доступе, установите сами, надеюсь) Внешне похожа на простой редактор текстовых документов. Начнём с взлома самой игры) качаем игру, у меня версия 1.001 или около того, это не важно Не умеем искать значения? Да и вообще ничего не умеем? Открываем YouTube, ищем канал Михаила Ремизова aka keng с форума gamehacklab(<--на этом сайте тоже полно всяких полезных уроков) И вообще, по хорошему без знаний, которые Михаил может вам дать, сюда, и вообще в эту сферу, не лезть. Тупо потеряете время) Как итог, имеем указатель на указатель на указатель на адрес (звучит нелепо, выглядит страшно, по факту это очень полезная штука=)) Вот так выглядит (По секрету скажу, что если мы в верхней строке заменим 0 на 4, 8 или C, то получим остальные адреса ресурсов) Так, теперь сам трейнер!) Для начала трейнеру нужно найти игру, потом открыть процесс игры для записи и чтения у меня процесс игры называется battlegrounds_x1.exe Пишем такой код game_pid=GetPidProcess("battlegrounds_x1.exe") ;Получаем ID процесса по его имени If game_pid=0 ;если не удалось найти MessageBox_(#HWND_DESKTOP, "Игра не найдена!", "", #MB_ICONERROR) ;говорим, что не нашли End ;завершаем процесс трейнера EndIf Знак # означает не хэштэг, инстаграмщики, а константу) Так, идентификатор процесса есть, теперь нужно открыть его с правами на запись и чтение в его память Пишем код hProcess=OpenProcess_(#PROCESS_VM_WRITE|#PROCESS_VM_OPERATION|#PROCESS_VM_READ, #False, game_pid) ;Открываем процесс с правами на запись и чтение памяти If hProcess=0 ;если не удалось открыть MessageBox_(#HWND_DESKTOP, "Не удалось получить права на запись и чтение памяти", "", #MB_ICONERROR) ;говорим, что не открыли End ;завершаем процесс трейнера EndIf Наблюдательные заметили, что после знака ; можно писать комментарии к коду) Отлично, игру нашли, открыли с правами на запись, осталось записать. это самое важное в трейнере - правильно всё записать) Пишем (или ктрл+ц ктрл+в как прошлые два раза) такой код ReadProcessMemory_(hProcess, GetModuleHandle_(0)+$38F440, @pointer1, SizeOf(integer), @NumberOfBytesRead) ;читаем, помещаем результат в pointer1 ReadProcessMemory_(hProcess, pointer1+$FC, @pointer2, SizeOf(integer), @NumberOfBytesRead) ;читаем из pointer1+смещение FC, помещаем результат в pointer2 ReadProcessMemory_(hProcess, pointer2+$AC, @pointer3, SizeOf(integer), @NumberOfBytesRead) ;читаем из pointer2+смещение AC, помещаем результат в pointer3 Здесь знак доллара означает, что число будет записано в шестнадцатиричной системе, а знак @ означает указатель на переменную Итого, в переменной pointer3 у нас будет лежать адрес значения еды у нас в наличии Осталось записать туда нужное кол-во (к примеру 999999) food.f=999999 ;говорим, что у нас будет переменная типа float WriteProcessMemory_(hProcess, pointer3, @food, SizeOf(float), @NumberOfBytesWritten) ;записываем в память Заходим в игру, проверяем. Лично у меня всё получилось. Не сложно по аналогии сделать такие же действия и для других ресурсов, учитывая, что в памяти их адреса расположены рядом) carbon.f=999999 ;говорим, что у нас будет переменная типа float WriteProcessMemory_(hProcess, pointer3+$4, @carbon, SizeOf(float), @NumberOfBytesWritten) ;записываем в память ore.f=999999 ;говорим, что у нас будет переменная типа float WriteProcessMemory_(hProcess, pointer3+$8, @ore, SizeOf(float), @NumberOfBytesWritten) ;записываем в память nova.f=999999 ;говорим, что у нас будет переменная типа float WriteProcessMemory_(hProcess, pointer3+$C, @nova, SizeOf(float), @NumberOfBytesWritten) ;записываем в память Запускаем, проверяем, всё отлично работает и будет работать даже после перезапуска игры\системы, переустановки игры\системы. Примечание: WinAPI функции в бейсике пишутся со знаком подчёркивания после заголовка функции. На этом пока всё, в сл. раз напишем уже улучшенный вариант этого трейнера с помощью code injection. Что это такое? Бегом на канал к человеку, имя которого я указал в начале темы Всем спасибо, вопросы пишем в комменты)