【问题标题】:How can I read process memory in chunks and scan for exact address of Values?如何分块读取进程内存并扫描值的确切地址?
【发布时间】:2020-08-02 04:09:03
【问题描述】:

我用 C++ 编写了一个简单的内存扫描程序,但速度很慢,有人说读取内存块会加快速度,但我如何获得每个正确的地址?

这是一个示例源代码:

#include <iostream>
#include <Windows.h>
#include <string>

#define CHUNK_SIZE 0x80000
#define MAX_ADDRESS 0x7ffffff

using namespace std;

int main()
{
    DWORD pid;
    char buffer[CHUNK_SIZE];
    std::cin >> pid;
    int something;
    int someValue = 0;
    HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    SIZE_T numberRead;
    if (process)
        printf("opened process.\n");
    else
        printf("could not open process.\n");

    for (DWORD i = 0; i < MAX_ADDRESS; i += CHUNK_SIZE) {
        if (ReadProcessMemory(process, (void*)i, &buffer, sizeof(buffer), 
   &numberRead)) {
        
        for (int j = 0; j < sizeof(buffer); j++)
        {
                someValue = (int)buffer[i];
                if (someValue == 220)
                {
                    printf("found value %d at 0x%x.\n", someValue, i + j);
                }
            }

        }
    }

}

【问题讨论】:

  • 你能分享一下你到目前为止的尝试吗?
  • 当然我会分享我的代码。
  • 我会的,但我确实解决了问题。

标签: c++ windows memory scanning


【解决方案1】:

最好使用VirtualQueryEx循环遍历所有有效内存,避免在无效内存上调用ReadProcessMemory

while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{

    if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
    {
        delete[] buffer;
        buffer = new char[mbi.RegionSize];

        ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);

        for (int j = 0; j < bytesRead; j++)
        {
                if ((int)buffer[j] == 220)
                {
                    printf("found value %d at 0x%x.\n", someValue, mbi.BaseAddress + j);
                }
            }
        }
    }
    addr += mbi.RegionSize;
}

return match;

请记住,这将返回内存区域,其中两个变量的部分组合时与整数表示中的值具有相同的位。这意味着您可能会得到误报

【讨论】:

  • 嘿,非常感谢这个例子。我最初寻找答案是为了让我的扫描速度加快一点,但是如果 ReadprocessMemory 读取更大的缓冲区并稍后处理它,我的需求几乎完全满足了。因为它大大加快了这个过程。
  • 如果您将一块内存读入 ReadProcessMemory ,有人可以解释一下代码的外观吗?一个人想不通。也许有一些代码 sn-p ?
  • @DenisMuhic 这就是它的作用,你到底想要什么?
  • 好吧,我无法让上面的代码工作。我需要一些参考,它是如何完成的?感谢您的帮助。
  • @DenisMuhic 您在原始帖子中的主要问题需要更新以尽可能具体,以便我们可以回答。如果您在人们发布答案后编辑问题,请用 1 句话总结您对问题所做的更改,这样人们就知道如何轻松更新他们的答案codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question
【解决方案2】:

#define CHUNK_SIZE 0x1

for (DWORD i = 0x000000; i < MAX_ADDRESS; i += CHUNK_SIZE) {
        
        ReadProcessMemory(process, (void*)i, &buffer, sizeof(CHUNK_SIZE), 0);
        for (int j = 0; j < CHUNK_SIZE; j++)
        {
            
            if (buffer[j] == value)
            {
                count++;
                printf("found value %d at 0x%x.\n", buffer[j], i + j);
                //fprintf(f, "0x%x\n", i + j);
                printCheatTable(f,i + j,count);

                results[k] = i + j;
                k++;
            }
            
        }
            
        
    }

这段代码一定有问题。 基本上我想将一块内存读入 ReadProcessMemory。

对前面的代码有一些修改,即“results[k]”数组和函数printCheatTable,但对代码无关紧要。 另一个变化是“CHUNK_SIZE”现在是“0x1”。

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2017-05-16
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多