Чёрный вурдалак
Потрачен
- 15
- 11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мелочь, но всё же:Во первых ты функцию нигде не вызываешь, вот полностью рабочий код:
C++:std::string nameFolder{ "\\GTA SA My Name Folder" }; class patchNameFolder { public: patchNameFolder() { *reinterpret_cast<void**>(0x74503F) = &nameFolder[0]; } }pNF;
C++:
std::string desiredFolderName{"Example"};
void* folderNameAddress{reinterpret_cast<void*>(0x74503F)};
// Проверяем доступность страницы виртуальной памяти, в которой расположен указатель.
::MEMORY_BASIC_INFORMATION mbi{};
if (0 != ::VirtualQuery(folderNameAddress, &mbi, sizeof(mbi)) &&
mbi.State == MEM_COMMIT && (mbi.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)))
{
// На случай, если адрес памяти указателя под защитой, меняем флаг доступа.
::DWORD protectionFlagsBefore{};
if (::VirtualProtect(
folderNameAddress,
sizeof(void*),
PAGE_READWRITE,
&protectionFlagsBefore))
{
// Клонируем указатель, который находится по данному адресу.
char* folderNamePtr{nullptr};
std::memcpy(&folderNamePtr, folderNameAddress, sizeof(char*));
if (nullptr != folderNamePtr)
{
// Если указатель валиден, то записываем значение прямо в его объект, в отличие от прошлого примера.
// Метод перезаписи адреса, на кой направляет указатель, мне не очень нравится,
// ибо придётся постоянно держать в памяти объект, созданный нами для сего деяния.
// Потому делаем иначе!
std::memcpy(
folderNamePtr,
desiredFolderName.c_str(),
desiredFolderName.size());
}
}
}
Последнее редактирование: