无法从另一个进程的内存中找到匹配的字节数组

Can't find an array of bytes match from another process' memory

我目前正在尝试验证我使用 作为参考编写的代码是否有效。我已经设法在不崩溃的情况下将其设置为 运行,但是一旦我开始检查代码是否确实按照我的要求执行,我 运行 就遇到了问题。

虽然我认为代码遍历了属于我正在尝试搜索的进程的所有内存区域,但它可能并没有这样做?

老实说,我不确定问题出在哪里,是我在内存缓冲区中错误地搜索了我的字节数组,还是我实际上读取了错误的内存?


在检查我的代码是否从进程中找到匹配的字节数组时,我使用作弊引擎预先扫描,然后将结果与我的程序返回的结果进行比较。我使用了一个我事先知道的字节数组,在我正在扫描的程序中总是至少存在一次。

现在比较我从作弊引擎得到的结果:

还有我从我的程序中得到的结果,即 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;
        }
    }
}

我们非常欢迎任何关于实现我正在尝试做的事情的其他方式的建议。

感谢 Jonathan 留下的评论指出我实际上是在比较 ASCII 值而不是实际的十六进制值。

代码现在可以工作了:

我对代码所做的更改(从 here 获取):

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);
    }
    //...