Не удается найти массив байтов, совпадающий с памятью другого процесса - PullRequest
0 голосов
/ 02 февраля 2019

В настоящее время я пытаюсь проверить, работает ли код, который я написал, используя this в качестве ссылки.Мне удалось заставить его работать без сбоев, но как только я начал проверять, действительно ли код выполняет то, что я хочу, я столкнулся с проблемой.

Хотя я думаю, что код работаетво всех областях памяти, принадлежащих процессу, который я пытаюсь найти, возможно, он этого не делает?

Честно говоря, я не уверен, в чем здесь проблема, я ищу свой массив байтовв буфере памяти неправильно, или я действительно читаю не ту память?


При проверке, находит ли мой код массив байтов, совпадающий с процессом, я использовал чит-движок для предварительного сканирования, а затемсравните результаты с тем, что вернула моя программа.Я использовал массив байтов, из которого я знал заранее, всегда будет существовать хотя бы один раз в программе, которую я сканирую.

Теперь сравнивая результаты, полученные из чит-движка: ce results

И те, что я получил из моей программы, а это 0 результатов.Это не совсем верно.


Я открываю процесс, из которого хочу прочитать память, с помощью следующих флагов:

PROCESS_VM_READ |PROCESS_QUERY_INFORMATION

И способ, которым я вызываю мою функцию сопоставления с образцом:

testy.patternMatch("000000000000000001000000000000001CC80600");

Что касается моего текущего кода:

Функция, которую я вызываю(m_localprocess - открытый дескриптор процесса, который я получил заранее)

void process_wrapper::patternMatch(std::string pattern)
{
    MEMORY_BASIC_INFORMATION sys_info;

    std::vector<char> pattern_conv(pattern.begin(), pattern.end());


    for (unsigned char * pointer = NULL;
        VirtualQueryEx(m_localprocess, pointer, &sys_info, sizeof(sys_info)) == sizeof(sys_info);
        pointer += sys_info.RegionSize) {

        std::vector<char> mem_buffer;

        if (sys_info.State == MEM_COMMIT && (sys_info.Type == MEM_MAPPED || sys_info.Type == MEM_PRIVATE)) {

            SIZE_T bytes_read;
            mem_buffer.resize(sys_info.RegionSize);

            ReadProcessMemory(m_localprocess, pointer, &mem_buffer[0], sys_info.RegionSize, &bytes_read);
            if (GetLastError() != 0) {
                std::cout << "Error: " << GetLastError();
                SetLastError(0);
            }

            mem_buffer.resize(bytes_read);


            std::cout << "\nSize: "<< mem_buffer.size() << "\n";
            if (mem_buffer.size() != 0) {
                find_all(mem_buffer.begin(), mem_buffer.end(), pattern_conv.begin(), pattern_conv.end(), pointer);
            }
        }

    }

    std::cout << "Results: " << results.size() << "\n";
    for (void* x : results) {
        std::cout << x << "\n";
    }

}

И эта функция вызывает функцию find_all, которая выглядит следующим образом:

void find_all(std::vector<char>::iterator beg, std::vector<char>::iterator end,
    std::vector<char>::iterator beg_pattern, std::vector<char>::iterator end_pattern, 
    const unsigned char * baseAddr) {

    std::vector<char>::iterator walk = beg;

    while (walk != end) {
        walk = std::search(walk, end, beg_pattern, end_pattern);

        if (walk != end) {
            std::cout << (void*)(baseAddr + (walk - beg)) << "\n";
            results.emplace_back((void*)(baseAddr + (walk - beg)));
            ++walk;
        }
    }
}

Любые предложения по другимспособы реализации того, что я пытаюсь сделать, более чем приветствуются.

1 Ответ

0 голосов
/ 02 февраля 2019

Благодаря комментарию, оставленному Джонатаном, он указал, что я фактически сравнивал значения ASCII вместо фактических шестнадцатеричных значений.

Код работает сейчас: working

Изменение, которое я сделал в своем коде (получил от здесь ):

void process_wrapper::patternMatch(std::string patternOrig)
{
    MEMORY_BASIC_INFORMATION sys_info;

    int len = patternOrig.length();
    std::string pattern;
    for (int i = 0; i < len; i += 2)
    {
        std::string byte = patternOrig.substr(i, 2);
        char chr = (char)(int)strtol(byte.c_str(), NULL, 16);
        pattern.push_back(chr);
    }
    //...
...