Тема не для новичков. Я буду писать интернал чит на Vusial Studio 2015/Vusial C++. (После перезапуска игры нужно будет найти значение, но только одно, позже увидите) Так как у нас интернал чит, т.е его нужно будет внедрять, то мы будем писать DLL. Программы, которые понадобятся: Visual Studio (либо компилятор C++) Cheat Engine Process Hacker (Для внедрения DLL, так как инжектор я писать еще не научился ) Ну и конечно же сама игра AssaultCube. ( https://assault.cubers.net/ ) И так приступим. 1. Создаем новый проект в VS. Visual C++ -> Win32 Project -> Next -> Ставим галочку на DLL -> Finish. https://prnt.sc/inz6sj 2. Удаляем все файлы исходного/заголовочного кода и в файле dllmain.cpp добавляем #include <Windows.h> Код #include <Windows.h> Так как без этого не будут работать некоторые типы данных и некоторые дефайны. 3. Пишем вызов потока После #include <Windows.h> Код #include <Windows.h> пишем DWORD WINAPI MainTHREAD(LPVOID); Код DWORD WINAPI MainTHREAD(LPVOID); Это функция - поток, мы ее будем вызывать. После первого кейса (После события инжекта в процесс) нужно её вызвать. Это делаем такой строчкой кода: CreateThread(0, 0, MainTHREAD, 0, 0, 0); Код CreateThread(0, 0, MainTHREAD, 0, 0, 0); До создания потока, я выведу MessageBox с повествованием о успешном инжекте. MessageBox(0, L"Injected!", L"Succsessfully!", 0); Код MessageBox(0, L"Injected!", L"Succsessfully!", 0); И того у нас получается так: case DLL_PROCESS_ATTACH: MessageBox(0, L"Injected!", L"Succsessfully!", 0); CreateThread(0, 0, MainTHREAD, 0, 0, 0); Код case DLL_PROCESS_ATTACH: MessageBox(0, L"Injected!", L"Succsessfully!", 0); CreateThread(0, 0, MainTHREAD, 0, 0, 0); 4. Пишем ф-цию потока. Наш поток должен что-то делать, а это значит, что мы должны написать функцию. DWORD WINAPI MainTHREAD(LPVOID) { while (true) { Sleep(70); if (GetAsyncKeyState(VK_INSERT) & 1) { //Что-то будет происходить по нажатию кнопки INSERT } } } Код DWORD WINAPI MainTHREAD(LPVOID) { while (true) { Sleep(70); if (GetAsyncKeyState(VK_INSERT) & 1) { //Что-то будет происходить по нажатию кнопки INSERT } } } 5. Пишем читерские функции и ищем адреса Как вы поняли из кода по кнопке INSERT будет выполняться какое-то действие. Этим действием будет увеличение жизней и бронижелета до одного миллиона. Так как я за инкапсуляцию я сделаю еще один заголовочный файл и .cpp. Думаю как их создовать вопросов не должно возникнуть. Заголовочный файл - Funcs.h Cpp файл - Funcs.cpp Так же я создам заголовочный и .cpp файл для оффсетов и адресов. Заголовочный файл - offsets.h Cpp файл - offsets.cpp Для написания наших не легальных читерских ф-ций нам нужны адреса и смещения (оффсеты - смещения). Давайте их найдем. Запускаем AssaultCube и CE (CE - Cheat Engine) В CE находим процесс ac_client Ищем адрес наших жизней. Думаю знаете, как это делать, да и полно гайдов. И так, я нашел адрес моих жизней - это 0x027DA728 Но как же нам найти адрес брони не подбирая значения? Никак. Ищем броню тоже. И так, я нашел адрес моей брони- это 0x027DA72C ( https://ibb.co/nqJMNn ) Но эти адреса одноразовые, нужно найти адрес от которого можно будет отталкиваться. Выбираем HP (в CE) и жмем F5 -> Yes. В инструкции нам показали оффсет это F8. Открою секрет для брони оффсет это FC. Жмем в инструкции на любой из адресов и жмем "More Info" И копируем адрес ( https://ibb.co/ne4p8S ) Если к данному адресу прибавить смещение, то получатся наши жизни/броня. Код файла offsets.h: #include <Windows.h> extern unsigned __int64 Base; struct offsets { unsigned __int64 armor_offset = 0xFC; unsigned __int64 hp_offset = 0xF8; }; extern offsets offset; extern DWORD protection; //Защита extern unsigned __int64 armor; //Броня extern unsigned __int64 hp; //HP Код #include <Windows.h> extern unsigned __int64 Base; struct offsets { unsigned __int64 armor_offset = 0xFC; unsigned __int64 hp_offset = 0xF8; }; extern offsets offset; extern DWORD protection; //Защита extern unsigned __int64 armor; //Броня extern unsigned __int64 hp; //HP И код файла offsets.cpp: #include <Windows.h> unsigned __int64 Base = 0x027DA630; struct offsets { unsigned __int64 armor_offset = 0xFC; unsigned __int64 hp_offset = 0xF8; }; offsets offset; DWORD protection = 0; //Защита unsigned __int64 armor = Base + offset.armor_offset; //Броня unsigned __int64 hp = Base + offset.hp_offset; //HP Код #include <Windows.h> unsigned __int64 Base = 0x027DA630; struct offsets { unsigned __int64 armor_offset = 0xFC; unsigned __int64 hp_offset = 0xF8; }; offsets offset; DWORD protection = 0; //Защита unsigned __int64 armor = Base + offset.armor_offset; //Броня unsigned __int64 hp = Base + offset.hp_offset; //HP Наверняка у вас возник вопрос, зачем нужна эта переменная: DWORD protection = 0; Код DWORD protection = 0; Это переменная защиты процесса, если ее не поставить обратно после изменения, в нашем случае накрутки критерий нашего персонажа, то программа может просто напросто вылететь. Приступим к написанию ф-ций: Код файла Funcs.h: #include <Windows.h> #define windowname L"AssaultCube" using namespace std; void vPlusV(); //Эта ф-ция прибавляет миллион void set(); //Эта ф-ция устанавливает значения на миллион Код #include <Windows.h> #define windowname L"AssaultCube" using namespace std; void vPlusV(); //Эта ф-ция прибавляет миллион void set(); //Эта ф-ция устанавливает значения на миллион Код файла Funcs.cpp: #include <Windows.h> #include "offsets.h" #include "Funcs.h" HWND hwnd_FW = FindWindow(0, windowname); void set() { VirtualProtect((void*)hp, 4, PAGE_EXECUTE_READWRITE, &protection); // HP //Снимаем защиту *(int*)hp = 1000000; //Устанавливаем значение VirtualProtect((void*)hp, 4, protection, &protection); //Возвращаем защиту VirtualProtect((void*)armor, 4, PAGE_EXECUTE_READWRITE, &protection); // Armor *(int*)armor = 1000000; VirtualProtect((void*)armor, 4, protection, &protection); } void vPlusV() { VirtualProtect((void*)hp, 4, PAGE_EXECUTE_READWRITE, &protection); // HP //Снимаем защиту *(int*)hp += 1000000; //Прибавляем VirtualProtect((void*)hp, 4, protection, &protection); //Возвращаем защиту VirtualProtect((void*)armor, 4, PAGE_EXECUTE_READWRITE, &protection); // Armor *(int*)armor += 1000000; VirtualProtect((void*)armor, 4, protection, &protection); } Код #include <Windows.h> #include "offsets.h" #include "Funcs.h" HWND hwnd_FW = FindWindow(0, windowname); void set() { VirtualProtect((void*)hp, 4, PAGE_EXECUTE_READWRITE, &protection); // HP //Снимаем защиту *(int*)hp = 1000000; //Устанавливаем значение VirtualProtect((void*)hp, 4, protection, &protection); //Возвращаем защиту VirtualProtect((void*)armor, 4, PAGE_EXECUTE_READWRITE, &protection); // Armor *(int*)armor = 1000000; VirtualProtect((void*)armor, 4, protection, &protection); } void vPlusV() { VirtualProtect((void*)hp, 4, PAGE_EXECUTE_READWRITE, &protection); // HP //Снимаем защиту *(int*)hp += 1000000; //Прибавляем VirtualProtect((void*)hp, 4, protection, &protection); //Возвращаем защиту VirtualProtect((void*)armor, 4, PAGE_EXECUTE_READWRITE, &protection); // Armor *(int*)armor += 1000000; VirtualProtect((void*)armor, 4, protection, &protection); } Собственно все. Я немного модифицировал код, теперь при нажатии на INSERT прибавляется значение, при нажатии на END устанавливается. Проверяем! Параметр компиляции: x86 INSERT - https://ibb.co/fZS1oS END - https://ibb.co/igbSTS #МояСтатья #МногоБукв
У меня навернулись слезы))) Помнится мне была такая игра Fonline, так я там дох с завидным постоянством. Да и **** вещей при смерти заставлял начинать с чистого листа, точнее с пижамы... Ну прикинь после каждой смерти - ты новорег))) Слава богу исходники игры были открыты. Можно было дебажить и радоваться жизни.