C++ 读取进程内存到字符 * 替代
C++ ReadProcessMemory into char * alternative
我有一个在外部使用的进程,现在是内部的,这个程序使用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。基址,而不是您查询的地址。
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 我应该使用什么来代替void作为变体中的替代类型之一
- 如何用转义符替换字符串中的所有特殊字符
- C :如何支持UTF8中的替代字符
- 类似于 istream::getline() 的东西,但带有替代的 delim 字符
- 替代字符数组作为模板参数的输入
- Strchr不起作用,或者我需要一个替代方案来检查给定字符串中的任何字符是否是另一个字符串的一部分
- C++ 读取进程内存到字符 * 替代
- Unsigned int转换为字符数组.替代itoa
- 字符数组的替代方法
- ostream << istream 并在空文件上测试 EOF,从 istream 获取字符的替代方法
- 删除字符数组.替代方式