【发布时间】:2017-01-08 16:25:40
【问题描述】:
我很担心这个问题真的非常简单,但即使你我开始掌握指针的概念,来自有经验的用户的提示缩短了我需要花在理解所有内容上的时间。我有一个简单的例子,稍后我不会详细说明它应该做什么,因为我认为我的错误是非常基本的。我得到:
抛出异常:读取访问冲突。 _First 是 0x815110。
执行此代码时:
#include <Windows.h>
#include <iostream>
#include "Header.h"
#pragma comment(linker, "/SECTION:.data,RWE")
using std::cout;
using std::endl;
int main() {
DWORD dwProcessID = 0;
cout << "Looking for game process..." << endl;
while (dwProcessID == 0) {
dwProcessID = GetProcessID(L"PathOfExile.exe");
Sleep(100);
}
std::cout << "Game Client found" << std::endl;
printf("dwProcessID = %p\n", dwProcessID);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
MODULEENTRY32 module;
module.dwSize = sizeof(MODULEENTRY32);
Module32First(snapshot, &module);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessID);
HANDLE hToken = NULL;
if (!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
printf("Failed to open access token\n");
if (!SetPrivilege(hToken, SE_DEBUG_NAME, TRUE))
printf("Failed to set debug privilege\n");
printf("PoE base address = %p\n", module.modBaseAddr);
BYTE jmp[] = "\xBA\x00\x00\x80\x3F\x89\x10\x89\x16\xE9\x00\x00\x00\x00";
BYTE *dwMaphack = (BYTE*)(module.modBaseAddr + 0x4D5110);
cout << dwMaphack << endl;
*(DWORD*)&jmp[10] = (DWORD)(dwMaphack - jmp) - 6;
DWORD dwOldProt;
VirtualProtectEx(hProcess, (LPVOID)dwMaphack, 8, PAGE_EXECUTE_READWRITE, &dwOldProt);
// tbc
while (1) {
}
return 0;
}
开放进程方法和其他基本内容在标头中,它们工作正常,但我不明白为什么当我将字节指针 BYTE *dwMaphack 更改为 DWORD *dwMaphack 时,不再出现访问冲突错误?
我正在尝试将我的代码基于不再有效的某人的过时代码,所以我只知道部分执行这些操作的原因,我知道它在编程方面应该做什么,但我不知道还不知道游戏中的效果。无论如何,我认为就我遇到的错误而言,这并不重要。提前感谢您的回答!
【问题讨论】:
-
@RbMm,另一个挑战? :-D
-
指针运算是基于目标的大小。
-
计算中指针类型错误会出现访问冲突错误吗?
-
设置断点并查看调试器中的值,然后尝试查看它们指向的内存。
-
modBaseAddr 地址为 0x00340000,但调试器中的值为“无法读取内存”。那就是 BYTE dwMaphack = (BYTE)(module.modBaseAddr + 0x4D5110);发生此行异常后。