我从网站“复制”了一个简单的代码段并将其调整为我试图入侵的游戏。没有多人游戏的旧游戏,基本上只是练习所有这些内存编辑的东西。每次我的程序成功返回一个窗口句柄,但后来都无法返回进程句柄。这是我的代码:
#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中编译)答案 0 :(得分:1)
您必须以管理员身份运行程序才能获得具有PROCESS_ALL_ACCESS权限的句柄,这将解决您的问题。
答案 1 :(得分:0)
如 GuidedHacking 所述,您需要以Admin身份运行程序,使用此代码检查您的进程是否以 Admin权限运行。
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;
}