F0RQU1N and
Известный
- 1,310
- 495
скачай старый коммит с гитхаба и поставьможешь пожалуйста подсказать что нужно поменять
скачай старый коммит с гитхаба и поставьможешь пожалуйста подсказать что нужно поменять
всмысле а причем тут хук? ты можешь изменить название папки и без использования языков програмированния, выделив её левой кнопкой мыши на нажав "F2"Доброго времени суток.
Попытался я сам написать "хук", но после 4х часовых попыток, понял что мне это не под силу, возможно тут есть те кто сможет, буду очень признателен.
Суть:изменить название папки:GTA San Andreas User Files
Notepad++Всем добый вечер,подскажите пожалуйста как узнать координаты объекта по его айди?
А нужен "хук" по этому адресу.
мне нужно на с++ в реальном времениТы не понял суть вопроса, либо рофлишь.
При заходе в игру появится такая же папка, с тем же названием "GTA San Andreas User Files"
А нужен "хук" по этому адресу.Посмотреть вложение 138834
Notepad++
Ctrl+F
Посмотреть вложение 138832
И получаешь результат.
Посмотреть вложение 138833
Кароче, что касается вопроса изменения названия папки, то идешь по адресу 0x74503E и перезаписываешь указатель на свою строку. т.е.Ты не понял суть вопроса, либо рофлишь.
При заходе в игру появится такая же папка, с тем же названием "GTA San Andreas User Files"
А нужен "хук" по этому адресу.Посмотреть вложение 138834
Notepad++
Ctrl+F
Посмотреть вложение 138832
И получаешь результат.
Посмотреть вложение 138833
std::string nameFolder{ "\\GTA SA My Name Folder" };
*reinterpret_cast<void**>(0x74503F) = &nameFolder[0];
Во первых ты функцию нигде не вызываешь, вот полностью рабочий код:Сделал вот так, папка не появляется, подсасывает как обычно с дефолт папки.
C++:#include "pch.h" #include "string" void USER_FILES() { std::string nameFolder{ "\\GTA SA My Name Folder" }; *reinterpret_cast<void**>(0x74503F) = &nameFolder[0]; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
std::string nameFolder{ "\\GTA SA My Name Folder" };
class patchNameFolder {
public:
patchNameFolder() {
*reinterpret_cast<void**>(0x74503F) = &nameFolder[0];
}
}pNF;
Конкретно данный пример будет крашить если что.Кароче, что касается вопроса изменения названия папки, то идешь по адресу 0x74503E и перезаписываешь указатель на свою строку. т.е.
C++:std::string nameFolder{ "\\GTA SA My Name Folder" }; *reinterpret_cast<void**>(0x74503F) = &nameFolder[0];
Мелочь, но всё же:Во первых ты функцию нигде не вызываешь, вот полностью рабочий код:
C++:std::string nameFolder{ "\\GTA SA My Name Folder" }; class patchNameFolder { public: patchNameFolder() { *reinterpret_cast<void**>(0x74503F) = &nameFolder[0]; } }pNF;
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());
}
}
}
void SendVehiclePacket(unsigned __int16 vehID, CVector pos, CVector speed)
{
stInCarData data = {0};
data.sVehicleID = vehID;
data.fPosition[0] = pos.x;
data.fPosition[1] = pos.y;
data.fPosition[2] = pos.z;
data.fMoveSpeed[0] = speed.x;
data.fMoveSpeed[1] = speed.y;
data.fMoveSpeed[2] = speed.z;
data.fQuaternion[0] = 0;
data.fQuaternion[1] = 0;
data.fQuaternion[2] = 0;
data.fQuaternion[3] = 0;
data.fVehicleHealth = 1000.0f;
RakNet::BitStream bs;
bs.Write<unsigned __int8>(ID_VEHICLE_SYNC);
bs.Write((PCHAR)&data, sizeof(stInCarData));
rakhook::send(&bs, PacketPriority::HIGH_PRIORITY, PacketReliability::RELIABLE, '\000');
}
А ниче, что если имя папки будет больше оригинального - ты перезапишешь следующую строку? В моем методе эта проблема решена. На счет протекта памяти - это был всего лишь пример.Мелочь, но всё же:
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_FLAGS)) { // На случай, если адрес памяти указателя под защитой, меняем флаг доступа. ::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()); } } }
Справедливо, my bad. В моём примере, кроме снятия защиты памяти, вместо преобразования адреса в указатель на требуемый тип, его чтения и последующей перезаписи используется стандартная сишная функция memcpy для копирования содержимого источника в буфер назначения, при использовании которой, в отличие от прошлого примера, не возникает UB, что, несомненно, можно считать плюсом.А ниче, что если имя папки будет больше оригинального - ты перезапишешь следующую строку? В моем методе эта проблема решена. На счет протекта памяти - это был всего лишь пример.
Strict Aliasing Violations. Справедливости ради, нужно отметить, что MSVC такой класс оптимизаций не реализует.Справедливо, my bad. В моём примере, кроме снятия защиты памяти, вместо преобразования адреса в указатель на требуемый тип, его чтения и последующей перезаписи используется стандартная сишная функция memcpy для копирования содержимого источника в буфер назначения, при использовании которой, в отличие от прошлого примера, не возникает UB, что, несомненно, можно считать плюсом.