怎么样打造自己的游戏修改器和内存补丁?

怎么样打造自己的游戏修改器和内存补丁?

相信很多人打游戏的时候都用修改器,这里我介绍怎样用VB编写修改器。

1、其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了。举个例子来说,一款拳皇模拟器里游戏人物的“血”地址是&H567DC0,当这个人物挨打的时候,这个地址的数据就要减少,只要我们把这个数据再改回去,人物的“血”就有了。要是我们作一个循环,不断地保持这个地址得数不变化,这个人就“百战不殆”了。 :)

2、但是我们怎么查找这个关键的地址哪?可以用游戏修改器嘛,比如金山游侠,GM之类。至于要改的数据也同样啦。

3、程序的流程: 首先用FindWindow函数查找到游戏窗口,再用GetWindowThreadProcessId获得进程标识符,然后用OpenProcess函数取得游戏进程句柄,最后WriteProcessMemory把数据写到相应的地址。要是需要读数据,用ReadProcessMemory函数就可以了。 我在这里以修改变脸王为例来说明。具体进入下面的链接。

值得注意的2个问题:

1、无法使用FindWindow函数怎么办? FindWindow函数需要提供窗体的标题才可以使用,但是有些游戏很难做到这一点。比如抢滩登陆,它的窗口标题很难查找到,还有一款日本鸟游戏,窗口标题是日本话,根本打不出来。碰到这种情况怎么办哪? 比较正式且常见的方法是逐条查找当前所有的进程,找出来游戏进程就找到游戏进程句柄了。这种方法别的地方都有介绍。我这里介绍一种比较笨但比较简单的方法。 由于GetForegroundWindow可以找到桌面最上方的窗口,所以我们只要设定一个时间,比如在程序中设定3秒钟,让用户在3秒钟以内进入游戏界面,我们在3秒以后在调用这个函数,获得的自然就是游戏进程了。呵呵.... 下面有一个例子来演示这个原理。

2、查出的地址不断变化怎么办? 有些游戏数据的保存地址是随机变化的,比如红色警戒的金钱,这次查出来的地址是这个,下次不知道是什么,这种问题遇到后你就不知道应该修改的内存地址。碰到这种情况怎么办哪? 这种问题需要利用动态调试来解决。我这里拿红色警戒来说明一下原理,其他情况也类似。红色警戒的金钱存放的地址是不断变化的,但是这个地址是由一个确定的地方产生的,就是说程序中有一个确定的地方,这个地方每次随机产生一个地址,程序就把金钱放到这个地方。我们只要找到那个地址来源就好办了。 但怎么找那个地方哪?先进入游戏,用金山游侠查出来钱的地址,比如说是c16a0450H。然后F5调入TRW2000,下命令bpm c16a0450 w ,就是说当程序写c16a0450H内存地址的时候中断。在这个中断的地方比如说有一个包含[eax]的命令(具体命令我忘记了,你再查一下吧),然后查看d [eax] ,如果看到这里是c16a0450,那就说明找到地址来源了。把这个地址记下来,但是我们编写程序的时候仍然无法读取[eax],这就需要使用SMC(self modify code)技术,可以编写一个补丁,在这个地址处写一个跳转,跳到另外一个地方,把[eax]的内容写入一个固定的内存地址,比如说 mov 005a627b,[eax] ,这样写游戏修改器的时候就可以用ReadProcessMemory直接读005a627b的内容,这个内容就是钱的地址了。以后的修改方法就按照上面介绍的方法修改就可以了。 我没写过这样的程序,只不过动态调试了一下,实践证明这种方法是可行的。你要是不知道SMC之类的,可以去www.pediy.com的论坛里问一问,并不是太麻烦。

关于内存补丁的问题:

内存补丁和游戏修改是一样的。用这种方法编写的内存补丁有很多好处:

1、可以摆脱一些加壳软件的干扰,比如Asprotect加密过的软件没法作内存补丁,因为它有一个anti-debug功能;

2、对于一些光盘上的文件有效,通用的内存补丁一般都要求把补丁程序和软件放在同一个目录中,但是如果从光盘上安装软件,你就无法把补丁放入光盘中,但是自己编写补丁就不存在这个问题了;

3、当然是锻炼自己的能力了,呵呵。我的表达能力不好,有什么不懂得地方可以和我探讨一下,不过一般来说我可以给你解释一下,但我不会看你的代码,因为我现在实在没功夫了。下面我给出一些代码,一个是变脸王的内存补丁,还有一个修改窗口标题的程序,都是用VB写的。不要说我没有把所用的控件列出来,要是你连这都不知道也就不用看了。 :) 附件为VB代码。