【发布时间】:2021-07-10 21:55:26
【问题描述】:
我有一个读取应用程序内存的函数
template<class T>
std::unordered_map<uint8_t, T> find_byte(T find) {
std::cout << "Searching for value\n";
std::unordered_map<uint8_t, T> mapping;
// Turn the T bytes to a vector to use nice C++ functions
std::vector<uint8_t> byte_check;
if constexpr (std::is_same_v<T, std::string>) {
byte_check = std::vector<uint8_t>(find.begin(), find.end());
}
else {
uint8_t* data = static_cast<uint8_t*>(static_cast<void*>(&find));
byte_check = std::vector<uint8_t>(data, data + sizeof(find));
}
MEMORY_BASIC_INFORMATION info;
for (uint8_t* addr = nullptr; VirtualQueryEx(m_proc, addr, &info, sizeof(info)) == sizeof(info); addr += info.RegionSize) {
if (info.State == MEM_COMMIT && (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE)) {
size_t read{};
std::vector<uint8_t> mem_chunk;
mem_chunk.resize(info.RegionSize);
if (ReadProcessMemory(m_proc, addr, mem_chunk.data(), mem_chunk.size(), &read)) {
mem_chunk.resize(read);
for (auto pos = mem_chunk.begin();
mem_chunk.end() != (pos = std::search(pos, mem_chunk.end(), byte_check.begin(), byte_check.end()));
pos++) {
uint8_t* int_addr_ptr = (addr + (pos - mem_chunk.begin()));
mapping[*int_addr_ptr] = find;
}
}
}
}
return mapping;
}
它编译得很好,但是它崩溃了它试图取消引用int_addr_ptr 指针。
使用调试器单步执行后,我注意到从VirtualQueryEx 返回的addr 无法读取。
我认为问题在于我如何取消引用,但我不知道如何解决它。 我累了:
auto lpcvoid = (addr + (pos - mem_chunk.begin()));
auto int_addr_ptr = reinterpret_cast<const uint8_t*>(lpcvoid);
来自here,但没有产生任何结果。
我想指出,如果我返回 <uint8_t, T> 的地图,它可以正常工作,但要避免指针
【问题讨论】:
-
addr - 远程进程地址空间中的地址。结果 int_addr_ptr (基于 addr )也是。所以 *int_addr_ptr 错误
-
@RbMm 如何将远程地址空间表示为 int?我的意思是我假设地址仍然是可以表示为十六进制/整数的内存地址,即使相对于不同的地址空间
-
地址不适合 int 以防 64 位。例如,可能使用 INT_PTR(将地址投射到此)。