【发布时间】: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 );
}
}
【问题讨论】:
-
进程无法直接访问其他内存,因此
memcpy和ReadProcessMemory失败。后者有什么问题? Memory Mapped Files 是允许摆脱 RPM 的 API。 -
当前代码中要读取的数据是在另一个进程中还是在当前进程中?顺便说一句,RPM永远不是正确的解决方案(除非您正在调试或弄乱您无法控制的进程),因为它不是正确的 IPC 方法。
-
我的意思是程序现在作为 DLL 加载并在被扫描进程的内存中。
-
好吧,只要
dwMemAddr正确,memcpy就是正确的。你从哪里得到那个地址?它的类型是什么?你遇到什么样的崩溃?
标签: c++ c char readprocessmemory