0

我正在创建一个简单的 HACK 仅用于教育目的。一个简单的 Triggerbot,它从内存中读取玩家瞄准敌人 YES = 1 或 NO = 0 的值。我已经做了一些其他类似的 HACKS 但我从未发现这个问题.. 在彩虹六号围攻中,我有静态或动态的内存地址但是作弊引擎读得很好,但是当我尝试从我的 C++ 程序中读取它时,它不起作用。不知道为什么它可以与其他游戏一起使用。我对此很陌生,也许我做错了什么。

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#define F6Key 0x75
using namespace std ;
int value ;
int main()
{
    cout << "Open Game .." << endl ;
    system("Pause") ;
    LPCWSTR gameone = L"Rainbow Six";
    HWND hwnd = FindWindow(0, gameone);
    if (gameone == 0)
    {
        cout << "Not Found." << endl ;
        system("Pause") ;
    }
    else
    {
        cout << "Success finding game." << endl;
        DWORD processid ;
        GetWindowThreadProcessId(hwnd, &processid) ;
        HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processid) ;
        cout << processid ;

        if (!ReadProcessMemory(process, (void *)0x25421AD9D6C, (void *)&value, sizeof(value), NULL)) {
            cout << "Unable to read memory proccess";
        }
        else {
            cout << "\n Read: " << value;
        }
        system("Pause");
    }
    return 0 ;
}

这是简单的代码 Find the Window by name, 得到它的 PID 没问题。OpenProcess 然后当我用进程调用方法 ReadProcessMemory 时,通过参数的地址指针值无法读取它打印 if 条件并且永远不会读取值的 else 。

如果我从 If 条件中删除该函数只是为了测试是否至少指向它给出一些随机值的东西......很奇怪我无法读取内存它总是有效::(有人可以帮我吗?它是一些安全软件之王或什么的?

4

1 回答 1

0

首先,您必须检查OpenProcess返回值。如果您的进程没有足够的权限,它将返回NULL并且任何使用此句柄的尝试都将失败。使用GetLastError函数确定错误原因。很可能是这样ERROR_ACCESS_DENIED

其次,要成功访问外部进程内存空间,您应该使用权限打开其句柄PROCESS_VM_READ或为您启用seDebugPrivilege进程令牌。示例如何做到这一点,您可以在MSDN中看到。

最后。如果内存地址(0x25421AD9D6C在您的情况下)无效,ReadProcessMemory将失败。在这种情况下,value变量不会被初始化,任何使用它的尝试都是未定义的行为。

此外,如果您设法获得进程句柄,则应CloseHandle在完成使用后使用函数将其关闭。

Upd:如果ReadProcessMemory返回FALSE并且GetLastError-ERROR_PARTIAL_COPY这意味着发生了页面错误,您正在尝试从缓冲区中读取,并且至少有一部分没有分配给物理内存。如果您知道您的值偏移量,请使用 PSAPIGetModuleInformation函数获取模块加载地址并将偏移量添加到结构的lpBaseOfDll字段中MODULEINFO

于 2016-06-09T04:22:11.190 回答