【问题标题】:C++ ReadProcessMemory into char * alternative [closed]C++ ReadProcessMemory 变成 char * 替代 [关闭]
【发布时间】:2013-09-27 16:35:03
【问题描述】:

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

【问题讨论】:

  • 进程无法直接访问其他内存,因此memcpyReadProcessMemory 失败。后者有什么问题? Memory Mapped Files 是允许摆脱 RPM 的 API。
  • 当前代码中要读取的数据是在另一个进程中还是在当前进程中?顺便说一句,RPM永远不是正确的解决方案(除非您正在调试或弄乱您无法控制的进程),因为它不是正确的 IPC 方法。
  • 我的意思是程序现在作为 DLL 加载并在被扫描进程的内存中。
  • 好吧,只要dwMemAddr 正确,memcpy 就是正确的。你从哪里得到那个地址?它的类型是什么?你遇到什么样的崩溃?

标签: c++ c char readprocessmemory


【解决方案1】:

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

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

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

【讨论】:

  • 使用了VirtualQuery,请查看更新的源代码。
  • 你必须使用 mbi.BaseAddress,而不是 dwMemAddr。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2015-02-11
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多