DIY改装游戏修改器的步骤
DIY改装游戏修改器的步骤
近日在整理电脑光盘时,在其中发现了一款名叫《潜艇大战》的小游戏,做得挺有趣的,可怎么也打不通关……郁闷中!于是找来《金山游侠》开始作弊,嘿嘿……结果嘛——当然是爆机喽!每次玩都用《游侠》修改岂不是很不爽?!那就让我们一起来做个游戏修改器吧!
我们的目标是——
《潜艇大战》(版本:1.0)
所需工具——
《金山游侠III》(玩家们都应该知道吧?版本:III)、
SOFTICE(一款强大的程序调试工具,版本:4.0.5 Build334+IceDump)、
Microsoft Visual C++ (编程利器!版本:6.0+SP5)
预备知识——
游戏修改器的原理很简单,就是修改内存中数据。那么就要用到下面这个API函数:WriteProcessMemory,其函数原型为:
BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process whose memory is written to
LPVOID lpBaseAddress, // address to start writing to
LPVOID lpBuffer, // pointer to buffer to write data to
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // actual number of bytes written
);
有了这个API函数我们就可以修改内存中的数据了,让我们一步一步来,把这个游戏做成一个不死版的游戏——
第一部分:获得游戏中关键的数据——这是制作游戏修改器的前提。
首先运行《潜艇大战》,在游戏开始后你只有5次机会,《金山游侠》的使用方法我就不在赘述了,很简单,相信众玩家都会使用。通过一系列的操作并测试后,发现用于存放生命的内存地址在:“0x007B0BE8”。OK!让我们调出SOFTICE,输入下面的命令(其作用是:在对内存“0x007B0BE8”处有写操作时中断程序):
bpm 007B0BE8 w
回车返回游戏后故意使潜艇中弹使生命数减1,这时SOFTICE会自动跳出并停留在:
0167:00405686 3BCD CMP ECX,EBP(图一)
往上看,大家看到了什么?对,是 |
0167:0040567D 90 NOP
也就是——即使潜艇中弹了也不会减少生命数!
第二部分:用VC制作游戏修改器。
我们要制作的这个游戏修改器很简单,不需要MFC,SDK即可完全搞定!
启动VC,依次——[File]-[New]-[Projects]-[Win32 Application]-[输入-Project name]后[OK],选择[An empty project]-[OK]。然后[File]-[New]-[Files]-[选择-C++Source File],起名后[OK]。输入以下代码——
//////////////////////////////////////////////////////////////////////////////////////////
/*
--《潜艇大战》v1.0 修改器--
作者:赵春生
制作时间:17:18 04-1-15
主页:HTTP://TIMW.YEAH.NET
*/
#include<windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//OBJIP
unsigned int OBJ_ip=0x0040567D;//修改潜艇生命数代码的偏移地址
unsigned int OBJ_patch[1]={0x89CA8B90};//其中的90则是NOP的十六进制
HWND hwndOBJ=FindWindow(NULL,"潜艇大战");//获得游戏的窗口句柄
DWORD PID;
HANDLE hProcess;
if (hwndOBJ!=0)
{
SetForegroundWindow(hwndOBJ);//找到句柄后将游戏设置为当前窗口
GetWindowThreadProcessId(hwndOBJ,&PID);//得到游戏的进程ID
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);//打开游戏进程
WriteProcessMemory(hProcess,(void *)OBJ_ip,OBJ_patch,1,0);//写入修改后的代码
CloseHandle(hwndOBJ);
CloseHandle(hProcess);
}
else
MessageBox(NULL,"游戏还没有启动吧?","错误!",NULL);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////
编译后运行程序,看看效果吧?!怎么样?游戏成为不死版了吧?
在这里我只是给大家介绍了制作游戏修改器的一种思路,本程序还可以做得更加完美,例如:直接使用游戏修改器来加载游戏进行修改,而不是像现在这样:要先运行游戏后才能使用游戏修改器;再有,游戏还有一处修改潜艇生命数的地方,这处在:“0167:00404BEE”,大家有兴趣的话可以自己尝试……欢迎大家和我一起进行交流!附件为本游戏的修改器及其源码。