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

时间:2019-02-01 23:14:49

标签: c++ winapi search memory readprocessmemory

我目前正在尝试验证我使用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 :(得分:0)

由于乔纳森(Jonathan)的评论,我实际上是在比较ASCII值而不是实际的十六进制值。

该代码现在可以正常工作: working

我对代码所做的更改(从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);
    }
    //...