使用指针访问临时地址

问题描述 投票:0回答:1

为了与C ++中的内存编辑有关的知识,我正在尝试使用CounterStrike。我使用了偏移量转储程序来获取静态指针和偏移量,这些静态指针和偏移量将导致dw_LocalPlayer,m_fFlags和dw_ForceJump的临时地址。我没有使用诸如VAMemory.dll之类的任何内存编辑类,只是使用了ReadProcessMemory。我发现当播放器处于空中时,m_fFlags的值为“ 256”。当他在地上时,它是“ 257”。但是,一旦获得临时地址,我将无法读取这些值。这是代码:

// ConsoleApplication1.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

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

#define dwLocalPlayer 0xAB06EC
#define dwForceJump 0x4D6A684
#define fFlags 0x100

int main()
{

    HWND hwnd = FindWindowA(NULL, "Counter-Strike: Global Offensive");
    if (hwnd == NULL)
    {
        std::cout << "Error!" << std::endl;
        exit(-1);
        system("PAUSE");
    }

    else
    {
        DWORD pid = GetWindowThreadProcessId(hwnd, &pid);
        HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);


        DWORD tempadress;
        ReadProcessMemory(pHandle, (PBYTE*)dwLocalPlayer, &tempadress, sizeof(tempadress), NULL);

        DWORD fl_Onground = tempadress + fFlags;        

        std::cout << fl_Onground << "\n" << &fl_Onground << std::endl;
        system("PAUSE");
    }

    return 0;
}

我非常感谢代码的一些帮助和建议,因为几天以来我一直坚持这样做。我只是想在这里获得C ++的知识,我不想编写任何作弊的代码...

c++ pointers memory game-development
1个回答
0
投票

您没有正确使用偏移量。转储者提供的偏移量需要添加到其他地址,例如模块的基地址。

dwLocalPlayer不是指向本地播放器的指针,而是一个偏移量。您必须将其添加到client_panorama.dll的地址。

第二:DWORD fl_Onground =蛋彩+ fFlags;

这将为您提供fl_Onground的地址,但您从未读过它的值,后续的std :: cout将输出该地址而不是该值。

此处为固定代码:

#include <iostream>
#include <Windows.h>
#include <cstdint>
#include <TlHelp32.h>

#define dwLocalPlayer 0xD30B94
#define dwForceJump 0x51EE680
#define m_fFlags 0x104

uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName)
{
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_wcsicmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

int main()
{
    HWND hwnd = FindWindowA(NULL, "Counter-Strike: Global Offensive");
    if (hwnd == NULL)
    {
        std::cout << "Error!\n" << std::endl;
        exit(-1);
        system("PAUSE");
    }

    else
    {
        DWORD pid = GetWindowThreadProcessId(hwnd, &pid);
        HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

        uintptr_t dllBaseAddress = 0;
        dllBaseAddress = GetModuleBaseAddress(pid, L"client_panorama.dll");

        DWORD tempadress;
        ReadProcessMemory(pHandle, (BYTE*)(dllBaseAddress + dwLocalPlayer), &tempadress, sizeof(tempadress), NULL);

        BYTE fl_Onground = 0;
        ReadProcessMemory(pHandle, (BYTE*)(tempadress + m_fFlags), &fl_Onground, sizeof(fl_Onground), NULL);

        std::cout << fl_Onground << "\n" << &fl_Onground << std::endl;
        getchar();
    }

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.