Cheat Engine 动态地址变成静态,用Trainer maker做成修改器

时间:2015-05-12 12:32:30     来源:互联网     访问次数:0

       首先说明下,虽然我明白这个过程,但我的语言表达能力不是很强,可能会有让你不明白的地方,可以留言共同探讨。

        这种修改过程等同于将动态内存地址变为静态地址差不多一个道理。

       CE中的 Trainer maker 能够很简单的做出修改器,但对代码的修改支持不是很好,只能使用nop代码修改。这里就是向你讲述下怎么做出具有代码修改的修改器。

        在CE中,有些游戏的指针是很难找,但我们找到第一个指针一般都很容易,找到第一个指针地址后,通过代码分析来对原代码进行修改来达到我们的目的。
    代码修改需要一点汇编知识,这里主要讲下修改中会遇到的主要问题。

        第一步:找到游戏空闲的内存空间。(这步非常重要)
        这是个关键的问题,虽然CE有分配内存空间的功能,但我们这里要做的是应用在修改器,而不是单机自己用。这样我们就得放弃他提供的功能,而要手动查找游戏的空闲可读写的内存空间。

    载入游戏后,进入CE主界面。

    点击“Memory view”-> “View”->“Memory Regions”

    在弹出的窗口里我们要注意观察的有三点

    1、Allocation Protect 项必须为 “Read+Write”
    2、Protect 项必须为 “Read+Write”
    3、在满足以上两条前提下,双击选中要察看的地址,CE会打开该地址的内存窗口,观察16进制内存窗口内的数值。例如我们选中的是“00124000”这段地址,双击后在内存窗口我们看到从00124000地址开始后面很多都是零,而在00124000之前的地址则是问号。在这里我极力建议找寻类似象00124000这样内存地址,因为它开头就是零并且前面的地址也是不可读写状态,这样的内存地址不会出现与游戏程序冲突的事情,也不会因内存控制出现错乱的情况。因为这步比较关键所以在这里多讲几句。如果实在找不到如 00124000 这样的内存空间时,可以用 图2 “00140000”样的也可以,不过要注意,取首地址时,应该离数据区远些,可以考虑这段内存的尾部,象图2这样首地址就要选在“001400e0”处,尽量离数据区远些。但尽管这样有的游戏退出时会因内存保护情况出现错误提示,虽然不影响游戏和修改功能,但看着会很不舒服,如果你在退出游戏前还原所修改的代码会避免出现错误提示,但这样会增加我们代码的输入量,到制成修改器时会很麻烦,给使用的玩家也造成不便。所以尽量找象00124000这样的空闲内存空间。

                   (图1)点击看大图

            (图2)点击看大图

    第二步:移植和修改代码

     这里我用一个游戏的例子来说明,不然光说很容易乱。先看代码,为方便说明我用数字代替。

原代码
--------------------------
(1)004307EE          8b 4e 54           -mov ecx,[esi+54]
(2)004307Ef            89 06                -mov [esi],eax   /此处就是我们要修改的地址
(3)004307F3                                   -call 00406fc0

--------------------------

1-3是游戏的原代码,其是2是我们要修改的地方,把eax换成数值,因为数值要占用四个字节,2处只有两个字节,1处正好有三个字节,我们的一个跳转刚好是五个字节,所以就在1处[004307EE]双击输入“jmp 00124000”,其中00124000就是我们先前找好的空闲内存的地址。点确定后因为要覆盖掉原来的代码,所以CE会问询问你,点两个同意就可以了。完成后1和3两行代码会变成4的样子。刚好占用了5个字节,而没伤到3。 其实也无所谓,我们这样做只是减少代码的输入量,到后来弄修改器时你就知道了。

修改后代码
--------------------------
(4)004307EE           e9 0d 38 cf ff       -jmp 00124000
          004307F3                                        -call 00406fc0
--------------------------


因为我们破坏了1和2两处的代码,而我们要修改的代码只有2,所以到空闲的这段内存地址时,先恢复1的代码,原来的1现在在这里是5.然后对原来的2进行修改成我们想要的代码,修改后就是6.把eax变成了1388[等于十进制的5000],原来的“mov”也变成了“add”。完成对我们想要的修改结果后,到7让程序跳回到3[004307F3]处继续。

添加的代码
--------------------------
(5)00124000             8b 4e 54                             -mov ecx,[esi+54]
(6)00124003             81 06 88 13 00 00              -add [esi],00001388
(7)00124009             e9 e5 c7 30 00                  -jmp 004307F3
--------------------------

        此步的主意就是:破坏原程序的内存代码并在破坏处改成一个跳转语句,跳到先前找到的空闲内存处。

        跳到空闲内存处后,恢复被破坏的那部分代码并加入修改后的代码,最后再跳回原程序没被破坏的代码处(就是跳到上面所讲的未被破坏的 3 处)让程序继续执行。

        用数字代码说明就是:破坏原程序1和2两处代码,之后再被破坏的1 和2的地址上写上如 4 样的跳转代码。之后在空闲内存处,5是恢复了被破坏的1处代码,6则是我们对2处修改整理后的代码,7跳回未被破坏的原程序3处继续程序运行。这个过程就完成了对动态的内存地址变为静态的内存地址,因为我们需要修改的值已经放在了不变的地方。

        因为有人问了所以就又加入了这些话,我的表达能力确实不太好,希望能让你明白。

        如果你对这个过程还有混乱的话,就直接看看CE的自动代码注入的功能吧,参看CE教学的第七步“代码注入”,一样的道理和过程,这里只是用动来完成这个过程。


    第三步:修改器地址修改值的确定。


       当你完成第二步的时候,进入游戏测试没问题后,就可以准备修改器的工作了。首先修改过的地址全部添加到CE的地址编辑栏里
       在做修改器的时候记得要“先”写空闲内存的代码,“后”写修改原代码处的代码,这样做的目的是防止程序正好执到此处而空闲内存的代码还没写好,就会出错。
       看图只有数值5000的地方用了四字节,不用讲大家就明白了,此处还可以让修改器生成时做成可由玩家自行修改的作用。

     地址有了,值也有了,将下面内容应用到KTM里也就简单了。记得下面地址的值是十进制。

                                               (图3)


频道推荐

游戏资源

海王2游戏素材演示
海王2游戏素材演示
牛魔王游戏素材演示
牛魔王游戏素材演示

视频教程

Cheat Engine 初级应用(以Cheat Engine自带教程Tutorial为例)02020103-04
Cheat Engine 初级应用(以Cheat Engine自带教程Tutorial为例)02020103-04
Cheat Engine 初级应用(以Cheat Engine自带教程Tutorial为例)02020103-03
Cheat Engine 初级应用(以Cheat Engine自带教程Tutorial为例)02020103
Cheat Engine 初级应用(以Cheat Engine自带教程Tutorial为例)02020103-02
Cheat Engine 初级应用(以Cheat Engine自带教程Tutorial为例)02020103-02