利用cheat engine以及VC编写游戏修改器

时间:2024-04-17 17:58:12

cheat engine的介绍已经完毕了,下面就是怎么使用它的问题,这里写一个稍微有意思一点的,也有实际用途的话题,就是来编写自己的游戏修改器。

这篇文章参考了http://www.pediy.com/bbshtml/bbs7/pediy7-59.htm的内容,但是进行了一定的修改和自己的实验,大家可以结合着一起看。

关于上面的链接我就不讲什么了,主要介绍我的方法。

我使用的工具

cheat engine

Visual studio 2005

目标:

红色警戒2 繁体中文版(带游侠网补丁)

 

下面就开始了,大家如果有这款游戏的话,也可以自己来试试,还是有点意思的。

使用cheat engine来辅助工作:

首先在开始工作之前,需要进行一定的准备。准备就是将游戏和cheat engine都打开,然后对于游戏,先新建一个遭遇战,选择一个“简单的敌人”,这里是因为你需要时间去找地址,如果敌人很厉害,你还没找到地址就挂了,那就没得玩了,当然,这里找地址还是很快的。

注意点有几点,在flash文件中我会注释出来,这里简单提一下:

  1. 就是选择“简单的敌人”,然后开始游戏,此时才能使用cheat engine。
  2. 对于cheat engine,选择进程的时候,不是选择game.exe,而是后缀名为 tmp0…的。
  3. 自己试验的时候,要注意游戏的版本,以及是否有其他补丁,甚至语言也可能会有影响,可能你得到的地址和我这里不一样,但是并不影响修改。
  4. 因为这里游戏为全屏,所以录制的时候只录制cheat engine的画面,而不录制红警的画面。

在准备工作都做好之后,开始进行cheat engine的工作,大家具体看flash动画:

修改器原理:

从上面的flash我们得到,00A1E0C4为最终我们找到的地址,而offset为24C。我们通过这个可以知道其指向的地址内存储着我们需要的金钱数。而修改了这个金钱数,在游戏中我们也就修改成功。

代码如下:

代码
 1 void CGameRedAlertDlg::OnBnClickedButton1()
 2 {
 3     //修改内存
 4     //now we get the right memory address.
 5     void *addrpoint = (void *)0x00A1E0C4;
 6     //then get a new pointer
 7 
 8     unsigned int newMoney = 900000;
 9 
10     //And we should give moneyAddr the money change.
11     HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
12     PROCESSENTRY32* info=new PROCESSENTRY32;
13     info->dwSize=sizeof(PROCESSENTRY32);
14     BOOL bret;
15     DWORD PID;
16     HANDLE hProcess=NULL;
17 
18     unsigned int objMoney = 0;
19     unsigned int addrInt = 0;
20 
21     TCHAR *procName = _T("game.tmp");
22 
23     bret = Process32First(handle,info);
24     while (bret)
25     {
26         //get the right process.
27         TCHAR *file = info->szExeFile;
28         TCHAR *fileName;;
29         //全部转换为小写,然后再匹配其中是否有子字符串
30         _tcslwr_s(fileName=_tcsdup(file), _tcslen(file)+1);
31         TCHAR *pDest = _tcsstr(fileName,procName);
32         free(fileName);
33         if(pDest!=NULL)
34         {
35             //found
36             MessageBox(_T("find..."),_T("OK"));
37             PID=info->th32ProcessID;
38             hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
39 
40             ReadProcessMemory(hProcess,addrpoint,&addrInt,4,NULL);
41             void *addr = (void *)addrInt;
42             int offset = 0x24c;
43             int *moneyAddr = (int *)((char *)addr + offset);
44             ReadProcessMemory(hProcess,moneyAddr,&objMoney,4,NULL);
45             Sleep(500);
46             BOOL bWrite = WriteProcessMemory(hProcess,moneyAddr,&newMoney,4,NULL);
47 
48             if (bWrite)
49             {
50                 MessageBox(_T("Write success"),_T("Good"));
51             }
52             else
53             {
54                 MessageBox(_T("Write Failed!"),_T("Failed"));
55             }
56 
57             break;
58         }
59         bret = Process32Next(handle,info);
60 
61         if(bret==FALSE)
62             MessageBox(_T("Cannot find such process"),_T("Error"));
63     }
64     if (hProcess)
65     {
66         CloseHandle(hProcess);
67     }
68 }
69 

 

这里将金钱数修改为900000.

如何使用修改器:

简单看一下修改器的截图

 

可以看到很简单,因为只是实验,所以没有去实现什么界面,将所有的代码写在按钮的响应函数中。 

前提,启动游戏,进入某一个遭遇战中,等金钱数目跳到10000(当然,要看你开始资金是否是10000,我默认都是),然后就可以点击Button1来修改金钱了。大家试试看吧。

 

后记:

其实这里仅仅是一个修改器的雏形,还有很多地方可以去完善,但是从技术学习的角度,应该算是足够了。

 

PS

关于编辑器的问题,不知道大家具体是怎么使用的。我原来使用CuteEditor,不过上传完flash后,不知道如何使用,在TinyMCE中找到插入flash的地方,所以要切来切去,先用CuteEditor上传,再用TinyMCE插入,同时TinyMCE似乎对代码着色没有CuteEditor好。