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

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

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

×
×
  • Создать...

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

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