Блокировка TAB

yssimb

Новичок
Автор темы
12
0
Я написал скрипт, который по сути должен блокировать TAB, то бишь не давать его открыть. Но чет у меня не получилось, не понял как.
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");
        }
    }
    else
    {
        if (SF->getGame()->isKeyDown(192)) {
            return;
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
 
Решение
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");

            DWORD oldProtect;
            const auto patchAddr = SF->getSAMP()->getSAMPAddr() + 0x6EC86; // R1 - 0x6AD36
            VirtualProtect(reinterpret_cast<void*>(patchAddr), 2, PAGE_READWRITE, &oldProtect);
            *reinterpret_cast<uint16_t*>(patchAddr) = 0xC35E...

moreveal

Известный
Проверенный
888
579
wndproc надо хукать (в сф должна быть соответствующая функция), и там уже возврат делать, в мейнлупе ты никакого влияния не получишь, тут возврат никак не предотвращает нажатие клавиши

и насчёт числа, передаваемого в isKeyDown тож не уверен
 

whyega52

52NGG
Модератор
2,702
2,465
Можно обойтись без прямого хука вндпрока, как вариант, записать в начало функции void __thiscall CScoreboard::Enable(void) опкод выхода.
1720847806346.png

C++:
auto samp_handle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll")));
// R1: 0x6AD30
// R3: 0x6EC80
*reinterpret_cast<std::uint8_t*>(samp_handle + 0x6EC80) = 0xC3;
 
  • Bug
  • Нравится
Реакции: Digger Man52 и moreveal

moreveal

Известный
Проверенный
888
579
Можно обойтись без прямого хука вндпрока, как вариант, записать в начало функции void __thiscall CScoreboard::Enable(void) опкод выхода.
Посмотреть вложение 246196
C++:
auto samp_handle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll")));
// R1: 0x6AD30
// R3: 0x6EC81
*reinterpret_cast<std::uint8_t*>(samp_handle + 0x6EC81) = 0xC3;
да, но вопрос по сф, и плагин назван "скриптом" и т.п., я решил не грузить
 
  • Нравится
Реакции: whyega52

yssimb

Новичок
Автор темы
12
0
сф, и плагин назван "скриптом" и т.п., я решил н
Можно обойтись без прямого хука вндпрока, как вариант, записать в начало функции void __thiscall CScoreboard::Enable(void) опкод выхода.
Посмотреть вложение 246196
C++:
auto samp_handle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll")));
// R1: 0x6AD30
// R3: 0x6EC80
*reinterpret_cast<std::uint8_t*>(samp_handle + 0x6EC80) = 0xC3;
1720874562380.png

C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");
        }
    }
    else
    {
        if (SF->getGame()->isKeyPressed(192)) {
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "нет))");
            auto samp_handle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
            *reinterpret_cast<std::uint8_t*>(samp_handle + 0x6EC80) = 0xC3;
            //return;
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}

может я не так понял, но оно крашит, даже при открытии консоли сампфункса.
 
  • Bug
Реакции: AnWu

fuflexxxx

Участник
21
7
Посмотреть вложение 246261
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");
        }
    }
    else
    {
        if (SF->getGame()->isKeyPressed(192)) {
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "нет))");
            auto samp_handle = reinterpret_cast<std::uintptr_t>(GetModuleHandle("samp.dll"));
            *reinterpret_cast<std::uint8_t*>(samp_handle + 0x6EC80) = 0xC3;
            //return;
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}

может я не так понял, но оно крашит, даже при открытии консоли сампфункса.
Попробуй права доступа к памяти изменить через VirtualProtect перед записью нового значения.
 

moreveal

Известный
Проверенный
888
579
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");

            DWORD oldProtect;
            const auto patchAddr = SF->getSAMP()->getSAMPAddr() + 0x6EC86; // R1 - 0x6AD36
            VirtualProtect(reinterpret_cast<void*>(patchAddr), 2, PAGE_READWRITE, &oldProtect);
            *reinterpret_cast<uint16_t*>(patchAddr) = 0xC35E;
            VirtualProtect(reinterpret_cast<void*>(patchAddr), 2, oldProtect, nullptr);
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
 
Последнее редактирование:

yssimb

Новичок
Автор темы
12
0
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");

            DWORD oldProtect;
            const auto patchAddr = SF->getSAMP()->getSAMPAddr() + 0x6EC86; // R1 - 0x6AD36
            VirtualProtect(reinterpret_cast<void*>(patchAddr), 2, PAGE_READWRITE, &oldProtect);
            *reinterpret_cast<uint16_t*>(patchAddr) = 0xC35E;
            VirtualProtect(reinterpret_cast<void*>(patchAddr), 2, oldProtect, nullptr);
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
спасибо, заработало)