进程的读取进程内存不会返回所有内容
Read process memory of a process does not return everything
我正在尝试扫描第三方应用程序的内存。我已经找到了地址;现在在0x0643FB78
.问题是,我永远无法到达那里,因为LPMODULEENTRY32->modBaseAddr
是0x00400000
而LPMODULEENTRY32->modBaseSize
只是0x006FF000
,因此我可以扫描此模块的最大地址是0x00AFF000
。
这是否意味着我寻找的地址确实存在于另一个进程/模块/线程/某物中?不过,我很有信心我拥有的过程确实包含地址。那么我应该如何访问内存呢?谢谢。
,如果你涉及LPMODULEENTRY
,你可能开始了错误的方向。我会用VirtualQueryEx
遍历目标进程中的内存块。这将为您提供有关该过程中的每个块的MEMORY_BASIC_INFORMATION
。然后,您可以使用ReadProcessMemory
并扫描块以查找所需的内容。
以下是我编写的一些旧代码,用于执行大致相同的操作,但要查找字符串而不是指针:
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
#include <algorithm>
#include <iterator>
template <class InIter1, class InIter2, class OutIter>
void find_all(unsigned char *base, InIter1 buf_start, InIter1 buf_end, InIter2 pat_start, InIter2 pat_end, OutIter res) {
for (InIter1 pos = buf_start;
buf_end!=(pos=std::search(pos, buf_end, pat_start, pat_end));
++pos)
{
*res++ = base+(pos-buf_start);
}
}
template <class outIter>
void find_locs(HANDLE process, std::string const &pattern, outIter output) {
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
for ( p = NULL;
VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
p += info.RegionSize )
{
std::vector<char> buffer;
if (info.State == MEM_COMMIT &&
(info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE))
{
SIZE_T bytes_read;
buffer.resize(info.RegionSize);
ReadProcessMemory(process, p, &buffer[0], info.RegionSize, &bytes_read);
buffer.resize(bytes_read);
find_all(p, buffer.begin(), buffer.end(), pattern.begin(), pattern.end(), output);
}
}
}
int main(int argc, char **argv) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <process ID> <pattern>", argv[0]);
return 1;
}
int pid;
sscanf(argv[1], "%i", &pid);
std::string pattern(argv[2]);
HANDLE process = OpenProcess(
PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,
false,
pid);
find_locs(process, pattern,
std::ostream_iterator<void *>(std::cout, "n"));
return 0;
}
进程由内存页组成,这些内存页映射了某些保护。这些页面封装在模块中。每个模块都有一个基础和一个大小。但是,ReadProcessMemory完全将其从您抽象出来。您应该能够读取内存,无论它位于哪个模块中。
在这种情况下,内存不在您正在查看的模块中。如果你确实需要找到它所属的位置,你可以使用CreateToolHelp32Snapshot,Module32First和Module32Next循环访问模块,检查基础和大小。
发布一些代码,我们可以帮助您找出出错的地方。为什么你这么确定你要找的地址就是你说的地址?由于 ASLR,地址通常使用基本模块 + 偏移量指定。您如何获取目标进程句柄?您需要具有某些访问权限才能使用 ReadProcessMemory。
- 从 cin 读取不会返回整个输入字符串
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 读取文件在第二次调用时返回INVALID_HANDLE
- 如何读取指针的值,因为这个指针是函数的返回?
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 无法从文件中读取 - ferror() 返回 1
- 串行读取()不会在没有数据接收的情况下返回值
- Java 套接字读取在第二次读取时返回奇怪字符
- 我想读取文本文件中的所有内容(但文本文件中只有一个双精度值),转换为双精度值并返回值
- 无法从串行端口读取.WaitCommEvent() 永远不会返回
- cudaMemcpy 在从设备读取到主机时返回 cudaErrorInvalidArgument,不清楚原因
- 尝试以随机字符(长读取)打印字符串返回结果
- CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)
- 在C 中读取二进制文件会返回意外值
- 函数读取最大和min int值,并用文本字符串返回
- InternetReadFile 填充缓冲区,但返回零字节读取
- 为什么我的布尔函数返回 true 会导致读取访问冲突?
- C++ cin 将字符串读取到 int 类型中返回 0
- 将注册表项读取为字符串返回数值
- C 如何将数据文件读取到结构或向量以及返回结构或向量