2

我从一个站点“复制”了一个简单的代码片段,并将其调整为我试图破解的游戏。一个没有多人游戏的老游戏,基本上只是为了练习所有这些记忆编辑的东西。每次我的程序成功返回一个窗口句柄,但随后无法返回进程句柄。这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    long address = 0x47C0F04;
    int newvalue = 200; 
    DWORD newvaluesize = sizeof(newvalue);

    HWND hWnd = FindWindow(0, L"No One Lives Forever");
    HANDLE pHandle; 
    DWORD pid; 

    if(hWnd != 0) { 
        cout << "Found windowx.\n"; 
        GetWindowThreadProcessId(hWnd, &pid);
        pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 
    } 
    else {
        cout << "Can't find window\n";
    } 
    if(pHandle !=0) { 
        WriteProcessMemory(pHandle, (LPVOID)address, (LPVOID)newvalue, newvaluesize, 0);    
        cout << "Written to memory successfully\n";
    } 
    else { 
        cout << "Couldn't get handle.\n";
    } 
    CloseHandle(pHandle);
    return 0;
}

如果我没记错的话,这个游戏是从 2000 年开始的(顺便说一句真的很棒的游戏)所以我假设它没有任何先进的反黑客防护罩,因为我也可以在作弊引擎中编辑该地址的值和它可以毫不费力地工作。

编辑:我将解释到底发生了什么。它总是打印“找到窗口”,然后直接打印“无法处理”。我没有收到任何编译器错误(我正在 Microsoft Visual C++ 2010 Express 中编译)

4

2 回答 2

1

您必须以管理员身份运行程序才能获得具有 PROCESS_ALL_ACCESS 权限的句柄,这将解决您的问题。

于 2020-03-28T21:52:33.167 回答
0

正如GuidedHacking提到的,您需要以管理员身份运行程序,使用此代码检查您的进程是否以管理员权限运行。

BOOL IsElevatedProcess()
{
    BOOL is_elevated = FALSE;
    HANDLE token = NULL;
    if (GT_IsPrivateMethod(gt_private_method, FUNC_NAME, LINE_NO))
    {
        if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token))
        {
            TOKEN_ELEVATION elevation;
            DWORD token_sz = sizeof(TOKEN_ELEVATION);
            if (GetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation), &token_sz))
            {
                is_elevated = elevation.TokenIsElevated;
            }
        }
        if (token)
        {
            CloseHandle(token);
        }
    }
    return is_elevated;
}
于 2020-07-20T13:58:33.413 回答