Другое С/С++ Вопрос - Ответ

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());
        }
    }
}
 
Последнее редактирование:

EclipsedFlow

Известный
Проверенный
1,045
476
Не отправляется пакет, использую RakHook

C++:
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');
        }
 

4el0ve4ik

Известный
Всефорумный модератор
1,550
1,343
Мелочь, но всё же:

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());
        }
    }
}
А ниче, что если имя папки будет больше оригинального - ты перезапишешь следующую строку? В моем методе эта проблема решена. На счет протекта памяти - это был всего лишь пример.
 
15
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А ниче, что если имя папки будет больше оригинального - ты перезапишешь следующую строку? В моем методе эта проблема решена. На счет протекта памяти - это был всего лишь пример.
Справедливо, my bad. В моём примере, кроме снятия защиты памяти, вместо преобразования адреса в указатель на требуемый тип, его чтения и последующей перезаписи используется стандартная сишная функция memcpy для копирования содержимого источника в буфер назначения, при использовании которой, в отличие от прошлого примера, не возникает UB, что, несомненно, можно считать плюсом.

Справедливо, my bad. В моём примере, кроме снятия защиты памяти, вместо преобразования адреса в указатель на требуемый тип, его чтения и последующей перезаписи используется стандартная сишная функция memcpy для копирования содержимого источника в буфер назначения, при использовании которой, в отличие от прошлого примера, не возникает UB, что, несомненно, можно считать плюсом.
Strict Aliasing Violations. Справедливости ради, нужно отметить, что MSVC такой класс оптимизаций не реализует.
 
Последнее редактирование:

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
подскажите пожалуйста,как сделать чтоб машина всё время крутилась?
 

Dadazik2.0

Потрачен
6
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мужики, подскажите, как сделать невидимку в авто?
 

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
парни подскажите как подключить реконект к самп апи?
 
  • Bug
Реакции: kin4stat

Rei

Известный
Друг
1,616
1,670
как сделать копию пакета параметров?
C++:
template<typename... Args>
void test(Args... args)
{
	auto copied = args...; // типа так
}
 

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
парни подскажите пожалуйста,как найти координаты всех машин в зоне стрима кроме своей.
 

imring

Ride the Lightning
Всефорумный модератор
2,361
2,546
как сделать копию пакета параметров?
C++:
template<typename... Args>
void test(Args... args)
{
    auto copied = args...; // типа так
}
через tuple можно
C++:
template<typename... Args>
std::tuple<Args...> test(Args... args) { return std::make_tuple(args...); }
или через std::vector
C++:
template<typename... Args, typename T = std::variant<Args...> /*или std::any*/>
std::vector<T> test(Args... args) { return {args...}; }
 
  • Нравится
Реакции: legendabrn и Rei

Harrington

Новичок
1
0
Здарова, почему не могу сделать русский язык в программе (Выводятся каракули). Компилятор Dev C++ 6.3
Перепробовал все возможные способы из интернета
1647533401508.png

1647533473769.png
 

Yayachana)

Известный
32
10
Здарова, почему не могу сделать русский язык в программе (Выводятся каракули). Компилятор Dev C++ 6.3
Перепробовал все возможные способы из интернета
setlocale(LC_ALL, "ru");
 

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как подключить функцию к самп апи?