Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Растми снимает мои хуки

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
25 Мар 2021
Сообщения
10
Реакции
2
короче, проблема в том, что когда пытаюсь хукануть glOrtho и glScalef, через миллисекунд 300-400, хуки просто спадают, и есп не рисуется, возможно это связано с тем, что я использую PageGuard hook, но решил эту проблему я так
code:
Expand Collapse Copy
DWORD WINAPI rehook(LPVOID)
{
    while (true)
    {
        Sleep(25);

        PGHooker::RemoveHook(original_glOrtho_addr);
        PGHooker::RemoveHook(original_glScalef_addr);

        Sleep(25);

        PGHooker::CreateHook(original_glOrtho_addr, esp::hk_glOrtho);
        PGHooker::CreateHook(original_glScalef_addr, esp::hk_glScalef);
    }

    return 0;
}

но как-будто это костыль лютый, может кто то знает как можно это исправить?
1771235677213.png
 
короче, проблема в том, что когда пытаюсь хукануть glOrtho и glScalef, через миллисекунд 300-400, хуки просто спадают, и есп не рисуется, возможно это связано с тем, что я использую PageGuard hook, но решил эту проблему я так
code:
Expand Collapse Copy
DWORD WINAPI rehook(LPVOID)
{
    while (true)
    {
        Sleep(25);

        PGHooker::RemoveHook(original_glOrtho_addr);
        PGHooker::RemoveHook(original_glScalef_addr);

        Sleep(25);

        PGHooker::CreateHook(original_glOrtho_addr, esp::hk_glOrtho);
        PGHooker::CreateHook(original_glScalef_addr, esp::hk_glScalef);
    }

    return 0;
}

но как-будто это костыль лютый, может кто то знает как можно это исправить?Посмотреть вложение 327793
покеж хуки свои
 
покеж хуки свои
хуки спизжены с simple-esp от aurenex


code:
Expand Collapse Copy
void WINAPI esp::hk_glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
{
    PGHooker::DisableHookForOnce(original_glOrtho_addr);
    ((glOrtho_t)original_glOrtho_addr)(left, right, bottom, top, zNear, zFar);

    {
        ::std::printf("called\n");
        if (objects.empty())
        {
            ::std::printf("object empty\n");
            return;
        }

        glPushAttrib(GL_ALL_ATTRIB_BITS);

        glMatrixMode(GL_PROJECTION);
        glPushMatrix();

        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();

        glDisable(GL_TEXTURE_2D);
        glDisable(GL_CULL_FACE);
        glDisable(GL_LIGHTING);
        glDisable(GL_DEPTH_TEST);

        glEnable(GL_LINE_SMOOTH);
        glLineWidth(2.0f);

        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        for (auto &object : objects)
        {
            glm::mat4 &modelview = object.m_modelview;
            glm::mat4 &projection = object.m_projection;

            glm::vec3 translate = glm::vec3(0.0f, -1.0f, 0.0f);
            glm::vec3 scale = glm::vec3(0.5f, 1.0f, 0.5f);

            modelview = glm::translate(modelview, translate);
            modelview = glm::scale(modelview, scale);

            glMatrixMode(GL_PROJECTION);
            glLoadMatrixf(glm::value_ptr(projection));

            glMatrixMode(GL_MODELVIEW);
            glLoadMatrixf(glm::value_ptr(modelview));

            ::std::printf("draw_box\n");
            draw_box();
        }

        objects.clear();

        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();

        glMatrixMode(GL_PROJECTION);
        glPopMatrix();

        glPopAttrib();
    }
}

void WINAPI esp::hk_glScalef(GLfloat x, GLfloat y, GLfloat z)
{
    if (x == 0.9375f and y == 0.9375f and z == 0.9375f)
    {
        objects.emplace_back();
        ::std::printf("emplaced\n");
    }

    PGHooker::DisableHookForOnce(original_glScalef_addr);
    ((glScalef_t)original_glScalef_addr)(x, y, z);
}


code:
Expand Collapse Copy
void esp::install()
{   
    original_glOrtho_addr = (void *)GetProcAddress(GetModuleHandleA("opengl32.dll"), "glOrtho");
    original_glScalef_addr = (void *)GetProcAddress(GetModuleHandleA("opengl32.dll"), "glScalef");

    PGHooker::CreateHook(original_glOrtho_addr, hk_glOrtho);
    PGHooker::CreateHook(original_glScalef_addr, hk_glScalef);

    CreateThread(
        nullptr,
        0,
        rehook,
        nullptr,
        0,
        nullptr
    );
}
 
короче, проблема в том, что когда пытаюсь хукануть glOrtho и glScalef, через миллисекунд 300-400, хуки просто спадают, и есп не рисуется, возможно это связано с тем, что я использую PageGuard hook, но решил эту проблему я так
code:
Expand Collapse Copy
DWORD WINAPI rehook(LPVOID)
{
    while (true)
    {
        Sleep(25);

        PGHooker::RemoveHook(original_glOrtho_addr);
        PGHooker::RemoveHook(original_glScalef_addr);

        Sleep(25);

        PGHooker::CreateHook(original_glOrtho_addr, esp::hk_glOrtho);
        PGHooker::CreateHook(original_glScalef_addr, esp::hk_glScalef);
    }

    return 0;
}

но как-будто это костыль лютый, может кто то знает как можно это исправить?Посмотреть вложение 327793
Не знаю... Может посмотреть что снимает хуки ? 😨😨
 
тут все хуево, pageguard хуки тупо пишут свои байты прямо в начало функции, и античит или сама игра может это спалить и вернуть оригинал назад вот твои хуки и слетают через полсекунды, ты пытаешься это пофиксить, пересоздавая их каждые 25 мс это как костыль, который жрёт ресурсы и всё равно даёт лаги, потому что между снятием и установкой хука функция живёт без перехвата
чтобы не париться, юзай MinHook или что-то типа детуров — они делают jmp и не светят правкой кода так откровенно, плюс античит сложнее заметить. Или можно в VMT вписаться, но там геморрой а твой метод так себе, лучше сразу перейти на норм инструменты
Делал подобное на растми, но в итоге забил
 
Юзай MinHook или что-то типа детуров — они делают jmp и не светят правкой кода так откровенно, плюс античит сложнее заметить.
Апхахпхахп орнул, а что бля откровенно светит? page guard? Так они вообще код не должны никак трогать, minhook это самый самый простейший хук который может быть
 
Апхахпхахп орнул, а что бля откровенно светит? page guard? Так они вообще код не должны никак трогать, minhook это самый самый простейший хук который может быть
я просто посоветовал альтерантиву xD
 
что за тред приколистов

короче, проблема в том, что когда пытаюсь хукануть glOrtho и glScalef, через миллисекунд 300-400, хуки просто спадают, и есп не рисуется, возможно это связано с тем, что я использую PageGuard hook, но решил эту проблему я так
это проблема связанная с самим концептом пейджгварда. странице, в котором сидит нужный тебе адрес добавляется флаг PAGE_GUARD, который при записи/чтении/исполнении вызывает эксепшн, ядро само снимает этот флаг, а ты в обработчике исключений (ну в данном случае PGHooker это либа которую делал @nelfo57), просто перенаправляешь Rip на свой хук, не трудно догадаться, что пока в одном потоке идет обработка исключения -> другие потоки просто уже будут вызывать эту функцию без флага, нельзя такой концепт использовать на функциях, которые вызываются слишком часто, примерно такое же поведение было бы, если ты попробовал хукнуть memcpy
 
что за тред приколистов


это проблема связанная с самим концептом пейджгварда. странице, в котором сидит нужный тебе адрес добавляется флаг PAGE_GUARD, который при записи/чтении/исполнении вызывает эксепшн, ядро само снимает этот флаг, а ты в обработчике исключений (ну в данном случае PGHooker это либа которую делал @nelfo57), просто перенаправляешь Rip на свой хук, не трудно догадаться, что пока в одном потоке идет обработка исключения -> другие потоки просто уже будут вызывать эту функцию без флага, нельзя такой концепт использовать на функциях, которые вызываются слишком часто, примерно такое же поведение было бы, если ты попробовал хукнуть memcpy
Хук вполне может сниматся через VectoredExceptionHandler, не смотрел в исходники PGHooker, но будто она должна обеспечивать авто обновление Пейдж Гварда после срабатывания.

Потоки можно +- обезопасить через механизм входа / выхода в функцию, один зашёл, второй ждёт пока первый выйдет. Но даже так это не обеспечивает 100% безопасности, и есть другие факторы которые приведут к крашу, про производительность подобного подхода я молчу
 
Хук вполне может сниматся через VectoredExceptionHandler
блять он и так снимается ядром, если снят флаг == снят хук, чтобы вернуть этот флаг надо ставить синглстеп, что триггерит ЕЩЕ одно исключение

Потоки можно +- обезопасить через механизм входа / выхода в функцию, один зашёл, второй ждёт пока первый выйдет. Но даже так это не обеспечивает 100% безопасности, и есть другие факторы которые приведут к крашу
ты как опознавать это будешь? в вехе все треды заморозишь кроме своего, чтобы они подождали?
 
блять он и так снимается ядром, если снят флаг == снят хук, чтобы вернуть этот флаг надо ставить синглстеп, что триггерит ЕЩЕ одно исключение
я не это имел ввиду но ладно, ну так ядро снимает хук и библиотека отвечает за то чтобы возобновить хук после сингл степа

ты как опознавать это будешь? в вехе все треды заморозишь кроме своего, чтобы они подождали?
В хуке KiExceptionDispatcher сразу же в начале ставим временного владельца (текущий поток), пока оно работает остальные потоки которые сюда попали ожидают, обрабатываем page guard, ловим степ, оповещаем что владельца нет и делаем NtContinue. Следующий поток в ожидании становится владельцем.
У меня прокатывало такое в многопоточной среде так что не знаю
 
я не это имел ввиду но ладно, ну так ядро снимает хук и библиотека отвечает за то чтобы возобновить хук после сингл степа


В хуке KiExceptionDispatcher сразу же в начале ставим временного владельца (текущий поток), пока оно работает остальные потоки которые сюда попали ожидают, обрабатываем page guard, ловим степ, оповещаем что владельца нет и делаем NtContinue. Следующий поток в ожидании становится владельцем.
У меня прокатывало такое в многопоточной среде так что не знаю
интересно конечно, но, к твоему сожалению, вся идея с локом в KiUserExceptionDispatcher строится на твоём предположении, что все треды, вызывающие хукнутую функцию, попадут в обработчик исключений, но именно в этом и проблема - они туда не попадут никак, это очевидный рейс кондишн и сработает только если два треда практически одновременно попали на разные защищенные страницы и обработка пересеклась

у тебя будет примерно так:
1. тред №1 вызывает glOrtho -> срабатывает PAGE_GUARD -> ядро снимает флаг с пейджа -> исключение диспатчится в тред №1
2. тред №1 входит в KiUserExceptionDispatcher, ставит себя владельцем, перенаправляет RIP
3. тред №2 в этот момент тоже вызывает glOrtho, но PAGE_GUARD флага на пейдже уже нет, значит и никакого исключения не происходит, тред №2 просто выполняет оригинальную функцию напрямую
4. тред №1 завершает сингл степ, восстанавливая PAGE_GUARD

но даже если бы это и работало, это бы означало, что ты вручную должен сериализовать все потоки, проходящие через эту страницу, для рендеринговых функций это означает, что ты фактически ставишь лок на каждый вызов, представляешь чо по производительности у тебя будет?
 
представляешь чо по производительности у тебя будет?
И то верно, но новички хотят найти какой-то новый волшебный хук который избавит их от античита, и не важно как шакально это будет
 
Назад
Сверху Снизу