前三篇的博文结合了C#的Demo对内存数据修改一类的挂剖析了原理,利用C#语言调用Windows API,我们其实已经写出了一个简单的内存扫描工具,但是它存在一些缺陷,比如说只能所搜索单一类型数值(整型),只能搜索确定的数值,比如1000、2000,而不能进行模糊搜索,比如搜索某个值变小了,或者在某某区间内变化了等。
我一直认为语言只是一种工具,只要能够达到修改数值的目的,用什么语言都可以,甚至可以配合着多种语言和工具来完成一项数值的修改。其实实际中通常都是这样,因为每种语言有自己的优势,比如C语言/易语言这类非托管的语言对底层操作的权限非常之大,特别是易语言,容易上手加上不少人已经封装了大量的操作底层的模块,而C#、Java等优势就表现在应用层的封装,API的灵活调用。合理的利用语言的优势在它们擅长的领域,对技术保持开放的心态,不被拘束在语言层面才能对各种游戏进行剖析。
接下来的几篇文章重点教学[Cheat Engine]这款内存修改器,类似的还有OD、金山游侠(这款工具没有研究的意义,功能单一化、对于指针和汇编的理解帮助颇少),我们自己封装工具耗费时间的成本实际上是很高的,而且这些工具已经拥有很强大的功能了,我们可以利用这些工具更好的理解原理。
本章先讲一下简单的使用,我们这次就不写Demo了,直接找一个小游戏进行测试。
这个是三目童子,我小时候在小霸王游戏上玩的。
我们目前看到的信息有:
这就是我们肉眼能看到的一些信息,还有人物坐标、装备道具等是目前无法看到但真实存在的数值。
现在我们打开CE:
下图是它的主界面:
从图标或者进程名称中可以看到,我用绿色框出来的这个进程就是我们三目童子的游戏进程。
这一步的目的很明显就是获取该游戏进程的PID和句柄Handle。
我们点击打开,打开之后可以看到右侧控件已经变为可用状态了。
接下来我们就来尝试搜索一下血量(6)这个数值
我们在值中输入6,点击首次扫描,在左侧显示如下的列表,可以看到整个内存块中有2801个值为6 的地址。
现在采用上一章节提到的方法,使得6这个值发生变化,我们去撞一下小兵:
可以看到血量变成5格了
此时把值修改成5后,点击再次扫描:
下图是搜索结果,没有找到对应的地址, 可以看到数量是 0
这就尴尬了,其实是因为我们的数值类型选择的是4字节,CE打开默认4字节搜索就是整形数,而以前的游戏机不比现在有那么高的存储容量,一般能以字节存放的变量就定义为BYTE,所以我们重新开始搜索,点击新的扫描,然后下拉扫描类型为字节。
此时按下首次扫描,得到以下扫描结果
可以看到 字节形式存放的变量高达68696个,我们继续撞一下小兵
好了,这下变成4格血量了,我们把CE需要扫描的值改为4,然后点击再次扫描
找到4个结果
其中 地址0x2D00044 的值一直在变化,我们可以排除这个地址
那么在剩下的三个地址中有没有存放血量的地址呢,我们继续改变血量
血量变成三个格子了,我们对3再次进行搜索
结果如下图:
现在就剩下一个地址0x2D00092中存放的字节值为3,我们来确定下这个地址是否是血量存放的地址,我们点击该地址
然后点击箭头图标把他添加到待操作的地址列表中
双击此记录的值
我们把值修改为6,我们再来看下游戏中的血量是否跟着变化了,注意界面上的血量可能没有立刻跟着变化,因为这类游戏只有在血量发生变化的时候才会去读取显示它的值,所以我们需要再去撞一下怪。
可以看到血量变成5格了,这说明修改成功了(修改6格血量后,撞一下怪减了一格血量,所以剩5格),我们再来看下CE的界面
没有问题,数值显示5,这样的话我们就跟着CE这款工具完成了一次最基础数据的修改。大家看其实和我们写代码修改用的原理是一样的,就像破解WIFI密码一样,穷举对比,找到正确的地址或密码。
下一节讲解动态地址指针和偏移的查找。
PS:转载请附带原文路径:http://www.cnblogs.com/lene-y/p/7252446.html 。