我正在为GTA V
开发一个小的现金黑客,我发现当我使用
WriteProcessMemory(hp, (LPVOID)0x1417C4C18, &cashVal, (DWORD)sizeof(cashVal), 0)
WriteProcessMemory
返回0.以下是我的小黑客的完整源代码。
#include <Windows.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int cashVal = 0;
cout << "Enter the amount of cash you want: " << endl;
cin >> cashVal;
HWND hwnd = FindWindow(0, "Grand Theft Auto V");
if (hwnd == 0) {
cout << "Cannot find the GTAV window. Make sure its running in Windowed mode!" << endl;
}
else {
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
HANDLE hp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (!hp) {
cout << "Could not get a handle to GTAV. Try again :(" << endl;
}
else {
int success = WriteProcessMemory(hp, (LPVOID)0x1417C4C18, &cashVal, (DWORD)sizeof
(cashVal), 0);
if (success > 0) {
cout << "You now have " << cashVal << " money!" << endl;
}
else {
cout << "Writing the memory failed!" << endl;
cout << "Error code: " << success << endl;
}
CloseHandle(hp);
}
}
cin.get();
return 0;
}
我基本上要求用户输入他们想要的现金,并且它意味着在游戏中设置它,但它返回0的代码并且失败。尝试找到游戏窗口并不会失败,因为它不会将该消息打印到标准输出。请帮我!
注意:黑客将在单人游戏
上使用答案 0 :(得分:0)
首先,不要使用PROCESS_ALL_ACCESS
。只请求你真正需要的东西。 WriteProcessMemory()
只需要PROCESS_VM_WRITE
和PROCESS_VM_OPERATION
访问权限,因此请求该权限。
与许多其他API函数一样,当WriteProcessMemory()
失败时,GetLastError()
会告诉您原因。您的代码假设WriteProcessMemory()
本身直接返回错误代码,但事实并非如此。它返回BOOL
(不是int
)来表示成功或失败,然后GetLastError()
如果失败则返回错误代码。这是documented行为:
返回值
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为0(零)。 要获取扩展错误信息,请调用GetLastError 。如果请求的写入操作跨越了无法访问的进程区域,则该函数将失败。
试试这个:
#include <windows.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int cashVal = 0;
cout << "Enter the amount of cash you want: " << endl;
cin >> cashVal;
HWND hwnd = FindWindow(0, "Grand Theft Auto V");
if (hwnd == 0) {
cout << "Cannot find the GTAV window. Make sure its running in Windowed mode!" << endl;
}
else {
DWORD pid;
GetWindowThreadProcessId(hwnd, &pid);
HANDLE hp = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid);
if (!hp) {
cout << "Could not get a handle to GTAV. Try again :(" << endl;
}
else {
BOOL success = WriteProcessMemory(hp, (LPVOID)0x1417C4C18, &cashVal, sizeof(cashVal), 0);
if (success) {
cout << "You now have " << cashVal << " money!" << endl;
}
else {
DWORD errCode = GetLastError();
cout << "Writing the memory failed!" << endl;
cout << "Error code: " << errCode << endl;
}
CloseHandle(hp);
}
}
cin.get();
return 0;
}
答案 1 :(得分:0)
您最有可能尝试写入您无法访问的内存路径...可能您正在使用32位程序写入64位内存地址(&#39;如果你使用64位计算机),我想我几年前有这个问题移植解决了我的问题然后原谅我,如果我错了至少这是我的想法。
尝试使用32位地址的代码,如果有效......可以解决您的问题。
对于Getting_Last_Error,你可以添加这个lil&#39;我使用的一些功能。
void PrintLastErrorMsg(){
LPTSTR pTmp = NULL;
DWORD errnum = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUMENT_ARRAY,
NULL,
errnum,
LANG_NEUTRAL,
(LPTSTR)&pTmp,
0,
NULL
);
cout << "Error(" << errnum << "): " << pTmp << endl;
}
可以自由更改。