c++ - 如何在另一个进程的内存中搜索字符串?

标签 c++ windows winapi

目前我正在使用这个函数,它是我通过阅读整个互联网上几个松散相关的问题拼凑而成的。我遇到的问题是我第一次运行它时返回了一个错误,但不幸的是我无法重现它。现在,当我运行它时,它每次都只返回 0。

DWORD GetAddressOfString(char *input)
{
    unsigned char *p = NULL;
    MEMORY_BASIC_INFORMATION info;
    HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, _processID);

    for (p = NULL; VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info); p += info.RegionSize)
    {
        if (info.State == MEM_COMMIT && (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE))
        {
            char *buffer = new char[info.RegionSize];
            SIZE_T bytesRead;
            ReadProcessMemory(process, p, &buffer, info.RegionSize, &bytesRead);
            for (int i = 0; i <= (info.RegionSize - sizeof(input)); i++)
            {
                if (memcmp(input, &buffer[i], sizeof(input)) == 0)
                {
                    return i;
                }
            }
        }
    }
}

最佳答案

这是一个快速而粗略的版本,它本身搜索数据。如果你打开 Notepad++,键入“SomeDataToFind”,用正确的值替换 pid,然后运行它,它应该也能找到数据。它可能会给你一些东西作为开始,并根据你的需要进行修饰。

您的代码正在搜索错误的长度,返回错误的偏移量,像筛子一样泄漏内存,并且并不总是返回未定义行为的值。

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

char* GetAddressOfData(DWORD pid, const char *data, size_t len)
{
    HANDLE process = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, pid);
    if(process)
    {
        SYSTEM_INFO si;
        GetSystemInfo(&si);

        MEMORY_BASIC_INFORMATION info;
        std::vector<char> chunk;
        char* p = 0;
        while(p < si.lpMaximumApplicationAddress)
        {
            if(VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info))
            {
                p = (char*)info.BaseAddress;
                chunk.resize(info.RegionSize);
                SIZE_T bytesRead;
                if(ReadProcessMemory(process, p, &chunk[0], info.RegionSize, &bytesRead))
                {
                    for(size_t i = 0; i < (bytesRead - len); ++i)
                    {
                        if(memcmp(data, &chunk[i], len) == 0)
                        {
                            return (char*)p + i;
                        }
                    }
                }
                p += info.RegionSize;
            }
        }
    }
    return 0;
}

int main()
{
    const char someData[] = "SomeDataToFind";
    std::cout << "Local data address: " << (void*)someData << "\n";

    //Pass whatever process id you like here instead.
    DWORD pid = GetCurrentProcessId();
    char* ret = GetAddressOfData(pid, someData, sizeof(someData));
    if(ret)
    {
        std::cout << "Found: " << (void*)ret << "\n";
    }
    else
    {
        std::cout << "Not found\n";
    }

    return 0;
}

关于c++ - 如何在另一个进程的内存中搜索字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28231054/

相关文章:

c++ - 未定义错误构造函数

c++ - 使用注入(inject)的 DLL 从外部应用程序渲染 OpenGL 场景内部

windows - Delphi XE2 将 Application.MainForm.Handle 分配给 DLL 中的 Application.Handle

c++ - 从 ListView 控件中删除项目

具有不同参数的 C++ boost 信号和插槽?

c++ - 将对象移动到 map 中

c# - 如何查看当前登录用户和登录时间

c# - 表格中的圆角边缘

c++ - 返回 nullptr 迭代器,如何转换它们

c++ - 如何查找右值引用是否是显式应用 std::move 的结果?