游戏辅助原理


前言

        任何游戏都是一段运行在操作系统上的软件,它通过CPU、内存和显卡等硬件来处理数据和渲染图像。

        游戏数据(如玩家的位置、物品状态等)通常存储在内存中,并由游戏进程持续读取和更新。


提示:以下是本篇文章正文内容,下面案例可供参考

一、辅助本质是什么

1. 可执行文件与内存

  • 可执行文件的加载

    • 当一个可执行文件(如游戏)被启动时,操作系统会将它加载到内存中。这包括程序代码、全局变量、栈和堆等。加载后,程序会在内存中运行,所有的游戏逻辑、数据处理等都会在这段内存中进行。
  • 内存中的数据存储

    • 游戏的运行过程中,动态数据(如玩家的状态、游戏场景、NPC行为等)会不断地被读写。操作系统通过内存地址来管理这些数据,每一块数据都有特定的内存地址。

2. 操作系统提供的API

  • 访问和修改内存的API

    • 操作系统(如Windows、Linux等)提供了一些API,允许应用程序访问和修改内存中的数据。例如,Windows提供的ReadProcessMemoryWriteProcessMemory函数,可以让一个程序读取或修改另一个进程的内存。

    • 举例

      • ReadProcessMemory:从目标进程中读取指定的内存区域。
      • WriteProcessMemory:向目标进程的指定内存区域写入数据。
  • 调试API

    • 除了直接的内存访问,操作系统还提供了调试API,允许开发者控制和监视其他进程的运行状态。这些API最初是为了调试软件而设计的,但也被游戏辅助工具利用来访问游戏内存。

    • 调试功能的利用

      • 调试器可以暂停目标进程、设置断点、监视内存等,这些功能可以帮助辅助工具找到并修改游戏的关键数据。

二.API 调用尝试使用

OpenProcess()

可以传入不同权限

ReadProcessMemory()

WriteProcessMemory

#include <iostream>
#include <Windows.h>
#include <string>
#include <Psapi.h>
#include <tchar.h>
unsigned int R4(UINT_PTR ncdz) {
    HWND h = FindWindow(L"Valve001", NULL);
    DWORD pid, tid;
    tid = GetWindowThreadProcessId(h, &pid);
    HANDLE pidbl = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); //HWND
    unsigned int memory16 =0;
    ReadProcessMemory(pidbl, (LPVOID)ncdz, &memory16, 4, 0);
    CloseHandle(pidbl); //释放句柄
    std::cout<<"指针地址:" << memory16<<'\n';
    return memory16;
}

//unsigned int W4(UINT_PTR ncdz) {
//}
PVOID GetProcessImageBase2(DWORD dwProcessId)//dwProcessId就是程序的标识符
{
    PVOID pProcessImageBase = NULL;
    //打开进程, 获取进程句柄
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
    if (NULL == hProcess)
    {
        return pProcessImageBase;
    }

    // 遍历进程模块,
    HMODULE hModule[100] = { 0 };
    DWORD dwRet = 0;
    BOOL bRet = EnumProcessModules(hProcess, (HMODULE*)(hModule), sizeof(hModule), &dwRet);
    if (FALSE == bRet)
    {
        CloseHandle(hProcess);
        return pProcessImageBase;
    }
    // 获取第一个模块加载基址
    pProcessImageBase = hModule[0];
    TCHAR szModuleName[MAX_PATH];
    GetModuleFileNameEx(hProcess, (HMODULE)pProcessImageBase, szModuleName, MAX_PATH);
    _tprintf(TEXT("Module Name: %s\n"), szModuleName);
    // 关闭句柄

    CloseHandle(hProcess);
    return pProcessImageBase;
}

int main() {
        //
    HWND h = FindWindow(L"Valve001", NULL);
    int zd = 30;
    DWORD pid, tid;
    tid = GetWindowThreadProcessId(h, &pid);
    HANDLE pidbl = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); //HWND
    LPCWSTR cstrike = L"cstrike.exe";
    HMODULE cstrkike =  GetModuleHandle(cstrike);
    UINT_PTR cstriked;
    cstriked = (UINT_PTR)GetProcessImageBase2(pid)+ 0x11069BC;


    printf("模块地址=%X\n", cstriked);
    //while (true)
    //{
    //    unsigned q = R4(R4(R4(R4(cstriked) + 0x7C) + 0x5D8) + 0xCC);//
    //    if (q <= 20) {
    //        UINT_PTR dz = R4(R4(R4(cstriked) + 0x7C) + 0x5D8) + 0xCC;
    //        std::cout << "恢复子弹" << '\n';
    //        WriteProcessMemory(pidbl, (LPVOID)dz, &zd, 4, NULL);
    //    }
    //}


}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值