Перейти к содержанию

Рекомендуемые сообщения

В общем, написал очень простенький трейнер для игры 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;
}

 

Объясните, пожалуйста, в чем может быть дело, это мой первый экспириенс. Заранее благодарю. 

Изменено пользователем KRYPTOPUNK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.