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 

相关文章:

  • 2022-12-23
  • 2021-10-11
  • 2021-10-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-05
  • 2021-10-26
  • 2021-12-01
  • 2022-01-01
  • 2021-12-21
相关资源
相似解决方案