【vc++精品源码栏目提醒】:本文主要为网学会员提供“【精品】游戏修改器DIY - 其它资料”,希望对需要【精品】游戏修改器DIY - 其它资料网友有所帮助,学习一下!
标 题:《游戏修改器 DIY》作 者: Vegeta时 间: 2005-02-0622:43:48链 接: http://bbs.pediy.com/showthread.phpt10945《游戏修改器 DIY》《潜艇大战》v1.0 修改器及源码下载(内含游戏) 近日在整理电脑光盘时,在其中发现了一款名叫《潜艇大战》的小游戏,做得挺有趣的,可怎么也打不通关……郁闷中!于是找来《金山游侠》开始作弊,嘿嘿……结果嘛――当然是爆机喽! 每次玩都用《游侠》修改岂不是很不爽?!那就让我们一起来做个游戏修改器吧! 我们的目标是―― 《潜艇大战》 (版本:1.0) 所需工具―― 《金山游侠 III》(玩家们都应该知道吧?版本:III)、 SOFTICE(一款强大的程序调试工具,版本:4.0.5 Build334IceDump)、 Microsoft Visual C (编程利器!版本:6.0SP5) 预备知识―― 游戏修改器的原理很简单,就是修改内存中数据。
那么就要用到下面这个API 函数:WriteProcessMemory,其函数原型为:BOOL WriteProcessMemoryHANDLE hProcess // handle to process whose memory is written toLPVOID lpBaseAddress // address to start writing toLPVOID lpBuffer // pointer to buffer to write data toDWORD nSize // number of bytes to writeLPDWORD lpNumberOfBytesWritten // actual number of bytes written有了这个 API 函数我们就可以修改内存中的数据了,让我们一步一步来,把这个游戏做成一个不死版的游戏―― 第一部分:获得游戏中关键的数据――这是制作游戏修改器的前提。
首先运行《潜艇大战》,在游戏开始后你只有 5 次机会,《金山游侠》的使用方法我就不在赘述了,很简单,相信众玩家都会使用。
通过一系列的操作并测试后,发现用于存放生命的内存地址在: “0x007B0BE8” 。
OK!让我们调出SOFTICE,输入下面的命令(其作用是:在对内存“0x007B0BE8”处有写操作时中断程序): bpm 007B0BE8 w回车返回游戏后故意使潜艇中弹使生命数减 1,这时 SOFTICE 会自动跳出并停留在: 0167:00405686 3BCD CMP ECXEBP(图一)往上看,大家看到了什么?对,是 0167:0040567D 4A DEC EDX而 EDX 存放的就是潜艇中弹之前的生命数,DEC 是什么我就不用解释了吧(减一)?到了这里想必大家也就弄清楚了制作不死版游戏的关键,那就是把“0167:0040567D”处的代码改成什么都不做―― 0167:0040567D 90 NOP也就是――即使潜艇中弹了也不会减少生命数! 第二部分:用 VC 制作游戏修改器。
我们要制作的这个游戏修改器很简单,不需要 MFC,SDK 即可完全搞定! 启 动 VC , 依 次 ― ― File-New-Projects-Win32 Application- 输 入-Project name后OK,选择An empty project-OK。
然后File-New-Files-选择-CSource File,起名后OK。
输入以下代码――///////////////////////////////////////////////////////////////////////////////////////////--《潜艇大战》v1.0 修改器--作者:赵春生制作时间:17:18 04-1-15主页:HTTP://TIMW.YEAH.NET/includeltwindows.hgtint APIENTRY WinMainHINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineint nCmdShow//OBJIPunsigned int OBJ_ip0x0040567D//修改潜艇生命数代码的偏移地址unsigned int OBJ_patch10x89CA8B90//其中的 90 则是 NOP 的十六进制HWND hwndOBJFindWindowNULLquot潜艇大战quot//获得游戏的窗口句柄DWORD PIDHANDLE hProcessif hwndOBJ0SetForegroundWindowhwndOBJ//找到句柄后将游戏设置为当前窗口GetWindowThreadProcessIdhwndOBJampPID//得到游戏的进程 IDhProcessOpenProcessPROCESS_ALL_ACCESSfalsePID//打开游戏进程WriteProcessMemoryhProcessvoid OBJ_ipOBJ_patch10//写入修改后的代码CloseHandlehwndOBJCloseHandlehProcesselseMessageBoxNULLquot游戏还没有启动吧?quotquot错误!quotNULLreturn 0///////////////////////////////////////////////////////////////////////////