当前位置:编程学习 > C#/ASP.NET >>

C#实现简易游戏修改器

像偶等之人,虽然平时不太玩游戏,但游戏作为在工作忙碌时的调节也是一个不错东西。像RPG游戏,通常会玩的是剧情,但很多时候碰到一个怎么也打不过的BOSS,游戏就卡在那边,影响了体会剧情的心情。这个时候大家都会想到修改器,把自己的血量维持住,就无敌了。网上搜了一下,发现个《Quick Memory Editor》,共享软件,有使用次数限制。试用了一下,揣摩了一下原理,然后自己实现了一个简易的版本,拿出来分享一下。程序中缺少输入校验,也没有特别设计过,只是随性写来。至于为什么要用C#实现,主是基于调用API方便,以及BitConverter这个类,可以很方便的把具体的数值转换成内存中的字节表示方式,还有是对于C/C++写界面方面不熟。有了BitConverter这个类,就不用考虑具体的类型在内存是是什么表示方式了,一切已经为你封装好了,非常方便。点击这里下载

修改器的原理非常简单,就一句话:把预期的值写入游戏进程的某段内存中(使用kernel32.dll的WriteProcessMemory函数,见包中的代码)。那么要找到需要修改的值的内存地址,该如何处理呢?这里有个小窍门。

1.我在内存中查找预期值的地址,会得到一组地址,所需要的地址就隐藏的其中。。如图

ge1

我这里正好是角色的血量是522,在游戏进程的内存中搜索522的值,可以搜索到一大片。

2.经过一番拼杀后,血量降为501了,在结果中查找一下,如图

ge2

呵呵,我这里只找了一次,就只剩下一条了,运气不错。

通常一些人物的属性,基本上都是一些全局的变量,进程起来后地址是不会变的,有些游戏甚至这个地址是编译时决定的,只要记住那个地址,不需要查找就可以修改。第一次查找后,目标的地址就会包含在这个列表中。第二次,查找时因为血量变了,目标地址的值是预期的,而非目标地址的值可能变成与血量值相等,也可能变成其他的值,或者是不变,第二次在结果中查询就过滤掉了一大批。如果没找到目标地址,那么再去拼杀一会,再从结果从查找一次,当搜到最后,列表中的数量不再变化时,目标地址就找到了。有些游戏的目标地址不只一个,这个时候,把这些地址一起修改了就行了。根据这个前提,这种方式不是对每个游戏都适合的,特别是针对网游,基本上是不起作用的,是否适用,还需试了才知道啊。

3.做一个定时任务,把目标地址修改成需要的值即可(就是暴力修改,每隔一定时间就修改一次,我的程序里以100ms间隔)

ge3

上图的LockedValue就是想要修改成的值。
 

下面看一下具体的代码是怎么实现的

首先,要查找游戏进程的内存中的数据,需要用到api函数ReadProcessMemory(kernel32.dll中)

 
1 [DllImport("kernel32.dll", SetLastError = true)]
2 public static extern bool ReadProcessMemory(
3   IntPtr hProcess,
4   IntPtr lpBaseAddress,
5   [Out] byte[] lpBuffer,
6   int size,
7   out int lpNumberOfBytesRead
8  );

每次从游戏进程中读取4KB的内存(一页就是4KB),然后从这4K中查找你要找的值,把匹配的内存地址记下来。如下是查找按钮的单击事件,处理了对整个游戏进程内存的搜索过程

 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,