所以,我正在尝试用C++编写程序,以修改另一个程序中的值.就我而言,Windows的计算器.这是代码:
#include <iostream>
#include <windows.h>
using namespace std;
int main(void) {
int nVal = 2000;
HWND hWnd = FindWindowA(0, "Calculator");
if(hWnd == 0){
cerr << "Could not find window." << endl;
} else {
DWORD PID;
GetWindowThreadProcessId(hWnd, &PID);
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
if(!hProc) {
cerr << "Cannot open process." << endl;
} else {
int stat = WriteProcessMemory(hProc, (LPVOID)0xC6A0EB922C, &nVal, (DWORD)sizeof(nVal), NULL);
if(stat > 0){
clog << "Memory written to process." << endl;
} else {
cerr << "Memory couldn't be written to process." << endl;
}
CloseHandle(hProc);
cin.get();
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序尝试覆盖一个值,该值与计算器中的"MS"按钮一起存储.问题是该程序无法做到这一点.我试图以管理员身份运行可执行文件,但没有任何变化.我在YouTube视频上发现了这个代码,那个人正在使用XP,我使用的是Windows 8.
我发现了使用Cheat Engine 的0xC6A0EB922C地址,并且还尝试修改内部的值并且它工作得很好!
如果有人可以帮助我,请做.谢谢!
从您的硬编码地址开始,您的计算器作为64位应用程序运行.
如果您的程序编译为32位,则硬编码地址(LPVOID)0xC6A0EB922C
将被截断为32位,因此是错误的.
要解决此问题,您应该将程序编译为64位或使用32位计算器作为测试目标.它位于C:\Windows\SysWOW64\calc.exe
.
WinAPI函数可能会失败,并且它们会比人们想要的更多.始终检查返回值并GetLastError()
在发生错误时调用,以便您知道失败的原因.
请记住以管理员身份运行程序或在打开其他进程时关闭UAC.