Неправильно суммируются оффсеты

Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
Суть такая, пишу трейнер для AssaultCube на C++. Написал на изменение здоровья, всё работает. Начал писать на изменение количества патрон и положения игрока в воздухе и тут начались проблемы. Посмотрел через отладчик, у меня при сложении адресов с оффсетами выходят не те значения, код на патроны и положение игрока идентичный с хп и по идее всё должно работать, но ничего не выходит. Получил базовый адрес, сложил со статическим адресом( в моём случае "ac_client.exe"+0010F418), получился нормальный адрес, но когда начал уже складывать его с оффсетами, то пошла какая-то каша из цифры вместо адреса. В чём может быть вся проблема?
Если что, то хп и патроны 4 байтовые, а положение float
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,992
Реакции[?]
1,274
Поинты[?]
4K
Добрый день, предоставьте код в С++, а также поинтеры значений. Меняются ли значения при перезаходе в игру? Работают ли ваши поинтеры в самом CE?
 
Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
Добрый день, предоставьте код в С++, а также поинтеры значений. Меняются ли значения при перезаходе в игру? Работают ли ваши поинтеры в самом CE?
Позиция игрока

DWORD HeightPlayer()
{
uintptr_t process_id = get_process_id(L"ac_client.exe");
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_id);

uintptr_t module_base = get_module_base_address(process_id, L"ac_client.exe");
std::cout << "0x" << std::hex << module_base << std::endl;

uintptr_t base_address = module_base + 0x0004282C;
std::cout << "0x" << std::hex << base_address << std::endl;

uintptr_t end_address = 0;

ReadProcessMemory(hProcess, (BYTE*)base_address, &end_address, sizeof(end_address), nullptr);
std::cout << "0x" << std::hex << end_address<< std::endl;

end_address = end_address + 0x58;
std::cout << "0x" << std::hex << end_address << std::endl;
end_address = end_address + 0x1D8;
std::cout << "0x" << std::hex << end_address << std::endl;
end_address = end_address + 0x48;
std::cout << "0x" << std::hex << end_address << std::endl;
end_address = end_address + 0x1C8;
std::cout << "0x" << std::hex << end_address << std::endl;
end_address = end_address + 0x70;
std::cout << "0x" << std::hex << end_address << std::endl;
end_address = end_address + 0x3C;
std::cout << "0x" << std::hex << end_address << std::endl;

float height = 100.0;

WriteProcessMemory(hProcess, (BYTE*)end_address, &height, sizeof(height), nullptr);
return 0;
}

(Если что, то cout использовал для проверки правильности адресов)

Получения процесса и базового адреса

uintptr_t get_process_id(const wchar_t* process_name)
{
uintptr_t process_id = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32W procEntry;
procEntry.dwSize = sizeof(procEntry);

while (Process32NextW(hSnap, &procEntry))
{
if (!_wcsicmp(procEntry.szExeFile, process_name))
{
process_id = (uintptr_t)procEntry.th32ProcessID;
break;
}
}
}
CloseHandle(hSnap);
return process_id;
}

uintptr_t get_module_base_address(uintptr_t process_id, const wchar_t* module_name)
{
uintptr_t modBaseAddr = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, process_id);
if (hSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32W modEntry;
modEntry.dwSize = sizeof(modEntry);
while (Module32NextW(hSnap, &modEntry))
{
if (!_wcsicmp(modEntry.szModule, module_name))
{
modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
break;
}
}
}
CloseHandle(hSnap);
return modBaseAddr;
}


Указателей в CE 38, несколько раз перезапускал игру и значение показывало правильное. В фото прикреплю несколько таких указателей. В коде все оффсеты подставишь для проверки
 

Вложения

Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
Зачем вы плюсуете оффсеты к конечному адресу?
Там базовый адрес суммируется со статическим. Но полученный данным образом адрес не является адресом с нужным мне значением. Чтобы получить нужный адрес по логике надо прибавить оффсеты(так работает код для изменения хп, причем работает без ошибок и в самом CE написано сложение этих оффсетов с адресом, который получился ранее). На фото красным выделен адрес, который получился от сложения базового и статического, а желтым уже конечный со значением




Screenshot_47.png
Если нужен код с хп, то могу скинуть, чтобы было видно суммирование с оффсетом
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
В общем, пишу уже сегодня. Вдруг кто сюда заглянет с такой же проблемой. Топик xLamantine хороший и большинству наверное поможет, но лично мне не помог. У меня игра 32 битная и думал может из-за этого проблемы(она была в x64 и тк указатель на хп был с одним оффсетом, всё работало ок), сменил проект на x86 и по идее должно было всё работать, но по итогу не заработало. Мне лишь помог один способ, после каждого суммирования оффсетов я читал память игры таким вот образом: ReadProcessMemory(hProcess, (BYTE*)end_address, &end_address, sizeof(end_address), nullptr);
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,992
Реакции[?]
1,274
Поинты[?]
4K
В общем, пишу уже сегодня. Вдруг кто сюда заглянет с такой же проблемой. Топик xLamantine хороший и большинству наверное поможет, но лично мне не помог. У меня игра 32 битная и думал может из-за этого проблемы(она была в x64 и тк указатель на хп был с одним оффсетом, всё работало ок), сменил проект на x86 и по идее должно было всё работать, но по итогу не заработало. Мне лишь помог один способ, после каждого суммирования оффсетов я читал память игры таким вот образом: ReadProcessMemory(hProcess, (BYTE*)end_address, &end_address, sizeof(end_address), nullptr);
А Вы не думали, что поинтер неверный?
 
Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
А Вы не думали, что поинтер неверный?
Были мысли поэтому поводу, но как только не пытался сузить количество указателей, так всё равно многовато выходило. Взял те, которые были. Может быть в этом и есть причина конечно, но в создании читов я новичек и стараюсь пока что сделать так, чтобы работало
 
Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2020
Сообщения
14
Реакции[?]
2
Поинты[?]
0
Были мысли поэтому поводу, но как только не пытался сузить количество указателей, так всё равно многовато выходило. Взял те, которые были. Может быть в этом и есть причина конечно, но в создании читов я новичек и стараюсь пока что сделать так, чтобы работало
Сейчас нужно было найти указатель на другой адрес. Нашёл указатель с одним оффсетом и всё работает, так что тут уж наверняка проблема в указателях
 
Сверху Снизу