RockHammer Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 (изменено) Написал трейнер для AS1, на бессмертие. Всё примитивно: нашел значение, посмотрел что пишет, убил инструкцию, нашёл сижки, сделал трейнер на убийство инструкции.Трейнер примитивнейший. МОжет быть я что-то намудрил? Пишу на с++, .dll формат. Upd: Нашёл баг, у меня оказывается поиск сижек уходил в никуда. Удалил всю чепуху по поводу автоматического базового адреса, сделал свой кастомный. Ну и длинну скана увеличил.Образовался новый баг... Теперь при перехвате клавиши он делате сразу два условия. Т.е. и вкл и выкл, но останавливается на выкл.Скорее всего в логике кода баг. Как доработать систему "переключателя"? Чтобы при нажатии клавиши менялась "полярность" булевой переменной и выбиралась одна из функций: либо вкл, либо выкл.#include <windows.h>#include <TlHelp32.h>#include <fcntl.h>#include <stdio.h>#include <io.h>#include "Memory.h"using namespace std;DWORD WINAPI AS_thread(LPVOID);DWORD APIENTRY DllMain(HMODULE hModule, DWORD ul_reason, LPVOID lpReserved){ if (ul_reason == DLL_PROCESS_ATTACH) { CreateThread(NULL, NULL, AS_thread, NULL, NULL, NULL); } return true;}void CreateConsole(){ int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp = 0; AllocConsole(); SetConsoleTitle("Assassin's Creed Cheat"); lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), _O_TEXT); fp = _fdopen(hConHandle, "w"); *stdout = *fp; setvbuf(stdout, NULL, _IONBF, 0);}DWORD WINAPI AS_thread(LPVOID){ DWORD pID = FindProcessByName("AssassinsCreed_Dx10.exe"); DWORD oldProtect = 0; bool switcher = false; //тут мы создаём наш переключатель DWORD addr = FindPattern(0x401000, 0x1288000, (PBYTE)"\x89\x46\x14\x7D\x33", "xxxxx"); //сижка на поиск адреса CreateConsole();// создаём консольку printf("I am Starting!"); //и пишем, что всё нормально for (;; Sleep(75)) { if (GetAsyncKeyState(VK_F1) == true) //клавиша { switcher != switcher; //меняем полярность переменной, т.е. если true - то false, если false - то true Beep(300, 500); if (switcher == false) //выключенное состояние функции, т.е. оригинальные байты { Beep(300, 500); printf("Health: OFF"); VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)addr, (PBYTE)"\x89\x46\x14\x7D\x33", 5); VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect); } else if (switcher == true) //включенное состояние, затираем нупами. { Beep(100, 500); printf("Health: ON \n Get Fun!!!"); VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)addr, (PBYTE)"0x90, 0x90, 0x90, 0x90, 0x90", 5); VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect); } } }} Изменено 18 июня, 2015 пользователем RockHammer Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 клавиши пример: http://forum.gamehacklab.ru/topic/3702-khotkej-c/ Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 июня, 2015 Автор Поделиться Опубликовано 18 июня, 2015 клавиши пример: http://forum.gamehacklab.ru/topic/3702-khotkej-c/Исправил баг! Теперь вместо смены полярности в каждой ветке условия будет меняться полярность по своему, таким образом работа с функцией более приятна.Но появился ещё один баг... Незнаю с какой это стороны... Теперь когда меня бьют - игра вылетает. Т.е. что-то не так с функцией замены байтов... Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 (изменено) базу модуля нормально получи: #include "psapi.h" MODULEINFO ModuleInfo;GetModuleInformation(GetCurrentProcess(),GetModuleHandle(0),&ModuleInfo,sizeof(ModuleInfo));DWORD addr = FindPattern(ModuleInfo.lpBaseOfDll, ModuleInfo.SizeOfImage, (PBYTE)"\x89\x46\x14\x7D\x33", "xxxxx"); или 0x1288000 это не размер? lol+ выброси FindProcessByName. юзай GetCurrentProcess Изменено 18 июня, 2015 пользователем gmz 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 19 июня, 2015 Автор Поделиться Опубликовано 19 июня, 2015 (изменено) базу модуля нормально получи: #include "psapi.h" MODULEINFO ModuleInfo;GetModuleInformation(GetCurrentProcess(),GetModuleHandle(0),&ModuleInfo,sizeof(ModuleInfo));DWORD addr = FindPattern(ModuleInfo.lpBaseOfDll, ModuleInfo.SizeOfImage, (PBYTE)"\x89\x46\x14\x7D\x33", "xxxxx"); или 0x1288000 это не размер? lol+ выброси FindProcessByName. юзай GetCurrentProcessСпасибо, очень информативно! (P.s. в следующий раз заключай код в специальный тег)P.s.s. куда в твой код втыкать свой? Т.е. условие, если клавиша нажата - то нужно выполнить запись байтов. Куда её вставлять?P.s.s.s. компилятор ругается на твой код, "Использована неинициализированная переменная KeySwitch01 && KeyStatus01"char KeySwitch01;char KeyStatus01;char Key;Key = (GetAsyncKeyState(VK_F1) >> 8);if (KeySwitch01 != Key){KeySwitch01 = (Key);if (Key){if (!KeyStatus01){KeyStatus01 = 1;} else {KeyStatus01 = 0;}}} Изменено 19 июня, 2015 пользователем RockHammer Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 19 июня, 2015 Поделиться Опубликовано 19 июня, 2015 выше DllMain:char KeySwitch01;char KeyStatus01;после "Sleep(75))" весь кусок замени:char Key;Key = (GetAsyncKeyState(VK_F1) >> 8);if (KeySwitch01 != Key){KeySwitch01 = (Key);if (Key){if (!KeyStatus01){ Beep(100, 500); printf("Health: ON \n Get Fun!!!"); VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)addr, (PBYTE)"0x90, 0x90, 0x90, 0x90, 0x90", 5); VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 1;} else { Beep(300, 500); printf("Health: OFF"); VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)addr, (PBYTE)"\x89\x46\x14\x7D\x33", 5); VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 0;}}} 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 19 июня, 2015 Автор Поделиться Опубликовано 19 июня, 2015 выше DllMain:char KeySwitch01;char KeyStatus01;после "Sleep(75))" весь кусок замени:char Key;Key = (GetAsyncKeyState(VK_F1) >> 8);if (KeySwitch01 != Key){KeySwitch01 = (Key);if (Key){if (!KeyStatus01){ Beep(100, 500); printf("Health: ON \n Get Fun!!!"); VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)addr, (PBYTE)"0x90, 0x90, 0x90, 0x90, 0x90", 5); VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 1;} else { Beep(300, 500); printf("Health: OFF"); VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)addr, (PBYTE)"\x89\x46\x14\x7D\x33", 5); VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 0;}}}Получается, только на зажатой клавише будет работать функция? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения