红警2单机游戏修改器VC6++制作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这是一篇让大家熟悉Windows 下分析内存数据的文章并且用VC++ 实现修改内存

VC++6.0 制作单机游戏修改器这里介绍一个简单的单机游戏修改器制作过程,单机游戏修改器当然比修改网络游戏要简单很多,一般只

需修改内存即可,今天就拿红警

2 共和国之辉为例子做一个单机游戏修改器。首先打开游戏,然后用内存查找器查找我们想要修改相应数据的内存地址,这里我们选CE,CE 是个功能非常强大的内存修改器,好废话少说我们开始新建一个游戏,相信这个游戏大家都很熟悉了,新建游戏开始

这里可以看到游戏刚刚开始,我们就从金钱入手吧,这个在红警里是最直接的啦,好然后最小化游戏打开我们的CE(注意这个时候我们新建一个电厂然后暂停让金钱的数值处于一个不容易重复出现很多次的数值)注意:VC++实现修改内存相应地址的值很简单后面我会讲解到现在我们具体看看内存地址

和基址是如何查找和分析的

这是我们的CE 附加红警游戏进程进程名为Game.exe,然后让游戏的金币处于一个容易查找的值状态请看下图

可以看到查出来的数值非常少了,但是还需要过滤,所以现在我们再返回游戏再让金币的数值变化一下暂停,返回CE 继续查找,最终发现如下几个地址

在CE 里绿色表示常量,而这两个常量对于修改内存的金币是行不通的,他们肯定有别的作用但是不能达到修改金币的作用所以我们修改黑色的那个地址0A029DDC,直接在CE 里面修改,返回游戏发现游戏金币的值已经被修改了,但是这里有一个问题,当我们关闭游戏之后再重新进入就已经不是0A029DDC 这个值了这个时候我们就要想办法找出一个固定的地址就是基址,怎么查找呢?CE 强大的功能可以做到这点双击这个地址把它添加到下面的列表然后右击查看所有操作这个地址的代码如下图所示:

图Z-11

然后我们进入游戏改变下金币的值,然后返回我们的CE 修改器会发现有一些代码,这个代码就是操作这个金币值的代码我们来分析下这段简短的代码,这是查找基址的关键步骤。如下图所示:

每段代码后面都有个+24C 的操作,我们双击把它放大看看

看看红色的那句代码mov 【ecx+24C】,edx,然后看看下面有edx 的值,可以看到edx 的值是2710 这里要注意它是16 进制的,转换为10 进制是多少呢经过转换2710 的十进制是10000,现在游戏的数据恢复到一万了正好就是金币的值,那么它把这个值放到哪了呢就是ecx+24C 这个地方,大家可以看看图Z-11 这是特意标示出来的,可以看看我们找到金币地址那个动态变化的地址是0A029DDC 然后这里我们看看ecx+24C ,ecx 的值下面看到是0A029B90 然后我们把ecx+24C 计算出来可以看到等于0A029DDC,就是现在我们找到的这个每次打开游戏都动态变化的值,所以现在我们要关心的是ecx 是从哪里来的,因为24C 是一个固定的值,每次其实动态变化的就是那个e cx,然后再偏移24C 得出的地址就是我们要真正修改金币的地址,好了我们现在就直接查找ecx 的基址,它的基址也就是一个包含了每次变化的地址的一个固定的地址,红警2 里面只有一层基址相对来说比较简单一些,所以我们来查查看这个地址在哪个地址里面,打开新的搜索搜索e cx 这个地址如下图:

这个时候我们又看到了个绿色的常量,跟前面我们找金币那个值常量有所不同,我们可以猜测它就是我们最终要找的基址,因为它是一个常量它的值是每次不变的,符合我们要找的基址的条件所以我们把00A1E0C4 这个值保存起来,然后关闭游戏我们再打开游戏我们直接看看00A1E0C4 这个地址里面的值然后再便宜24C 出来一个地址,然后我们再看这个地址里面的值是不是就是我们当前的金币,试过几次完全是的,所以现在很清楚了我们要修改金币的找地址的思路很简单:

1:查找出00A1E0C4 这个地址里面的值我们现在称为X吧

2:X+24C 就等于我们现在要修改金币的地址

3:直接修改X+24 这个地址的值就达到了修改内存的目的

好了分析工作到这里就全部完成了可以看出来还是很简单的,还有别的值也都是这样的,那个电力的值大家也可以去查,查出来大家可以看到那个电力的值偏移值也是24C,以此类推还有很多数据都可以找出来作下修改,这里就介绍下修改金币的程序实现,重要的是找出地址,修改都是一样的。好了先介绍几个W INDOWS API 吧因为后面要用到

HANDLE HWND 窗口句柄这个只要是学习过WINDOWS 编程的应该都非常熟悉了就不做过多介绍了这些API 在MSDN 有非常详细的介绍

DWORD GetWindowThreadProcessId(HWND hWnd, // handle to window LPDWORD lpdwProcessId // address of variable for process identifier );

这个函数用来返回一个进程的主线程ID,可以看到第一个参数是窗口句柄,第二个参数是返回的进程主线程ID

,

BOOL ReadProcessMemory (HANDLE hProcess, // handle to the process whose memory is read LPCVOID lpBaseAddress, // address to start reading , // address of buffer to place read data DWORD nSize, // number of bytes to read LPDWORD lpNumberOfBytesRead // address of number of bytes read );

这是读取内存值的函数我们就在这里介绍下它几个参数的作用:

HANDLE handle 打开进程的句柄一般都是PROCESS_ALL_ACCESS 权限这样我们就可以对这个进程内的内存地址进行读写啦

LPCVOID lpBaseAddress 这个是我们要读取的内存地址

LPVOID lpBuffer 读出来值的缓冲区

DWORD nSize 这个是我们要读取的字节数

LPDWORD lpNumberOfBytesRead 这个是我们实际读出来的字节数

BOOL WriteProcessMemory(HANDLE hProcess, // handle to process whose memory is written

, // address to start writing to

to LPVOID lpBaseAddress

, // pointer to buffer to write data to DWORD nSize, // number of bytes to write LPDWORD lpNumberOfBytesWritten // actual number of bytes written );

HANDLE hProcess 打开进程句柄

LPCVOID lpBaseAddress 这个是我们要写入的内存地址

LPVOID lpBuffer 要写入数据值的缓冲区

DWORD nSize 这个是我们要读取的字节数

LPDWORD lpNumberOfBytesRead 这个是我们实际写入的字节数

需要的API 确实不多,现在我们就打开VC++60.0,为了方便起见建立一个MFC 的exe 应用程序如图下所示

相关文档
最新文档