使用指针访问临时地址

时间:2017-03-31 13:12:17

标签: c++ pointers memory game-development

我正试图摆弄CounterStrike,以便了解C ++中的内存编辑。我使用偏移量转储器来获取静态指针和偏移量,这些指针和偏移量将导致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 ++的知识,我不想编写任何作弊或什么......

1 个答案:

答案 0 :(得分: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;
}