扫描内存(C++)
Scan memory (C++)
我得到了一个函数,它扫描内存中的字节数组(XX?XX XX XX等)。
我的代码适用于windows 7,但最终在windows 10上得到了ACCESS_VIOLATION,因为内存的工作方式似乎与windows 7不同。
我的问题是,在加载游戏(64位)时,我需要在GetModuleHandle(0)作为我正在搜索的字节数组返回的地址加载到内存之前开始扫描。
如何获取游戏内存的起始位置,或者验证lpCurrentByte是否在内存中?
static DWORD64 ScanC(DWORD64 dwLength, std::string s) {
std::vector<PatternByte> p;
std::istringstream iss(s);
std::string w;
while (iss >> w) {
if (w.data()[0] == '?') { // Wildcard
p.push_back(PatternByte());
}
else if (w.length() == 2 && isxdigit(w.data()[0]) && isxdigit(w.data()[1])) { // Hex
p.push_back(PatternByte(w));
}
else {
return NULL;
}
}
for (DWORD64 i = 0; i < dwLength; i++) {
UINT8* lpCurrentByte = (UINT8*)(0x10000000 + i);
bool found = true;
for (size_t ps = 0; ps < p.size(); ps++) {//Sa plante la
if (p[ps].ignore == false && lpCurrentByte[ps] != p[ps].data) {
found = false;
break;
}
}
if (found) {
return (DWORD64)lpCurrentByte;
}
}
return NULL;
}
Process不按顺序加载其资产,在操作系统认为合适的地方加载不同的dll和堆,地址空间是碎片化的。您不应该使用任何确切的地址,因为它可以在不同的运行中更改。
请改用VirtualQueryEx。我现在没有合适的代码,但您可以在这里找到用法示例。
我发布了一个答案,因为我似乎无法编辑我的帖子(我键入的每个字符都会回滚)。我还忘了提到我正在内部运行此代码(从注入的dll)
我尝试了以下功能(按照light_keeer的建议使用VirtualQuery)。
它确实有效,但我扫描的地址并不总是在我的代码检测到的第一个"内存区域"中,我似乎不知道如何获得其他地址,我尝试的所有东西要么在我读取时返回内存中的ACCESS_VIOLATION,要么在我可以读取的内存区域的中间返回我(一开始不是)。
DWORD WINAPI GetFirstAddressInMemory(LPVOID lpParam){
DWORD64 memoryRegionStart = 0x0000010000000000;
DWORD64 memoryRegionEnd = 0x7fffffffffffffff;
MEMORY_BASIC_INFORMATION mBI;
for (DWORD64 addr = memoryRegionStart; addr < memoryRegionEnd; addr += 0x200000){//Big increment otherwise it takes ages to load
if (VirtualQuery((void*)addr, &mBI, sizeof(MEMORY_BASIC_INFORMATION))){
if (mBI.State == MEM_COMMIT) {
printf("Address at %p (%p)n", addr, mBI.BaseAddress);
printf("Next region: %pn", (DWORD64)mBI.BaseAddress + mBI.RegionSize);
Pattern::ScanC(addr, memoryRegionEnd, "XX XX XX ? XX");//ends up crashing while reading memory
break;
}
}
}
return 0;
}
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存