WriteProcessMemory在C ++中返回0

时间:2016-03-09 21:54:31

标签: c++ winapi memory

我正在为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的代码并且失败。尝试找到游戏窗口并不会失败,因为它不会将该消息打印到标准输出。请帮我!

注意:黑客将在单人游戏

上使用

2 个答案:

答案 0 :(得分:0)

首先,不要使用PROCESS_ALL_ACCESS。只请求你真正需要的东西。 WriteProcessMemory()只需要PROCESS_VM_WRITEPROCESS_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;
}

可以自由更改。