-3

我有一个进程在外部使用,现在是内部的,这个程序使用 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 );
        }
    }
4

1 回答 1

3

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

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

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

于 2013-09-22T20:07:09.460 回答