Cheat Engine 教程——基础知识篇

cheat-engine

之前已经写了3篇有关于Cheat Engine的教程了,或许你已经感觉到了CE的魅力所在。但仅仅只是这样,在实际使用的时候仍然会有许多的迷茫。所以,你现在才会看到这篇文章。我会力求用最简洁易懂的语言,把使用CE所需要的相关内容讲清楚,希望你能够喜欢。

Cheat Engine(以下简称CE)是一款如此强大的游戏修改器,甚至可以用伟大来形容。他的出现,着实令我这个顶多只会用用GameMaster的玩家眼前一亮。但是相对的,CE又是一个如此复杂的修改器,他需要很多的相关知识的支持,尤其是汇编方面。这也令许多人对此望而却步。

在继续阅读之前,我希望每个打算深入研究CE的朋友们,都能够明白一件事。

当你打开CE的那一刻开始,你就不再是一个普通的游戏玩家的了:在这之后,各种不同类型的计算器是你最友好的伙伴,一个接一个打开到占满整个屏幕的额外信息窗口将会成为你的座上宾;每次都不同但是每次都会出现的错误提示和随机的游戏致命崩溃是你的常客;以后你再也不会看到诸如“if,let,for”等等亲切的语言,只有“mov,add,jmp”这样冰冷的汇编语言与你同在。

当你真正做好了心理准备,我们开始吧。

ce

如图所见,这里是一个典型的在用CE进行修改时的状态。接下来的教程,都将会以这个图为基准进行。

 

正中间靠下的是CE的主窗口,我们已经很熟悉了;

左上角的是内存查看器,同时也是操作码查看器,以后,这个窗口的重要性会越来越高,甚至需要比CE的主窗口更加重视;

右边的三个小的是额外信息窗口,通常是在追逐修改针对指定地址的操作码时所找到的结果,在这个窗口中有许多有用的内容,等下会逐一解释;

左下角的是追踪器,一般常见的是上面刚刚提到的追踪内存地址时出现的,而现在图中出现的,则是追踪操作码的窗口,这两种窗口只能出现一个。

 

 

现在你可能会有一个疑问,为什么他会有两种追踪?其中一种是针对内存地址,而另外一种是针对操作码的,这两者有什么区别吗?

这是非常重要的一点。要回答这个问题,就需要先了解计算机的基本工作原理。

通常我们的修改,所针对的都是内存,这个相比有一些修改基础的人已经很熟悉了。不过,游戏从根本上来说,是CPU在执行的,而CPU是不能直接读写内存的,他所能控制的只有寄存器。所以,才有了指令。

info

如图便是一个额外信息窗口中所提供的指令。一条典型的指令是这样的:

0045583e – mov [esi+54], eax

其中,0045583e 是操作码,这仅仅相当于一个执行的序号,不过需要注意的是,CPU有时并不是完全严格的按照顺序依次执行的,因为有可能会遇到jmp等跳转指令,而在追踪窗口中所显示出的则是他真正的执行顺序。

至于后面的 mov [esi+54], eax 则是地址码。这一条地址码的用处,在于告诉CPU他应该做出怎样的动作,是这套完整的指令中的关键部分。

需要注意的是,就像之前所说,CPU是不能直接读写内存的,而必须要通过指令才能够对内存地址进行操作。所以,在一条指令中,是严格区分寄存器地址与内存地址的。这一点CE也有特别的进行强调过,所以你也需要注意,所有使用方括号“[]”括起来的内容,都是内存地址

mov是汇编语言中最常见的指令,意思是数值在寄存器与寄存器或是内存与寄存器之间的移动,也可以理解为修改。在当前这一条指令中,他的意思为将内存中地址为[esi+54]的值改为寄存器中eax的值。

其中,esi与eax都是寄存器的数值。寄存器实际上一共只有这么几种,但是CPU进行的运算量是非常巨大的,所以寄存器的数据也在不断的更新着,所以才需要单独打开一个额外信息窗口来查看当前指令时寄存器的值。比如现在可以看到,esi=007AD8F4,eax=00004FB0

这里不得不再强调一次内存地址与寄存器地址的区别,也就是方括号的重要性。“[]”中出现的只可能是内存地址;而一个寄存器中的值有可能是内存地址,也有可能仅仅是一个四字节的数值。不要搞混了。

比如刚才的[esi+54],他的意思是007AD8F4+54也就是指向了一个内存地址为007AD948里的值,这有可能是一个指针。而后面的eax,他表示的就是这个00004FB0的16进制4字节整数,也就是20400。

现在就好理解了,这一条指令的准确意思是:将内存地址007AD948的值改成20400。

 

 

是不是有些晕呢?呼呼,不要放弃,因为这就是汇编。

任何的高级语言,无论Java、Delphi、C还是C++等等,最终都需要转化为机器码才能让CPU进行计算。不过这个机器码绝对不是人类可以看懂的东西,但是所有的机器语言都可以被反汇编为汇编语言,以方便理解。

而这就是我们现在在做的事情。如果有可能的话,我推荐那些真正要做到极致的朋友们简单的自学一下汇编语言,很有帮助的。不需要学到能用汇编写出程序的地步,只要能看懂即可。

Now, hold your brave and let’s go on.

 

 

刚才,我提到了一个概念:指针。关于这个,之前也专门写过一个关于指针修改的教程。不过,或许你修改成功了,也仍然不明白为什么要如此费尽的修改一个指针吧。

指针是我们的修改中一个非常重要的概念。他的出现源自于一种很流行的技术:动态内存分配(Dynamic Memory Allocation, 简称为DMA)。有兴趣的朋友可以自行搜索相关内容,这里我们只需要知道他的作用,那就是让你搜索到的值每次都出现在不同的地址

也许你已经有过这样的经历了,不过我还是要重复一下。比如某游戏,你第一次搜索,成功找到了他的钱都保存在001ADBF0这个地址里,但是开始了新游戏之后,存钱的地址居然跑到了002CD900这个地方。这岂不是每次都要重新修改了吗?

答案是,不需要。无论这个地址怎样变化,始终有一个更上级的东西,告诉CPU,这次他的地址在什么位置。而这个更上级的负责指路的东西,就被称作指针。

指针的地址是不会变的。如果他仍然跑了,说明还有更上一级的二级指针没有找到。

现在你明白指针的重要性了。

 

 

 

知道了以上的这些知识,现在对于CE的应用就已经不会再有那么迷茫了吧。本来只是基础篇的,没想到只是介绍了两个主要概念,就已经不知不觉已经写了这么多,果然基础也不是件容易的事情啊。

承蒙许多朋友的错爱,把我当做高手。其实我真的不能算高手,充其量只是比刚入门的人稍微多研究了一些时间罢了,所以也就比较喜欢和大家一起分享自己的经验。谢谢大家对我的关注。

最后感谢EZ论坛上amd2200朋友的支持,让我有动力写下这篇类似于前传性质的文章。谢谢你。

让我们一起期待CE5.6吧^_^

Cheat Engine 教程——基础知识篇》上有110条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注