Cheat Engine 教程——基础知识篇
Cheat Engine(以下简称CE)是一款如此强大的游戏修改器,甚至可以用伟大来形容。他的出现,着实令我这个顶多只会用用GameMaster的玩家眼前一亮。但是相对的,CE又是一个如此复杂的修改器,他需要很多的相关知识的支持,尤其是汇编方面。这也令许多人对此望而却步。
如图所见,这里是一个典型的在用CE进行修改时的状态。接下来的教程,都将会以这个图为基准进行。
正中间靠下的是CE的主窗口,我们已经很熟悉了;
左上角的是内存查看器,同时也是操作码查看器,以后,这个窗口的重要性会越来越高,甚至需要比CE的主窗口更加重视;
右边的三个小的是额外信息窗口,通常是在追逐修改针对指定地址的操作码时所到的结果,在这个窗口中有许多有用的内容,等下会逐一解释;
左下角的是追踪器,一般常见的是上面刚刚提到的追踪内存地址时出现的,而现在图中出现的,则是追踪操作码的窗口,这两种窗口只能出现一个。
现在你可能会有一个疑问,为什么他会有两种追踪?其中一种是针对内存地址,而另外一种是针对操作码的,这两者有什么区别吗?
这是非常重要的一点。要回答这个问题,就需要先了解计算机的基本工作原理。
如图便是一个额外信息窗口中所提供的指令。一条典型的指令是这样的:
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++engine什么意思等等,最终都需要转化为机器码才能让CPU进行计算。不过这个机器码绝对不是人类可以看懂的东西,但是所有的机器语言都可以被反汇编为汇编语言,以方便理解。
而这就是我们现在在做的事情。如果有可能的话,我推荐那些真正要做到极致的朋友们简单的自学一下汇编语言,很有帮助的。不需要学到能用汇编写出程序的地步,只要能看懂即可。
Now, hold your brave and let’s go on.
刚才,我提到了一个概念:指针。关于这个,之前也专门写过一个关于指针修改的教程。不过,或许你修改成功了,也仍然不明白为什么要如此费尽的修改一个指针吧。
指针是我们的修改中一个非常重要的概念。他的出现源自于一种很流行的技术:动态内存分配(Dynamic Memory Allocation, 简称为DMA)。有兴趣的朋友可以自行搜索相关内容,这里我们只需要知道他的作用,那就是让你搜索到的值每次都出现在不同的地址。
也许你已经有过这样的经历了,不过我还是要重复一下。比如某游戏,你第一次搜索,成功到了他的钱都保存在001ADBF0这个地址里,但是开始了新游戏之后,存钱的地址居然跑到了002CD900这个地方。这岂不是每次都要重新修改了吗?
答案是,不需要。无论这个地址怎样变化,始终有一个更上级的东西,告诉CPU,这次他的地址在什么位置。而这个更上级的负责指路的东西,就被称作指针。
指针的地址是不会变的。如果他仍然跑了,说明还有更上一级的二级指针没有到。
现在你明白指针的重要性了。
发布评论