使用 ReadProcessMemory 获取字符串值的访问冲突
Access Violation using ReadProcessMemory to get a string value
我是逆向工程新手,对C++也很陌生。我正在尝试使用 Win32 API 中的ReadProcessMemory()
收集游戏中玩家的角色名称,但每当我尝试读取它时,它都会引发异常:
if (procId != NULL) {
hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId);
ModuleBase = getModuleBaseAddr(procId, "ac_client.exe");
localPlayerptr = ModuleBase + 0x10f4f4;
healthaddr = findDMAaddy(hprocess, localPlayerptr, { 0xf8 });
//load to entitylist Array
ReadProcessMemory(hprocess, (BYTE*)localPlayerptr, &Entitylist[0], sizeof(Entitylist[0]), 0);
for (int i = 1; i < 10; ++i) {
ReadProcessMemory(hprocess, (BYTE*)ModuleBase + 0x10f4f8, &Entitylist[i], sizeof(Entitylist[i]), 0);
ReadProcessMemory(hprocess,(BYTE*) Entitylist[i]+(i*4), &Entitylist[i], sizeof(Entitylist[i]), 0);
std::cout << std::hex << Entitylist[i] << std::endl;
uintptr_t nameaddres;
std::string name;
nameaddres = Entitylist[i] + 0x225;
//ReadProcessMemory(hprocess, (BYTE*)nameaddres, &name, sizeof(name), 0);
/*--> ** This is where I have a problem. ***/
std::cout << name << std::endl;
}
首先,您需要确定要读取的字符串是宽字节(wchar(还是多字节(char(版本,然后可以使用std::string/char*
或std::wstring/wchar_t*
。
其次,不要使用sizeof(std::string)
,需要确定要读取的字符串的长度。 对于宽字节:
&(std::string)name
不是可写地址,正如注释指出的那样,您可以使用wchat_t数组代替:
wchat_t name[100];
BOOL ret = ReadProcessMemory(hprocess, (BYTE*)nameaddres, name, sizeof(name), 0);
或者您可以使用&name[0]
(从@Remy(:
std::wstring name;
name.reserve(100);
BOOL ret = ReadProcessMemory(hprocess, (BYTE*)nameaddres, &name[0], 100*sizeof(wchar_t), 0);
std::wcout << name << std::endl;
然后,std::cout
不可用于wchar_t*
,它只打印地址值。它是 for 循环中的一个局部变量,因此每次进入时它都会重新分配地址。由于某些规则,系统可能更喜欢选择相同的地址,因此您具有相同的地址值。
使用std::wcout << name
输出wchar_t字符串,如果输出始终只有一个字符,则可以考虑使用多字节版本来读取内存。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- C++ 0xCCCCCCCC将字符串转换为 int 写入访问冲突_Left
- 向 const 字符串参数发送 0 int 文本时的访问冲突
- 引发未经处理的异常:读取访问冲突。这>字符串被0x1C6F112
- C++字符串表达式求解器遇到访问冲突
- 反转字符串 c++ 时出现访问冲突错误
- 读取字符串的字符时出错-访问冲突错误C++
- 读取字符串字符时出错和访问冲突
- 字符串数据成员的指针错误 - 获取访问冲突
- 将BSTR字符串传递给_BSTR_t或CComBSTR构造函数时发生访问冲突
- 获取字符串后,CompStr(BSTR,BSTR)上发生访问冲突
- 修正:访问冲突读取位置(指针到字符串数组)
- 当将字符串和整数分开时,Sscanf_s访问冲突
- 错误访问冲突写入位置0x00229C20.尝试在控制台中输入字符串时
- 覆盖c字符串时发生访问冲突
- 使用atof将字符串转换为双精度时发生访问冲突
- 读取访问冲突-指向字符串矢量中值的字符串矢量指针
- 试图读写字符串时发生访问冲突