KRYPTOPUNK Опубликовано 6 декабря, 2019 Поделиться Опубликовано 6 декабря, 2019 (изменено) В общем, написал очень простенький трейнер для игры Mount&Blade:Warband, который меняет лишь одно значение по нажатию клавиши. Всё работало замечательно, но пока я делал визуальное оформление, что-то пошло не так. В один из моментов программа перестала читать значение, точнее, попадало не на тот адрес, ID процесса достает верно, но, базовый адрес процесса скорее всего получает не верно, хотя я в этом уверен не до конца. функция нахождения базового адреса: Спойлер uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName) { uintptr_t modBaseAddr = 0; HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId); if (hSnap != INVALID_HANDLE_VALUE) { MODULEENTRY32 modEntry; modEntry.dwSize = sizeof(modEntry); if (Module32First(hSnap, &modEntry)) { do { if (!_wcsicmp(modEntry.szModule, modName)) { modBaseAddr = (uintptr_t)modEntry.modBaseAddr; break; } } while (Module32Next(hSnap, &modEntry)); } } CloseHandle(hSnap); return modBaseAddr; } через std::cout узнал, что эта функция выдает один и тот же адрес, что, в принципе, и должно быть, но почему-то он не подходит. В процессе отладки этой программы сам Mount&Blade я перезапускал несколько раз, и вот, в один из этих моментов всё перестало работать. Почему, не приложу ума. Замечу, что в CE эти указатели и смещения до сих пор актуальны и работают. основной код: Спойлер int main() { DWORD procId = GetProcID(L"mb_warband.exe"); // достаем ид процесса std::cout << procId << std::endl; if (procId == NULL) { // обработка отсутствия процесса std::cout << "ERROR(-1): GAME NOT RUNNING"; Sleep(3000); exit(-1); } uintptr_t moduleBase = GetModuleBaseAddress(procId, L"mb_warband.exe"); // достаем адрес базового модуля std::cout << moduleBase << std::endl; HANDLE hProcess = 0; // инициализируем хендл uintptr_t dynamicPtrBaseAddr = moduleBase + 0x004B2F38; // считаем динамический адрес модуля std::cout << "DynamicPtrBaseAddr = " << "0x" << std::hex << dynamicPtrBaseAddr << std::endl; // выводим адрес на экран std::vector<unsigned int> moneyOffsets = { 0x140F0, 0x05D0 }; // создаем вектор со смещениями uintptr_t moneyAddr = FIndDMAAddy(hProcess, dynamicPtrBaseAddr, moneyOffsets);// ищем динамический адрес std::cout << "MoneyAddr = " << "0x" << std::hex << moneyAddr << std::endl;// выводим адрес и значение //std::cout << "Current Money = " << std::dec << moneyValue << std::endl;// выводим это значение на экран int newMoneyValue = 800;// переменная для нового значения int moneyValue = 0;// инициализируем переменную для значения денег std::cout << "Current Money = " << std::dec << moneyValue << std::endl;// выводим это значение на экран ReadProcessMemory(hProcess, (BYTE*)moneyAddr, &moneyValue, sizeof(moneyValue), nullptr);// читаем из адреса процесса значение и записываем в переменную //std::cout << "Please, set value of money you want:" << std::endl; // просим ввести значение //std::cin >> newMoneyValue; // пользователь вводит значение WriteProcessMemory(hProcess, (BYTE*)moneyAddr, &newMoneyValue, sizeof(newMoneyValue), nullptr);// пишем новое значение ReadProcessMemory(hProcess, (BYTE*)moneyAddr, &moneyValue, sizeof(moneyValue), nullptr);// читаем новое значение std::cout << "New Money = " << std::dec << moneyValue << std::endl;// выводим новое значение на экран getchar(); // return 0; } Объясните, пожалуйста, в чем может быть дело, это мой первый экспириенс. Заранее благодарю. Изменено 6 декабря, 2019 пользователем KRYPTOPUNK Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения