c++ - 为什么我应该在 WriteProcessMemory() 函数的第二个参数中使用 (void*)?
问题描述
我正在尝试为游戏创建游戏教练。我找到了所需的内存地址,现在我想将我的值写入该地址。
例如:弹药地址为:0x0E9AFD07
Windows API 中的WriteProcessMemory()
函数可以做到这一点。
我的来源:
int main(){
DWORD pid;
int address = 0x0E9AFD07;
const int data = 20;
HWND hwnd = FindWindow(0 , "Max Payne v1.05");
GetWindowThreadProcessId(hwnd , &pid);
HANDLE hndl = OpenProcess(PROCESS_ALL_ACCESS , false ,pid);
WriteProcessMemory(hndl , &address , &data , 4 , NULL);
return 0;
}
但是这段代码不起作用!
如果我应该使用WriteProcessMemory
如下:
WriteProcessMemory(hndl , (void*)0x0E9AFD07 , &data , 4 , NULL);
那么函数的第二个参数是LPVOID
类型,我读到它LPVOID
是一个指向任何东西的指针。
那么,为什么我不能int
为第二个参数传递指向(地址变量)的指针?
我为什么要使用(void*)
?
解决方案
-
为什么我应该使用 (void*)
因为这就是手册告诉您该功能所期望的。具体来说:
lpBaseAddress
指向要写入数据的指定进程中的基地址的指针。在数据传输发生之前,系统会验证指定大小的基地址和内存中的所有数据都可以进行写访问,如果不可访问,则函数失败。
出于同样的原因,您不能依次传递包含地址的局部变量的地址,因为这不是函数所期望的。
LPVOID
只是 Windows 乱码void*
,它们是相同的类型。为了将整数地址转换为指针类型,您需要进行强制转换,因为 C 和 C++ 就是这样设计的。您不能将整数分配给指针,请参阅“来自整数的指针/来自没有强制转换的指针的整数”问题。
值得注意
0x0E9AFD07
的是地址未对齐,因此将 4 字节整数写入该地址是可疑的。
推荐阅读
- dll - CAD 程序“FiDES”无法在笔记本电脑上启动,出现 0xc000007b 错误并丢失 .dll 文件
- if-statement - 谷歌脚本 .getvalue() 不能处理带有公式的单元格
- maven - 运行 mvn test -Dtest=.. 时找不到文件
- docker - 在 cpanel 上运行 docker 容器
- html - Angular 6 Datatable在外部过滤后刷新表中的数据
- xamarin.forms - Xamarin Formns:在列表视图中的数据之后创建多个空行
- angular - 查看源页面不使用角度通用 ssr 更新
- excel - 公式通过从输入框中选择返回循环内的#NAME
- python-3.x - 在python3中的字典内编辑列表中的字符串
- javascript - 未捕获的 ReferenceError:$ 未在 Power BI Embedded 中定义