C++ Вопрос Pattern scan на плюсах.

Начинающий
Статус
Оффлайн
Регистрация
23 Авг 2022
Сообщения
54
Реакции[?]
1
Поинты[?]
0
Привет , можете накалякать примитивный паттерн скан для изменения памяти игры. Формат dll.
 
Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Собственно гугл что-то запрещенное в нынешних реалиях. Самый обычный паттерскан, принимающий аргументами указатель на модуль ( его хендл ) и сам паттерн, и возвращает найденный адрес, в противном случае nullptr.
C++:
#include <vector>
#include <cstdint>
std::uint8_t* PatternScan(void* module, const char* signature)
{
    static auto pattern_to_byte = [](const char* pattern)
    {
        auto bytes = std::vector<int>{};
        auto start = const_cast<char*>(pattern);
        auto end = const_cast<char*>(pattern) + strlen(pattern);

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

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

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

    auto s = patternBytes.size();
    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 &scanBytes[i];
        }
    }
    return nullptr;
}
 
Сверху Снизу