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

vbg

Известный
41
17
Привет, хотел перевести на плюсы вот эту запись.
memory lua:
mem.setint8(0x969152, 1, false)

На с++ получилось что такое:
функция для записи в память:
template <typename T>
void writeMem(DWORD address, T value)
{
    DWORD oldProtect = 0;
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect);
    WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0);
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL);
}

дальше вызываю в коде:
вызов функции в коде:
unsigned char driveOnWater = 1;
writeMem<unsigned char>(0x969152, driveOnWater);

Ну и не работает кароче. Изменяю память в цикле.
 

bottom_text

Известный
673
317
Привет, хотел перевести на плюсы вот эту запись.
memory lua:
mem.setint8(0x969152, 1, false)

На с++ получилось что такое:
функция для записи в память:
template <typename T>
void writeMem(DWORD address, T value)
{
    DWORD oldProtect = 0;
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect);
    WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0);
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL);
}

дальше вызываю в коде:
вызов функции в коде:
unsigned char driveOnWater = 1;
writeMem<unsigned char>(0x969152, driveOnWater);

Ну и не работает кароче. Изменяю память в цикле.
unsigned char driveOnWater = 1;
*reinterpret_cast<unsigned char*>(0x969152) = driveOnWater;
попробуй
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,633
2,482
Привет, хотел перевести на плюсы вот эту запись.
memory lua:
mem.setint8(0x969152, 1, false)

На с++ получилось что такое:
функция для записи в память:
template <typename T>
void writeMem(DWORD address, T value)
{
    DWORD oldProtect = 0;
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect);
    WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0);
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL);
}

дальше вызываю в коде:
вызов функции в коде:
unsigned char driveOnWater = 1;
writeMem<unsigned char>(0x969152, driveOnWater);

Ну и не работает кароче. Изменяю память в цикле.
mem.setint8(0x969152, 1, false)
последний аргумент -- false, соответственно протекцию снимать не нужно.
Значит, тебе достаточно просто использовать это:
C++:
*reinterpret_cast<uint8_t*>(0x969152) = 1;
А так, если ты хочешь повторить код как на луа:
C++:
template<typename T>
void writeMem(uintptr_t address, T value, bool unprotect = false)
{
    DWORD old_protection;
    auto address_ = reinterpret_cast<void*>(address);
    if (unprotect)
        VirtualProtect(address_, sizeof(value), PAGE_EXECUTE_READWRITE, &old_protection);
    memcpy(&value, address_, sizeof(value));
    if (unprotect)
        VirtualProtect(address_, sizeof(value), old_protection, &old_protection);
}
 
Последнее редактирование:
  • Нравится
Реакции: vbg, LaRossa и legendabrn

Musaigen

abobusnik
Проверенный
1,582
1,301
последний аргумент -- false, соответственно протекцию снимать не нужно.
Значит, тебе достаточно просто использовать это:
C++:
*reinterpret_cast<uint8_t*>(0x969152) = 1;
А так, если ты хочешь повторить код как на луа:
C++:
template<typename T>
void writeMem(uintptr_t address, T value, bool unprotect = false)
{
    DWORD old_protection;
    auto address_ = reinterpret_cast<void*>(address);
    if (unprotect)
        VirtualProtect(address_, sizeof(value), PAGE_EXECUTE_READWRITE, &old_protection);
    memcpy(&value, address_, sizeof(value));
    if (unprotect)
        VirtualProtect(address_, sizeof(value), old_protection, &old_protection);
}
Ты в value записуешь байты из _address?
 
  • Bug
  • Нравится
Реакции: vbg и #Northn

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Привет, хотел перевести на плюсы вот эту запись.
memory lua:
mem.setint8(0x969152, 1, false)

На с++ получилось что такое:
функция для записи в память:
template <typename T>
void writeMem(DWORD address, T value)
{
    DWORD oldProtect = 0;
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), PAGE_EXECUTE_READWRITE, &oldProtect);
    WriteProcessMemory(GetCurrentProcess(), (void*)address, &value, sizeof(value), 0);
    VirtualProtectEx(GetCurrentProcess(), (void*)address, sizeof(value), oldProtect, NULL);
}

дальше вызываю в коде:
вызов функции в коде:
unsigned char driveOnWater = 1;
writeMem<unsigned char>(0x969152, driveOnWater);

Ну и не работает кароче. Изменяю память в цикле.
C++:
template <typename T>
void WriteMemory(std::uintptr_t address, T value, bool protect = true) {
    unsigned long oldProt;
    if (protect) VirtualProtect(reinterpret_cast<void*>(address), sizeof(T), 0x04, &oldProt);
    *reinterpret_cast<T*>(address) = value;
    if (protect) VirtualProtect(reinterpret_cast<void*>(address), sizeof(T), oldProt, &oldProt);
}
Usage:
C++:
WriteMemory(0x969152, '\x01');
 
  • Нравится
Реакции: 0xFF и vbg

Silence Scripts

Участник
25
3
Как сделать рендер объектов как на скрине в asi?

sa-mp-093-min.png
sa-mp-094-min.png
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Всем ку, у кого-то есть аналог convertGameScreenCoordsToWindowScreenCoords из lua?

C++:
constexpr auto kRwEngineScreenW = 0x00C17044;
constexpr auto kRwEngineScreenH = 0x00C17048;

constexpr auto kGameScreenW = 640.f;
constexpr auto kGameScreenH = 448.f;

Vec2 gameScreenToWindow(Vec2 point) {
    const int sx = *reinterpret_cast<int*>(kRwEngineScreenW);
    const int sy = *reinterpret_cast<int*>(kRwEngineScreenH);
  
    Vec2 result{};
    result.x = (point.x / kGameScreenW) * sx;
    result.y = (point.y / kGameScreenH) * sy;
    return result;
}
 
Последнее редактирование:
  • Нравится
Реакции: PanSeek и loganhackerdff

loganhackerdff

Известный
868
517
C++:
constexpr auto kRwEngineScreenW = 0x00C17044;
constexpr auto kRwEngineScreenH = 0x00C17048;

constexpr auto kGameScreenW = 640.f;
constexpr auto kGameScreenH = 448.f;

Vec2 gameScreenToWindow(Vec2 point) {
    const int sx = *reinterpret_cast<int*>(kRwEngineScreenW);
    const int sy = *reinterpret_cast<int*>(kRwEngineScreenH);
 
    Vec2 result{};
    result.x = (point.x / kGameScreenW) * sx;
    result.x = (point.y / kGameScreenH) * sy;
    return result;
}
id текстдравов улетают в лево вверх
C++:
                auto onScreenPos{ gameScreenToWindow({ pTextdraw->m_data.m_fX,pTextdraw->m_data.m_fY }) };

                ImGui::GetForegroundDrawList()->AddText({ onScreenPos.x ,onScreenPos.y}, 0xFFFFFFFF, tos(i));


kGameScreenW и kGameScreenH попробовал заменить, не помогли
 
Последнее редактирование:

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
id текстдравов улетают в лево вверх
C++:
                auto onScreenPos{ gameScreenToWindow({ pTextdraw->m_data.m_fX,pTextdraw->m_data.m_fY }) };

                ImGui::GetForegroundDrawList()->AddText({ onScreenPos.x ,onScreenPos.y}, 0xFFFFFFFF, tos(i));


kGameScreenW и kGameScreenH попробовал заменить, не помогли
как минимум там мой проеб в том, что result.x два раза подряд(уже исправил)