使用CE破解并修改单机游戏数据

本章是作弊器的基本工作原理之一,涉及较高级的C语言知识。
CE修改单机游戏数据的原理是利用C语言代码,找到游戏的窗口,通过游戏窗口找到进程id,再通过进程id打开进程获取子数据,最后找到该子数据地址所对应的内存单元,对该数据进行修改。


软件介绍

  • Cheat Engine是一款专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。
  • 内存扫描是Cheat Engine的最主要功能之一,它可以扫描指定数值的内存地址,通过修改这些数值来达到修改游戏数据的目的,从而达到诸如无限生命、时间或弹药等优势。

vs查看内存地址

每个值在内存中都有唯一的地址,vs编辑器中,C语言定义的变量也不例外。
查看地址方法:

  1. 实现利用代码打印变量x的十六进制地址:
printf("%#x",&x);
  1. 编辑器菜单栏-窗口-内存-内存1(1),在地址处粘贴x的十六进制地址,在产生的十六进制数据处右键选择转换为“4字节整数”,如果x=1000,则可以看到000003e8的十六进制数据。

使用ce获取游戏内数据(阳光、金币)的内存地址

这里以红警2原版为例,目的是修改金钱。

  1. 打开并进入游戏,单人对抗电脑即可。
  2. 设置一个区分度较高的金钱数值,如4546。
  3. 打开ce,点击ce左上角的小计算机图标,弹出进程列表,选中红警2的Game.exe进程(注意不是Ra2.exe!否则无效),选中它,点击OPEN。
  4. 在value里填入当前金钱值4656,由于是整形,故选择Exact Value和4字节。点击上方New Scan,左侧显示以下内容:
Address		Value	Previous
001BB7E8	4546	4546
001BBC14	4546	4546
77647CC8	4546	4546
...
  1. 由于不确定真正的内存,需要改变值进行筛选。在游戏内修改金钱数,比如买掉矿场获得300金钱,值变为4846,则左侧内容可能显示为:
Address		Value	Previous
001BB7E8	4546	4546
001BBC14	4546	4546
77647CC8	4846	4546
...

由于地址可能产生很多,但筛选后值跟随改变的不多,便可逐一试地址,最终找到金钱值对于的内存地址77647CC8。


C语言实现红警金钱修改器

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
int main()
{
	int x;
	scanf("%d", &x);	//输入希望修改后的值
	DWORD pid;	//定义一个进程id,变量名为pid
	HWND hwnd = FindWindow(NULL, L"Red Alert 2");	//通过窗口名称获取窗口句柄
	GetWindowThreadProcessId(hwnd, &pid);	//通过窗口句柄找到进程id
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);	//相当于取得进程子程序的控制权,如金钱的修改权
	WriteProcessMemory(hProcess, (LPVOID)0x77647CC8, (LPVOID)&x, sizeof(x), &pid);	//修改进程对象子程序金钱的值,修改结果为x
	return 0;
}

之后生成.exe可执行文件,打开输入修改后的值即可,在游戏中就可看到修改后的结果4846。
注:
1. 窗口句柄是一个指针类型数据,简单来讲,可以通过它取得一个窗口对应的内核文档接口。
2. (LPVOID)0x77647CC8就指定了所需要的内存单元。

posted @ 2023-04-14 11:35  b1ackstar  阅读(1946)  评论(0编辑  收藏  举报