【问题标题】:OpenProcess returns NULL every time in c++?OpenProcess 每次在 C++ 中都返回 NULL?
【发布时间】:2012-07-14 13:41:06
【问题描述】:

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

#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 中编译)

【问题讨论】:

  • 为什么不调用一些 GetLastError 来获取更多关于发生了什么的详细信息??
  • 您的计算机上是否安装了任何反恶意软件,可以防止您的程序是未签名的可执行文件侵入进程?
  • @Desmond 我启用了 microsoft security essentials,但即使我禁用它(禁用实时保护,当它不起作用时,我只是用进程管理结束它)它仍然具有相同的效果.
  • 可能又是一个空白镜头,但是您是否以管理员权限运行您的程序?
  • 是的,我刚刚想通了。那太愚蠢了,我使用了数学家建议的 GetLastError,它说“拒绝访问”,所以我认为这将是管理员权限的事情。真是菜鸟的错误。

标签: c++ process handle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多