C++ 读取进程内存到字符 * 替代

C++ ReadProcessMemory into char * alternative

本文关键字:字符 替代 内存 读取 取进程 C++      更新时间:2023-10-16

我有一个在外部使用的进程,现在是内部的,这个程序使用ReadProcessMemory将数据从内存复制到Char *中。下面是代码。

char* szMemDump = (char*)malloc(mbi.RegionSize+1);
ReadProcessMemory( NULL, (unsigned long*)dwMemAddr, szMemDump, mbi.RegionSize, NULL );

我现在从程序内部执行此操作,我的目标是在不使用 RPM 的情况下将该信息读取到同一数组中。

尝试过memcpy,尽管这似乎使程序崩溃,但由于我正在读取大量内存,因此很难发现为什么会发生这种情况。

memcpy(szMemDump, (void*)dwMemAddr, mbi.RegionSize);

使用RPM的该程序的替代方案没有任何问题,并且可以准确地进行数据扫描,因此我只能假设memcpy不正确。

编辑:新代码在进程中作为DLL加载,这应该允许在内部读取值。

编辑更新代码。

    if( VirtualQuery((unsigned long*)dwMemAddr, &mbi, sizeof(mbi) ) == sizeof(mbi) )
    {
        if( (mbi.Protect != PAGE_NOACCESS) && (mbi.State == MEM_COMMIT) )
        {
            char* szMemDump = (char*)malloc(mbi.RegionSize+1);
            //ReadProcessMemory( NULL, (unsigned long*)dwMemAddr, szMemDump, mbi.RegionSize, NULL );
            memcpy(szMemDump, (unsigned long*)dwMemAddr, mbi.RegionSize);

            for( x=0; x<mbi.RegionSize; x++ )
            {
                //Loop actions      
            }
            free( szMemDump );
        }
    }

当您使用无效地址时,您会从 ReadProcessMemory() 获得 FALSE 返回。 一个你不检查,所以你只是忘记了它。

当你对memcpy()使用无效地址时,这种快乐的遗忘就结束了,这是一个kaboom,可以更有力地提醒你你弄错了,它不是一个像RPM那样检查参数的函数。

使用 VirtualQuery() 发现有效的内存地址。 并确保使用MEMORY_BASIC_INFORMATION。基址,而不是您查询的地址。