标题: 《游戏修改器DIY》
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-1 10:14 资料 短消息 只看该作者
《游戏修改器DIY》

              《潜艇大战》v1.0 修改器及源码下载(内含游戏)

   近日在整理电脑光盘时,在其中发现了一款名叫《潜艇大战》的小游戏,做得挺有趣的,可怎么也打不通关……郁闷中!于是找来《金山游侠》开始作弊,嘿嘿……结果嘛——当然是爆机喽!

   每次玩都用《游侠》修改岂不是很不爽?!那就让我们一起来做个游戏修改器吧!

   我们的目标是——
   《潜艇大战》(版本: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 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]-[选择-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”,大家有兴趣的话可以自己尝试……欢迎大家和我一起进行交流!本游戏的修改器及其源码可从我的主页下载。

17:18 04-1-15


顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-1 10:26 资料 文集 短消息 只看该作者

往上看,大家看到了什么?对,是
   0167:0040567D 4A DEC EDX
而EDX存放的就是潜艇中弹之前的生命数,DEC是什么我就不用解释了吧(减一)?到了这里想必大家也就弄清楚了制作不死版游戏的关键,那就是把“0167:0040567D”处的代码改成什么都不做——
   0167:0040567D 90 NOP
也就是——即使潜艇中弹了也不会减少生命数!



————————————————



如果这样,可以直接修改源代码,把原来的游戏这段修改成nop么?
我记得应该是把
   0167:0040567D
处从4A改成90就可以了吧??


顶部
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-1 11:36 资料 短消息 只看该作者
源代码是修改不了的,
NOP指令的16进制就是90。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-1 12:11 资料 文集 短消息 只看该作者
我知道…………nop就是90,而dec就是4a

但是这个这个,exe程序是不是就是把汇编后的语句简单拼接,还是把拼接后的语句再次处理(比如加密)过?
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-1 12:27 资料 文集 短消息 只看该作者
哦…………刚才在群里面问了一下…………有两个人和我解释了。说dos下的exe就和com不一样就已经不仅仅是汇编后的简单堆砌了。
而window下的exe和com都不是了。


我还是先找点“exe结构”方面的先看看吧。不好意思麻烦楼主了。
顶部
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-1 13:41 资料 短消息 只看该作者
DOS位的COM里面就是汇编码。
其他的还是看看编程方面的书吧。
顶部
性别:未知-离线 ssbye
(The leader of Decepticons)

赵郡公
枢密直学士

Rank: 20Rank: 20
资政殿大学士(从一品)
组别 翰林学士
级别 大将军
好贴 4
功绩 985
帖子 10298
编号 6935
注册 2004-4-20
来自 Cybertron
家族 DECEPTICON


发表于 2005-2-1 15:32 资料 个人空间 短消息 只看该作者
欢迎timw!  
真高兴你能来到轩辕,以后这里也是你的家了,有好作品拿出来和大家分享也是你说的啊,嘿嘿!
再次感谢!!
顶部
性别:未知-离线 陈珺

Rank: 6Rank: 6Rank: 6
组别 校尉
级别 军师将军
好贴 5
功绩 26
帖子 927
编号 3820
注册 2003-12-27
来自 福建福州


发表于 2005-2-1 16:39 资料 个人空间 短消息 只看该作者
还是讲讲通用的比较好
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5800
编号 622
注册 2004-7-7


发表于 2005-2-1 18:54 资料 文集 短消息 只看该作者


QUOTE:
原帖由金圭子于2005-02-01, 10:26:31发表

往上看,大家看到了什么?对,是
   0167:0040567D 4A DEC EDX
而EDX存放的就是潜艇中弹之前的生命数,DEC是什么我就不用解释了吧(减一)?到了这里想必大家也就弄清楚了制作不死版游戏的关键,那就是把“0167:0040567D”处的代码改成什么都不做——
   0167:0040567D 90 NOP
也就是——即使潜艇中弹了也不会减少生命数!



————————————————



如果这样,可以直接修改源代码,把原来的游戏这段修改成nop么?
我记得应该是把
   0167:0040567D
处从4A改成90就可以了吧??

可以修改exe文件里面的指令,不过那个不叫源码了。其实在内存修改跟修改文件是差不多的道理,只是方法不太一样。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-1 19:22 资料 文集 短消息 只看该作者
原理不论,我就是说能保存下来么?
因为楼主说的还是另外加载程序修改内存吧。

但是我记得很多里面可以直接修改源程序达到一劳永逸的目的的(比如大航海2粮水不减,还有van很多修改曹操传exe的),而且我看楼主的帖子里面就改一句命令而且还等长,如果可以修改源程序完全是修改源程序方便啊。
顶部
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-2 11:27 资料 短消息 只看该作者
源程序不可能得到,如果这么轻易就能得到源码那MS还吃嘛啊?
打内存补丁和文件补丁是有区别的——如果有某个程序对自己有自校验或是自解压,那文件补丁就不能直接使用了。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-2-2 12:58 资料 文集 短消息 只看该作者
可能对内存自校验的少吧…………(也有有的,比如侠客游——第三之书,不过倒是可以通过改文件取消掉的)

其实我就是个人觉得改文件爽啊…………一劳永逸^_^




至于源代码…………softice能不能把整个程序全部反汇编呢?还是只能执行到哪儿才反汇编到哪儿?(我很幼稚的……
顶部
性别:未知-离线 timw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 31643
注册 2005-2-1


发表于 2005-2-2 14:49 资料 短消息 只看该作者
能,但不是很方便,如果想全部查看反汇编代码的话建议使用WIN32DASM或IDA。
顶部
性别:未知-离线 Tom Joad

Rank: 4
组别 校尉
级别 破贼校尉
功绩 16
帖子 93
编号 6524
注册 2004-4-5


发表于 2005-11-5 22:34 资料 文集 短消息 只看该作者


QUOTE:
原帖由金圭子于2005-02-02, 12:58:22发表
可能对内存自校验的少吧…………(也有有的,比如侠客游——第三之书,不过倒是可以通过改文件取消掉的)

其实我就是个人觉得改文件爽啊…………一劳永逸^_^




至于源代码…………softice能不能把整个程序全部反汇编呢?还是只能执行到哪儿才反汇编到哪儿?(我很幼稚的……

我也觉得改文件爽啊,但遇到加密文件,以我的水平就没办法了。

反汇编的工具还有一个:
http://www.caesum.com/files/borg228.zip

PS:有人知道DOS下的几百个字节的COM文件是怎样弄出来的吗?
很大可能是手工打造的。
顶部
性别:未知-离线 匡匡匡
(D‧king、王牌公關= =+)

Rank: 5Rank: 5
组别 士兵
级别 讨逆将军
功绩 9
帖子 616
编号 55565
注册 2005-12-18


发表于 2005-12-29 23:53 资料 短消息 只看该作者
請問....那個~什麼是反匯編工具阿???
難到它可以把LS壓縮解開嗎??
如果可以,那也可以用它壓回去囉??
是英文版的嗎,我不太會用
可以請會的大大教我一下嗎
顶部
性别:未知-离线 凝雪幻

白衣公主谏议大夫

Rank: 10Rank: 10Rank: 10Rank: 10
组别 白衣卿相
级别 左将军
好贴 1
功绩 244
帖子 1374
编号 3870
注册 2003-12-29


发表于 2005-12-30 22:16 资料 主页 文集 短消息 只看该作者


QUOTE:
原帖由Tom Joad于2005-11-05, 22:34:08发表

QUOTE:
原帖由金圭子于2005-02-02, 12:58:22发表
可能对内存自校验的少吧…………(也有有的,比如侠客游——第三之书,不过倒是可以通过改文件取消掉的)

其实我就是个人觉得改文件爽啊…………一劳永逸^_^




至于源代码…………softice能不能把整个程序全部反汇编呢?还是只能执行到哪儿才反汇编到哪儿?(我很幼稚的……

我也觉得改文件爽啊,但遇到加密文件,以我的水平就没办法了。

反汇编的工具还有一个:
http://www.caesum.com/files/borg228.zip

PS:有人知道DOS下的几百个字节的COM文件是怎样弄出来的吗?
很大可能是手工打造的。

dos下com文件米格式,汇编生成的代码直接载入就行了,所以尺寸不是问题。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-12-31 14:59 资料 文集 短消息 只看该作者
嗯,com就是直接汇编的。学过dos下汇编的就知道,汇编成com就可以直接执行了。
有的几百的字节其实是引导文件。比如大航海的koukai2.com,其实是引导main.exe,主体内容还在main.exe里面(比如修改粮水不减等等),但是有的版本(或者所有版本)里面不能直接执行main.exe
顶部

正在浏览此帖的会员 - 共 2 人在线




当前时区 GMT+8, 现在时间是 2025-2-5 19:56
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.016103 second(s), 10 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP