前言
任何游戏都是一段运行在操作系统上的软件,它通过CPU、内存和显卡等硬件来处理数据和渲染图像。
游戏数据(如玩家的位置、物品状态等)通常存储在内存中,并由游戏进程持续读取和更新。
提示:以下是本篇文章正文内容,下面案例可供参考
一、辅助本质是什么
1. 可执行文件与内存
-
可执行文件的加载:
- 当一个可执行文件(如游戏)被启动时,操作系统会将它加载到内存中。这包括程序代码、全局变量、栈和堆等。加载后,程序会在内存中运行,所有的游戏逻辑、数据处理等都会在这段内存中进行。
-
内存中的数据存储:
- 游戏的运行过程中,动态数据(如玩家的状态、游戏场景、NPC行为等)会不断地被读写。操作系统通过内存地址来管理这些数据,每一块数据都有特定的内存地址。
2. 操作系统提供的API
-
访问和修改内存的API:
-
操作系统(如Windows、Linux等)提供了一些API,允许应用程序访问和修改内存中的数据。例如,Windows提供的
ReadProcessMemory
和WriteProcessMemory
函数,可以让一个程序读取或修改另一个进程的内存。 -
举例:
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);
// }
//}
}