hook char

legendabrn

Известный
Автор темы
Проверенный
120
170
1610102571184.png

1610102588187.png


C++:
namespace
{
    const auto HOOK_ADDR = 0x8A76;
    const auto HOOK_LEN = 1;

    auto __cdecl name_hook()
    {
        const char aServerClosedTh[] = "Closed";
        return aServerClosedTh;
    };
}

void installHook()
{
    auto samp = (DWORD)GetModuleHandleA("samp");
    auto relative_addr = (DWORD)&name_hook - (samp + HOOK_ADDR + HOOK_LEN);
    DWORD vp;
    VirtualProtect((void*)(samp + HOOK_ADDR), HOOK_LEN, PAGE_EXECUTE_READWRITE, &vp);
    *(DWORD*)(samp + HOOK_ADDR + 1) = relative_addr;
    VirtualProtect((void*)(samp + HOOK_ADDR), HOOK_LEN, vp, &vp);
};

в чат выводит пробел, как правильно хукать ?
 
Решение
C++:
uintptr_t sampModule = reinterpret_cast<uintptr_t>(GetModuleHandle("samp.dll"));
if (sampModule != 0) {
        char* str     = "Oh yes, server closed the connection.";
        void* address = reinterpret_cast<void*>(sampModule + 0x8A76 + 1);
        DWORD vp;
        VirtualProtect(address, sizeof(str), PAGE_EXECUTE_READWRITE, &vp);
        *reinterpret_cast<char**>(address) = str;
        VirtualProtect(address, sizeof(str), vp, &vp);
}
Важно чтобы строка оставалась в памяти, то есть твой плагин не должен быть выгружен, иначе выделяй память и копируй строку туда.

#Rin

Известный
Всефорумный модератор
1,214
1,043
C++:
uintptr_t sampModule = reinterpret_cast<uintptr_t>(GetModuleHandle("samp.dll"));
if (sampModule != 0) {
        char* str     = "Oh yes, server closed the connection.";
        void* address = reinterpret_cast<void*>(sampModule + 0x8A76 + 1);
        DWORD vp;
        VirtualProtect(address, sizeof(str), PAGE_EXECUTE_READWRITE, &vp);
        *reinterpret_cast<char**>(address) = str;
        VirtualProtect(address, sizeof(str), vp, &vp);
}
Важно чтобы строка оставалась в памяти, то есть твой плагин не должен быть выгружен, иначе выделяй память и копируй строку туда.
 
  • Нравится
Реакции: legendabrn

legendabrn

Известный
Автор темы
Проверенный
120
170
C++:
uintptr_t sampModule = reinterpret_cast<uintptr_t>(GetModuleHandle("samp.dll"));
if (sampModule != 0) {
        char* str     = "Oh yes, server closed the connection.";
        void* address = reinterpret_cast<void*>(sampModule + 0x8A76+ 1);
        DWORD vp;
        VirtualProtect(address, sizeof(str), PAGE_EXECUTE_READWRITE, &vp);
        *reinterpret_cast<char**>(address) = str;
        VirtualProtect(address, sizeof(str), vp, &vp);
}
Важно чтобы строка оставалась в памяти, то есть твой плагин не должен быть выгружен, иначе выделяй память и копируй строку туда.
Спасибо! Почему когда я меняю таким образом, то при превышение лимита символов, затрагивается другой текст?


Код:
        DWORD dwProtect = PAGE_EXECUTE_READWRITE;
        VirtualProtect(reinterpret_cast<LPVOID>((DWORD)GetModuleHandle("samp.dll") + 0x8A76), 100, dwProtect, &dwProtect);
        strcpy(reinterpret_cast<char*>((DWORD)GetModuleHandle("samp.dll") + 0x8A76), "Test123Test123Test123Test123Test123");
        VirtualProtect(reinterpret_cast<LPVOID>((DWORD)GetModuleHandle("samp.dll") + 0x8A76), 100, dwProtect, nullptr);
 

#Rin

Известный
Всефорумный модератор
1,214
1,043
Копируя свою строку по адресу расположения оригинальной строки, ты можешь задеть и соседние данные если твоя строка длиннее изначальной.
Поэтому либо копируешь туда свою строку с аналогичной длинной, а если меньше то убедится что после последнего символа будет ноль.
Либо заменяешь адреса у всех инструкций обращающих к этой строке на свою.
 
  • Нравится
Реакции: legendabrn

legendabrn

Известный
Автор темы
Проверенный
120
170
Копируя свою строку по адресу расположения оригинальной строки, ты можешь задеть и соседние данные если твоя строка длиннее изначальной.
Поэтому либо копируешь туда свою строку с аналогичной длинной, а если меньше то убедится что после последнего символа будет ноль.
Либо заменяешь адреса у всех инструкций обращающих к этой строке на свою.
А если хукнуть функцию чата, и сделать проверку на соответствующий текст, а после вызвать прототип, то не будет затрагивать соседние строчки?
 

#Rin

Известный
Всефорумный модератор
1,214
1,043
Можно сделать так, но она будет заменять и фейк сообщения (если такие будут с других плагинов и скриптов). Ну и зря тратишь процессорное время.
Что ты хочешь сделать? Тот код что я написал проблем не имеет.
 

legendabrn

Известный
Автор темы
Проверенный
120
170
Можно сделать так, но она будет заменять и фейк сообщения (если такие будут с других плагинов и скриптов). Ну и зря тратишь процессорное время.
Что ты хочешь сделать? Тот код что я написал проблем не имеет.
Я пробую разные методы, для повышения знаний 😀
Спасибо за помощь!