• Cheat Engine 官方教程汉化


    CE修改器官方教程汉化版,区别于前款教程,官方教程中使用的是Tutorial64位程序,如下是经过翻译后的官方文档。

    第一步:欢迎

    当教程启动时,您应该会看到类似的东西,您只需在阅读帮助文本后单击“下一步”按钮即可。

    在后面的步骤中保存密码,以防崩溃(从注入中)并在以后重新启动。

    运用CE如何附加到进程

    • 1.打开要附加到的进程/游戏(如果尚未打开)。
    • 2.打开作弊引擎(如果尚未打开)。
    • 3.单击作弊引擎窗体工具栏中的计算机图标,如果作弊引擎刚刚打开,它应该会闪烁,或者在作弊引擎主窗体菜单上选择进程。

    4.从列表中选择进程。

    5.单击打开按钮或双击该过程。您应该会在窗体顶部看到进程名称。您现在已附加到该进程。

    第二步:精确值扫描

    对于步骤2,您将看到类似这样的东西。

    我们需要找到的是健康,这里是一个整数。

    因此,设置内存扫描程序以查找整数,然后进行精确值扫描,然后将该值设置为当前运行状况值,大多数整数将存储在4字节变量中,因此让我们从那里开始。

    注意:整数可以存储在 1 字节变量(字节)、2 字节变量(int16/短)、4 字节变量 (int32/int) 或 8 字节变量 (int64/long) 中。

    准备就绪后,单击第一个扫描按钮

    您应该在找到的地址列表中看到一个地址列表,如下所示。

    现在点击点击我按钮,然后重新输入当前值,然后单击下一次扫描按钮

    请注意列表中的红色值,这表示该值已更改。

    单击下一次扫描后,您可能需要继续单击击中我,然后重新扫描,告诉找到的地址列表足够小,可以使用。

    只需双击找到列表中的地址,即可将其添加到作弊表中。然后更改值并冻结地址,双击地址列表中的值进行编辑,通过单击启用码/冻结框将其冻结。

    现在应该启用下一个按钮,单击它以转到下一步。如果下一个按钮尚未启用,请再次单击点击我按钮。

    第三步:未知的初始值

    当您开始步骤 3 时,您应该会看到表单如下所示。

    就像帮助文本所说的那样,请确保在开始新扫描之前单击新扫描按钮。

    这将清除找到的结果以开始扫描新值。

    在这里,我建议继续单击点击我按钮,只是为了查看值是如何减小的,以帮助确定要扫描的值类型。

    请注意,该值减小了一个整数,即非小数。

    因此,我将扫描仪设置为4个字节和未知的初始值。然后单击第一个扫描按钮

    现在点击点击我按钮。然后将扫描类型设置为减小值,然后单击嵌套扫描按钮

    请注意找到的地址数量,对于当今的大多数游戏来说,这有点小,对于大多数游戏来说,找到的结果很容易达到数百万。

    现在,只需使用点击我按钮继续减小该值,然后扫描减小的值,直到找到的结果足够小,可以使用。

    现在我们只需选择一个地址并更改值以查看它是否具有所需的效果,这就是它的工作原理。

    在这里,我建议您在更改值(或只是Ctrl + C)之前始终注意这些值,以便在它们不是正确的值时将其设置回去,以防止在游戏中执行此操作时更改一堆未知地址并损坏保存文件。

    一旦您将值设置为 5000,下一步按钮应立即变为启用状态。更改值并单击点击我按钮后,进度条应填充,但这不是必需的。

    现在应该启用下一个按钮,单击它以转到下一步。如果下一个按钮尚未启用,请再次单击点击我按钮。

    第四步:浮点数

    当您开始步骤 4 时,您应该会看到表单如下所示。

    因此,请单击新建扫描按钮。然后为扫描仪设置一个浮点数精确值,输入当前运行状况值。设置时,单击第一个扫描按钮。

    因此,只需像以前一样扫描以查找健康地址,然后将其添加到地址列表中。

    现在再次单击新的扫描按钮。然后将扫描仪设置为双精度值,输入当前弹药值。设置时,单击第一个扫描按钮。

    因此,只需像以前一样扫描以查找弹药地址,然后将其添加到地址列表中即可。

    现在将值更改为5000,然后下一步按钮应变为启用状态。然后单击下一步按钮以继续执行下一步。

    第五步:代码查找器

    当您开始步骤 5 时,您应该看到表单如下所示。

    因此,首先找到该值,然后将其添加到地址列表中。此时继续保存表和密码,以防调试器设置不正确。

    在地址列表中拥有地址后,右键单击它,然后选择找出访问此地址的内容。

    作弊引擎将提示您有关附加调试器的信息,只需单击按钮即可。

    然后将打开一个调试器窗体,现在单击更改值按钮,您应该获得显示在调试器窗体中的代码。

    我们想要的是一个书面指令。因此,我们将寻找一些类似于以下内容之一的东西:

    mov [**],**
    add [**],**
    sub [**],**
    *** [**],**
    

    选择写入指令的代码行,可以单击显示拆装器按钮以查看内存中的代码,然后单击替换按钮。最后不要忘记单击停止按钮。

    替换按钮会将该行代码替换为NOP。作弊引擎将提示您输入它将添加到高级选项列表中的条目的名称。

    输入名称,然后单击确定按钮。

    现在,单击教程中的更改值按钮。下一步按钮应变为启用状态,然后单击下一步按钮以前进到下一步。

    当高级选项列表中的条目被替换时,它们将显示为红色文本。

    可以通过单击作弊引擎主窗体左下角状态栏中的高级选项按钮来查看高级选项列表。

    要还原列表中某个条目的原始代码,请右键单击该条目,然后选择使用原始代码还原

    请注意,恢复后文本为黑色。

    第六步:指针

    当您开始步骤 6 时,您应该看到表单如下所示。

    因此,首先找到该值,然后将其添加到地址列表中。

    在地址列表中拥有地址后,右键单击它,然后选择找出访问此地址的内容。

    然后单击更改值按钮,让进程访问该地址。

    选择代码以查找指针的基址时,请尝试选择不写入与基址相同的寄存器的指令。

    在这里,我们对方括号[]之间的值感兴趣,因此这里我们需要RDX的值。

    这里的偏移量是0,如果指令有这样的东西:

    mov [rdx+12C],eax
    

    然后偏移量将为12C(0x12C),请注意,这是十六进制。

    现在将扫描仪设置为8个字节精确值,选中十六进制复选框,然后获取找到的值并将其作为要扫描的值。

    准备就绪后,单击第一个扫描按钮。

    在找到的地址列表中查找带有绿色文本的地址,这些是静态地址。

    将一个添加到作弊表,双击已添加到地址列表的内存记录的地址,复制该地址,然后选中指针复选框,然后将该地址粘贴到指针基址中。

    所以我的指针看起来像["Tutorial-x86_64.exe"+XXXXXX]+0这样。

    设置指针时单击确定按钮。

    现在将值冻结5000并单击更改指针按钮,下一个按钮应该变为启用状态。

    如果下一个按钮未启用,则从找到的列表中选择另一个地址,查找更改其值的绿色地址,并将其设置为与上一个地址一样,并查看它是否指向正确的值,如果是这样,请更改值冻结并单击更改指针按钮。

    单击下一步按钮前进到下一步。

    第七步:代码注入

    当您开始步骤 7 时,您应该会看到表单如下所示。

    在这里,我们将遵循与步骤 5 相同的过程,但不是单击替换,请单击显示反汇编器按钮。

    这将在指令的地址打开反汇编器视图表单。

    选中该指令后,按 Crtl+A 打开自动汇编程序窗体。

    在自动组装器表单菜单中,选择模板,然后选择完全注入

    这将生成一些脚本来启动。

    现在,我们需要添加一些将值增加 2 的代码,然后删除减小该值的原始代码。

    为了增加价值,我们可以使用INC或ADD

    所以让我们尝试这样的事情。

    ...
    newmem:
      add dword ptr [rsi+780],2
    
    code:
      //sub dword ptr [rsi+00000780],01
      jmp return
    
    address:
      jmp newmem
      nop
      nop
    return:
    ...
    

    现在将脚本添加到作弊表,然后启用脚本并单击“点击我”按钮。

    这应该启用下一步按钮,因此单击下一步按钮转到下一步。

    第八步:多级指针

    当您开始步骤 8 时,您应该会看到表单如下所示。

    手动迭代

    在这里,我们将遵循与步骤6相同的步骤,除了我们将看到哪些内容访问了我们找到的基址,并且我们将继续重复此操作,直到找到静态基址。

    这是我的第一个调试器输出。

    10002D8D1 - B9 A00F0000 - mov ecx,00000FA0
    10002D8D6 - E8 3522FEFF - call Tutorial-x86_64.exe+XXXXXX
    10002D8DB - 89 46 18  - mov [rsi+18],eax  <<<<<<
    10002D8DE - 89 C2  - mov edx,eax
    10002D8E0 - 48 8D 4D F8  - lea rcx,[rbp-08]
    
    RAX=00000000000007F7
    RBX=000000000125CD60
    RCX=0000000000000FA0
    RDX=00000000828087F3
    RSI=0000000001287960  <<<<<<
    RDI=0000000100258308
    RSP=000000000102F070
    RBP=000000000102F0B0
    RIP=000000010002D8DE
    R8=0000000100161BA0
    R9=00000000008E06A0
    R10=0000000000000002
    R11=0000000000000206
    R12=00000000012607C0
    R13=0000000100161BA0
    R14=0000000100258300
    R15=0000000100257A18
    

    我确实在基址的第一次扫描中发现了一个静态基数,但我记得这是一个虚假的基数。所以这里我们想要的是一个process.exe+offset形式的基址,你可以尝试其他看起来像module.dll+offset的基址,但我想说的是,在这里它们将被证明是错误的指针。是的,大多数较新的游戏都会有许多错误的值和指针。

    调试器从地址保持输出:0000000001287960

    10002D88B - E8 90961200 - call Tutorial-x86_64.exe+XXXXXX
    10002D890 - E9 65000000 - jmp Tutorial-x86_64.exe+XXXXXX
    10002D895 - 48 83 3E 00 - cmp qword ptr [rsi],00  <<<<<<
    10002D899 - 74 5F - je Tutorial-x86_64.exe+XXXXXX
    10002D89B - 48 8B 36  - mov rsi,[rsi]
    
    RAX=0000000000013117
    RBX=000000000125CD60
    RCX=000000000125CD60
    RDX=0000000000003CE3
    RSI=0000000002D6D540  <<<<<<
    RDI=0000000100258308
    RSP=000000000102F070
    RBP=000000000102F0B0
    RIP=000000010002D899
    R8=0000000100161BA0
    R9=00000000008E06A0
    R10=0000000000000002
    R11=0000000000000206
    R12=00000000012607C0
    R13=0000000100161BA0
    R14=0000000100258300
    R15=0000000100257A18
    

    调试器输出的地址保持:0000000002D6D540

    10002D845 - E8 D6961200 - call Tutorial-x86_64.exe+XXXXXX
    10002D84A - E9 AB000000 - jmp Tutorial-x86_64.exe+XXXXXX
    10002D84F - 48 83 7E 18 00 - cmp qword ptr [rsi+18],00  <<<<<<
    10002D854 - 0F84 A0000000 - je Tutorial-x86_64.exe+XXXXXX
    10002D85A - 48 8B 76 18  - mov rsi,[rsi+18]
    
    RAX=00000000000166D2
    RBX=000000000125CD60
    RCX=000000000125CD60
    RDX=000000000000302E
    RSI=0000000002D6CE40  <<<<<<
    RDI=0000000100258308
    RSP=000000000102F070
    RBP=000000000102F0B0
    RIP=000000010002D854
    R8=0000000100161BA0
    R9=00000000008E06A0
    R10=0000000000000002
    R11=0000000000000206
    R12=00000000012607C0
    R13=0000000100161BA0
    R14=0000000100258300
    R15=0000000100257A18
    

    调试器输出的地址保持:0000000002D6CE40

    10002D800 - E8 1B971200 - call Tutorial-x86_64.exe+XXXXXX
    10002D805 - E9 F0000000 - jmp Tutorial-x86_64.exe+XXXXXX
    10002D80A - 48 83 7E 10 00 - cmp qword ptr [rsi+10],00  <<<<<<
    10002D80F - 0F84 E5000000 - je Tutorial-x86_64.exe+XXXXXX
    10002D815 - 48 8B 76 10  - mov rsi,[rsi+10]
    
    RAX=000000000000B567
    RBX=000000000125CD60
    RCX=000000000125CD60
    RDX=00000000000050A1
    RSI=000000000123F1C0  <<<<<<
    RDI=0000000100258308
    RSP=000000000102F070
    RBP=000000000102F0B0
    RIP=000000010002D80F
    R8=0000000100161BA0
    R9=00000000008E06A0
    R10=0000000000000002
    R11=0000000000000206
    R12=00000000012607C0
    R13=0000000100161BA0
    R14=0000000100258300
    R15=0000000100257A18
    

    现在我们扫描该基址000000000123F1C0,您应该找到一个静态地址,但在实际游戏中,您将继续前进,直到找到静态基址。

    以该静态地址为基址,我的指针将如``[[[["Tutorial-x86_64.exe"+XXXXXX]+10]+18]+0]+18`所示。

    指针扫描可以通过首先找到所需值的地址,保存生成的指针映射,重新启动游戏,再次搜索地址,保存另一个指针映射,然后比较两者来快速解决此问题。

    找到指针后,将其冻结在 5000,然后单击更改指针按钮。如果您找到了正确的底座,则下一步按钮应在大约2秒后启用。因此,单击下一步按钮转到下一步。

    第九步:共享代码

    当您开始步骤 9 时,您应该会看到表单如下所示。

    因此,就像帮助文本所说的那样,解决方案远远不止一种。

    首先,我们需要找到其中一个地址并将其添加到表中。

    如果您在查找地址时遇到问题,请记住尝试不同的值类型,并且不要忘记开始新的扫描。

    然后,就像在步骤7中一样,我们想要查看访问地址的内容,以找到写入参与者运行状况的函数。

    如果您想尝试其他方式,请继续保存密码,这是本教程的最后一步。

    因此,在这里,最好了解我们实际上在寻找什么来区分盟友和战斗人员。

    当编写游戏或引擎时,演员和玩家可能会这样编写。

    //// Actor, base for all actors
    class Actor(object){
       string Name = 'Actor';
       Coord Coords = new Coord(0, 0, 0);
       float Health = 100.0;
       ...
    }
    //// Player
    class Player(Actor){ //// Player inherits form Actor
       string Name = 'Player';
       int Team = 1;
       ...
    }
    

    团队本身可以是一个结构,比如说,如果它被声明为一个对象类,比如Coords变量,我们希望寻找一个指向参与者团队结构的指针。

    因此,我们可以做到这一点的一种方法是在玩家结构中找到团队ID或团队结构。

    在球员结构中查找球队ID

    找到减少生命值的功能后。右键单击反汇编器视图窗体中的指令,然后选择找出此指令访问的地址。

    然后单击所有 4 个值的攻击按钮。调试器列表中应具有所有 4 个地址。

    因此,请继续将它们添加到地址列表中。

    然后,让我们打开剖析数据结构表单。

    你会得到一些弹出窗口,在想到它们之后,你应该看到这样的表单。请注意,我必须扩展窗体的宽度才能移动列。

    现在在我的偏移量上,0x10被猜测为一个指针,在64位进程中宽度为8字节。我看到0x10的指针的值看起来真的不像指针。

    因此,我必须将其切换到4字节,并添加一个新的元素集,其偏移量为具有4字节值类型的0x14。这通常是它的工作方式。

    所以在这里我们可以看到团队变量在结构的偏移0x14。

    现在我们需要向脚本添加一些注入代码,然后添加一些代码来检查结构的团队变量,以确定哪些参与者是盟友,哪些是战斗员。

    所以我们想要一些这样的。

    因此,启用此脚本后,当游戏写入演员健康时,以下是跳转到钩子代码后将发生的事情:

    • 1.保存(PUSH)RFLAGS寄存器,不是完全需要,但在比较时仍然是一个好习惯。
    • 2.检查演员是否在团队 1 中。如果 actor 在团队 1 中,则我们以浮点格式将新值设置为 5000。
    • 3.检查演员是否在团队 2 中。如果 actor 在团队 2 中,则我们将新值设置为 0,采用十六进制格式。(浮点数 0 == 整型 0 == 十六进制 0)
    • 4.恢复(POP)RFLAGS寄存器,如果寄存器是PUSHed的,这是完全需要的。

    启用此脚本后,单击重新启动游戏并自动播放按钮,然后您应该看到表单更改并如下所示。

    因此,单击下一步按钮以完成本教程。然后,您应该会看到一个表单,告诉您已完成本教程。

    在寄存器中发现差异

    找到减少生命值的功能后。

    右键单击反汇编器视图窗体中的指令,然后选择找出此指令访问的地址。

    然后单击所有 4 个值的攻击按钮。

    调试器列表中应具有所有 4 个地址。

    现在让我们看看登记册,看看我们是否能找到盟友和战斗人员的差异。

    单独选择每个地址,然后按 Ctrl+R

    排列表单以使其更易于比较。

    因此,在这里我们可以看到战斗人员的RSI为1。

    所以像这样的脚本应该可以工作。

    因此,启用此脚本后,当游戏写入演员健康时,以下是跳转到钩子代码后将发生的事情:

    • 1.保存(PUSH)RFLAGS寄存器,不是完全需要,但在比较时仍然是一个好习惯。

    • 2.检查 RSI 寄存器是否为

      • 1,如果 RSI 寄存器为 则我们将新值设置为十六进制格式的 0。(浮点数 0 == 整型 0 == 十六进制 0)
      • 2,如果 RSI 寄存器不是 1,那么我们假设 actor 是盟友,因此我们以浮点格式将新值设置为 5000。
    • 3.恢复(POP)RFLAGS寄存器,如果寄存器是PUSHed的,这是完全需要的。

    启用此脚本后,单击重新启动游戏并自动播放按钮,然后您应该看到表单更改并如下所示。

    因此,单击下一步按钮以完成本教程。

    然后,您应该会看到一个表单,告诉您已完成本教程。

  • 相关阅读:
    Python学习第15天_模块
    Python学习第14天_文件读取写入
    Python学习第13天_练习(图书馆的创建)
    Python学习第12天_类
    Python学习第11天_参数
    Python学习第10天_函数
    Python学习第九天_模块的应用
    Android Bluetooth HIDL服务分析
    Mac下CLion配置Google GTest小结
    MacOS通过homebrew安装老版本的软件
  • 原文地址:https://www.cnblogs.com/LyShark/p/16486244.html
Copyright © 2020-2023  润新知