Вопрос HackMe, hook функции

niklive

Активный
Сообщения
158
Реакции
13
Я создал прогу, чтобы по тренироваться хукать функцию.

Посмотрев видео на ютубе до меня всё равно не допёрло как это делать.

Буду очень рад, если сможете подсказать как хукнуть функцию(через CE)




Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться



P.S. Если прогу скачаете, нужно нажать кнопку F1, чтобы вывести MessageBoxA

29.07.2022 9:45 AM REDACTED
 
Последнее редактирование:

Darwin

Команда форума
Администратор
Сообщения
815
Реакции
389
Позвони этой функций
 

dra1S

Следопыт
Сообщения
59
Реакции
8
Мне кажется ты что то не так написал в теме. Вопрос был задан не коректно
 

niklive

Активный
Сообщения
158
Реакции
13
Смеяться над тем, у кого не получается что-то сделать, да и к тому же неправильно описал ситуацию(понял в процессе чтения насмешек) - очень умно с вашей стороны. Вместо глупостей которые вы написали, лучше бы помогли. А если и сами не знаете как это работает, тогда лучше промолчите и не позорьтесь
 

Darwin

Команда форума
Администратор
Сообщения
815
Реакции
389
Смеяться над тем, у кого не получается что-то сделать, да и к тому же неправильно описал ситуацию(понял в процессе чтения насмешек) - очень умно с вашей стороны. Вместо глупостей которые вы написали, лучше бы помогли. А если и сами не знаете как это работает, тогда лучше промолчите и не позорьтесь
Позвони функций (call) либо прыгни в нее (jmp) и MSGBOX высветится
 

$1and1

Активный
Сообщения
275
Реакции
41
Я через CE выделяю память и инжекчу в неё call или jmp на функцию
MinHook(

Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться

) прост в использовании! Он поддерживает и х86 и х64(у меня проблем ка была, архитектура х64 не поддерживает _asm
 

honorbuddy

Активный
Сообщения
138
Реакции
17
Краткий гайд

Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться


Далее к коду:
вам понадобится PatternScan и MinHook
минхук сами найдёте думаю и без меня
а паттернскан дам, просто подключите заголовок там где хукать собираетесь
Pattenscan.h
Код:
#include <Windows.h>
#include <vector>
uintptr_t PatternScan(uintptr_t moduleAdress, const char* signature)
{
    static auto patternToByte = [](const char* pattern)
    {
        auto       bytes = std::vector<int>{};
        const auto start = const_cast<char*>(pattern);
        const auto end = const_cast<char*>(pattern) + strlen(pattern);

        for (auto current = start; current < end; ++current)
        {
            if (*current == '?')
            {
                ++current;
                bytes.push_back(-1);
            }
            else { bytes.push_back(strtoul(current, &current, 16)); }
        }
        return bytes;
    };

    const auto dosHeader = (PIMAGE_DOS_HEADER)moduleAdress;
    const auto ntHeaders = (PIMAGE_NT_HEADERS)((std::uint8_t*)moduleAdress + dosHeader->e_lfanew);

    const auto sizeOfImage = ntHeaders->OptionalHeader.SizeOfImage;
    auto       patternBytes = patternToByte(signature);
    const auto scanBytes = reinterpret_cast<std::uint8_t*>(moduleAdress);

    const auto s = patternBytes.size( );
    const auto d = patternBytes.data( );

    for (auto i = 0ul; i < sizeOfImage - s; ++i)
    {
        bool found = true;
        for (auto j = 0ul; j < s; ++j)
        {
            if (scanBytes[i + j] != d[j] && d[j] != -1)
            {
                found = false;
                break;
            }
        }
        if (found) { return reinterpret_cast<uintptr_t>(&scanBytes[i]); }
    }
    return NULL;
}


Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться


код:
C++:
void(*OGetMessageBox) = nullptr;
void GetMessageBox()
{
    while (true)
    {
        std::cout << "\n HOOKED";
    }
}

Сам хук

Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться



Он должен вызываться в DllMain при DLL_PROCESS_ATTACH там же где обычно вызывается MainThread
если у вас будет поток то его только после хука

Код хука

C++:
        uintptr_t GetMBox = PatternScan((uintptr_t)GetModuleHandleA(NULL), "FF 15 ? ? ? ? EB D6");
        if (!GetMBox) return FALSE;


        if (MH_Initialize() != MH_STATUS::MH_OK) return FALSE;

        if (MH_CreateHook(reinterpret_cast<LPVOID>(GetMBox), GetMessageBox, reinterpret_cast<LPVOID*>(&OGetMessageBox)) != MH_STATUS::MH_OK) return FALSE;

        if (MH_EnableHook(reinterpret_cast<LPVOID>(GetMBox)) != MH_STATUS::MH_OK) return FALSE;

Как то так ) Я мог бы сделать отдельный тред, но мне лень
 

$1and1

Активный
Сообщения
275
Реакции
41
Ради интереса хукнул твой мессаджбокс и вывел вместо него надпись HOOKED

Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться


То что потом прога отъехала , это не важно)
ну вопрос был же в хуке функции?
 

niklive

Активный
Сообщения
158
Реакции
13
Краткий гайд

Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться


Далее к коду:
вам понадобится PatternScan и MinHook
минхук сами найдёте думаю и без меня
а паттернскан дам, просто подключите заголовок там где хукать собираетесь
Pattenscan.h
Код:
#include <Windows.h>
#include <vector>
uintptr_t PatternScan(uintptr_t moduleAdress, const char* signature)
{
    static auto patternToByte = [](const char* pattern)
    {
        auto       bytes = std::vector<int>{};
        const auto start = const_cast<char*>(pattern);
        const auto end = const_cast<char*>(pattern) + strlen(pattern);

        for (auto current = start; current < end; ++current)
        {
            if (*current == '?')
            {
                ++current;
                bytes.push_back(-1);
            }
            else { bytes.push_back(strtoul(current, &current, 16)); }
        }
        return bytes;
    };

    const auto dosHeader = (PIMAGE_DOS_HEADER)moduleAdress;
    const auto ntHeaders = (PIMAGE_NT_HEADERS)((std::uint8_t*)moduleAdress + dosHeader->e_lfanew);

    const auto sizeOfImage = ntHeaders->OptionalHeader.SizeOfImage;
    auto       patternBytes = patternToByte(signature);
    const auto scanBytes = reinterpret_cast<std::uint8_t*>(moduleAdress);

    const auto s = patternBytes.size( );
    const auto d = patternBytes.data( );

    for (auto i = 0ul; i < sizeOfImage - s; ++i)
    {
        bool found = true;
        for (auto j = 0ul; j < s; ++j)
        {
            if (scanBytes[i + j] != d[j] && d[j] != -1)
            {
                found = false;
                break;
            }
        }
        if (found) { return reinterpret_cast<uintptr_t>(&scanBytes[i]); }
    }
    return NULL;
}


Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться


код:
C++:
void(*OGetMessageBox) = nullptr;
void GetMessageBox()
{
    while (true)
    {
        std::cout << "\n HOOKED";
    }
}

Сам хук

Для просмотра скрытого содержимого вы должны авторизироваться или зарегистрироваться



Он должен вызываться в DllMain при DLL_PROCESS_ATTACH там же где обычно вызывается MainThread
если у вас будет поток то его только после хука

Код хука

C++:
        uintptr_t GetMBox = PatternScan((uintptr_t)GetModuleHandleA(NULL), "FF 15 ? ? ? ? EB D6");
        if (!GetMBox) return FALSE;


        if (MH_Initialize() != MH_STATUS::MH_OK) return FALSE;

        if (MH_CreateHook(reinterpret_cast<LPVOID>(GetMBox), GetMessageBox, reinterpret_cast<LPVOID*>(&OGetMessageBox)) != MH_STATUS::MH_OK) return FALSE;

        if (MH_EnableHook(reinterpret_cast<LPVOID>(GetMBox)) != MH_STATUS::MH_OK) return FALSE;

Как то так ) Я мог бы сделать отдельный тред, но мне лень
Спасибо, очень ценная информация! Если не секрет, как обучился этому? Видео на ютубе или статьи какие-то?
 
Верх Низ