利用cheat engine以及VC编写游戏修改器
cheat engine的介绍已经完毕了,下面就是怎么使用它的问题,这里写一个稍微有意思一点的,也有实际用途的话题,就是来编写自己的游戏修改器。
这篇文章参考了http://www.pediy.com/bbshtml/bbs7/pediy7-59.htm的内容,但是进行了一定的修改和自己的实验,大家可以结合着一起看。
关于上面的链接我就不讲什么了,主要介绍我的方法。
我使用的工具:
cheat engine
Visual studio 2005
目标:
红色警戒2 繁体中文版(带游侠网补丁)
下面就开始了,大家如果有这款游戏的话,也可以自己来试试,还是有点意思的。
使用cheat engine来辅助工作:
首先在开始工作之前,需要进行一定的准备。准备就是将游戏和cheat engine都打开,然后对于游戏,先新建一个遭遇战,选择一个“简单的敌人”,这里是因为你需要时间去找地址,如果敌人很厉害,你还没找到地址就挂了,那就没得玩了,当然,这里找地址还是很快的。
注意点有几点,在flash文件中我会注释出来,这里简单提一下:
- 就是选择“简单的敌人”,然后开始游戏,此时才能使用cheat engine。
- 对于cheat engine,选择进程的时候,不是选择game.exe,而是后缀名为 tmp0…的。
- 自己试验的时候,要注意游戏的版本,以及是否有其他补丁,甚至语言也可能会有影响,可能你得到的地址和我这里不一样,但是并不影响修改。
- 因为这里游戏为全屏,所以录制的时候只录制cheat engine的画面,而不录制红警的画面。
在准备工作都做好之后,开始进行cheat engine的工作,大家具体看flash动画:
修改器原理:
从上面的flash我们得到,00A1E0C4为最终我们找到的地址,而offset为24C。我们通过这个可以知道其指向的地址内存储着我们需要的金钱数。而修改了这个金钱数,在游戏中我们也就修改成功。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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好。