Cheat Engine Tutorial 闯关手记 第八关

本文介绍如何使用C语言脚本注入技术在特定游戏教程中实现时间敏感型血量调整功能,详细解释了从获取当前时间、判断时间条件到修改血量代码的全过程,包括使用CE内存查看器和自动汇编窗口完成代码注入,以及验证调整效果的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 转载自 76512

 

    步骤 9:注入++ (PW=31337157)

       这一步基本上和步骤 7(代码注入,手记中的第六关)的做法是相似的,不过会稍稍有点难度。

       本关你必须用一小段代码来修改减少血值的原代码,并且做到,如果当前时间的秒数大于或等于 30 将血值设置为1000,如果当前时间的秒数小于 30 将血值设置为 2000。

       我们可以用 API 调用函数获取当前的时间,并利用 自动汇编 完成这项任务,但这里好象有更简单的做法:C语言脚本注入。

        找到血量的地址,然后打开 CE 脚本引擎 (内存查看器窗口 快捷键:ctrl+alt+a ,或是点击 工具->脚本引擎)。

       然后,和其它的教程不同的是,这在里我会多给你一些提示(假设你从未接触过C语言)。

       ----------------
       #include <time.h>

       struct tm *timep;
       time_t c;
       c=time(0);

       timep=localtime(&c);

       if (timep->tm_sec>=30)
         *(int *)addresstochange=1000;
       else
           *(int *)addresstochange=2000;
       -------------

       使用血值的地址替换代码中的 addresstochange,另外,不要忘记在地址的前面加上 0x 。比如,地址是 0012345,则输入 0x0012345


       选择 "注入" ,"注入到当前进程" ,将代码注入到当前进程,此时,"自动汇编"窗口 弹出,并自动生成调用代码(Call)。

       现在,就象步骤 7 (手记中的第六关)那样,在 "内存查看器"窗口 选择代码地址,在 "自动汇编"窗口 选择 "模板","代码注入",输入刚才获取的调用代码(Call)。 要注意的是,调用代码(Call)将更改 寄存器 EAX 的数据,因此,有必要的话,你应该在压栈之前和出栈之后保存它, 你也可以将原代码移除,它在这里也起不到什么作用了。

       点击 "执行" ,点击 Tutorial.exe 窗口上 "Hit me" 。

       如果没什么问题的话,血值会按照当前的时间变动。

       额外信息:

       正如前面所说,CE 支持标准的汇编语言。所以,你可以在代码中使用函数名称来调用函数。

       你也可以在脚本中引用 DLL 文件,例如:

       injectdll(mydll.dll) // 可以使用你喜欢的语言去写DLL文件

       codecave:
       call functionofmydll
       jmp exit

       这一关,多少得了解一点点的C语言,不过,作者怕我们没有接触过C语言,给了我们一段C语言的代码,在说明的结尾又告诉我们,可以引用我们自己用任何语言写的DLL文件,增加CE脚本的灵活性;虽然有点头蒙,不过完成本关不需要那么麻烦,还是一步一步的来。

       我们先查找 Tutorial.exe 中的数值地址,找到后,"查看写入该地址的代码",点击 Tutorial.exe 中的 "Hit me" ,"显示反汇编",如下图:


       在 "内存查看器"窗口 中打开 "脚本引擎" ,如下图:


       在 "脚本引擎" 窗口 填入说明中的那段代码,并将 addresstochange 替换成我们查找到的数值地址,如下图:

       你可以按上图在原代码中加入 红框标识出的 代码(声名变量并赋值,值为地址,记得地址前要加 0x),也可以直接用地址替换掉 addresstochange ;将写好后的代码注入当前进程,如下图:

       在打开的 "自动汇编"窗口 中 生成了调用代码,如下图:


       在 "内存查看器" 选择查找到的汇编地址,回到 "自动汇编"窗口 选择 "模板" 中的 "代码注入",如下图:

       CE 自动将选择的汇编地址填入(如果不正确,可以手动填写),如下图:


       "确定" ,生成如下图代码:


       我们需要将代码修改一下,将 call 这一条放置在 newmem 区域,将原代码注销掉,如下图:

       小提示:好多网友在这段代码改写完,出现了结果为 999 或 1999 的这种情况,这可能是我没标注清楚的原因,请大家留意上图中代码 "dec [ebx+00000318]" 前边我添加了 "//" ,这表示将这条代码注释掉了,好多网友出现了这种情况应该都是忘了注释掉它的结果;感谢 78461 网友的提醒!


      原理在第六关已解释过了,在这就不多讲了吧,点击 "执行" ,回到 "内存查看器" 窗口,可以看到,原代码地址处的代码已修改,如下图:


       OK,我们已完成代码段的注入,现在可以点击 "Hit me" 了,说明中给出的C语言代码,是调用了本地的时间,如果秒数大于等于30秒,就将血加到 1000 ,小于30秒,将血加到2000,如果一切没问题的话,next 按钮激活。我给出两张不同时间的对比图:

       点击 next 按钮,通关画面,,可惜不是动画的……

       至此,教学八关就完成了,但这仅仅是个基础,有空我们再研究如何实战,以及如何制作游戏的修改器~

<think>嗯,用户现在在询问Cheat Engine 7.4第四的教程或解决方案。首先,我需要回忆一下Cheat Engine这个软件的使用方法,特别是第七的结构。不过用户提到的是第四,可能是指教程中的第四步?因为通常Cheat Engine的教程卡是按步骤编号的,比如第一步到第七步,每步可能有不同的挑战。需要确认用户是否指的是教程的第四步,而不是某个版本中的第四。比如,Cheat Engine自带的教程有多个步骤,第四步可能涉及指针扫描或者更复杂的内存查找。 根据用户之前提供的引用内容,他们在之前的问题中提到了健康值的搜索方法,即通过首次扫描未知数值,然后射击靶子,搜索减少的数值,重复操作直到找到正确的地址。这可能是在教程的某一中,用户需要找到并修改目标的生命值或健康值。而第四可能涉及更复杂的机制,比如动态地址或者指针寻址,因为前面的步骤可能已经覆盖了基础扫描和变化值查找。 用户提供的引用[1]中提到了使用CE进行数值扫描的方法,包括首次扫描未知数值,射击后搜索减少的数值,并可能穿插不射中的操作来排除干扰。这可能与第四的挑战相,比如需要处理地址变化或者多层指针的问题。此外,引用[2]中提到的Secret对象的数据处理方式可能与当前问题无,但用户可能之前在讨论其他问题时提到了Kubernetes,但当前焦点是CE。 接下来,我需要确定第四的具体挑战是什么。通常,Cheat Engine教程的第四步会引入指针的概念,要求用户通过指针扫描来找到基址和偏移量,从而定位动态变化的内存地址。例如,当直接搜索健康值的地址后,发现每次重新开始游戏时地址会变化,这时候就需要通过指针来找到静态的基址,加上偏移量来定位实际存储数值的地址。 因此,解决方案可能包括以下步骤:首先找到健康值的当前地址,然后使用指针扫描工具来查找指向该地址的指针链,分析找到的指针结构,确定基址和偏移量,最后将地址添加到地址列表并进行锁定或修改。同时,用户可能需要处理多层指针或者多个偏移量,这时候需要耐心测试不同的组合。 另外,用户可能需要处理的是,当直接修改健康值后,游戏可能会检测到数值异常,导致需要绕过反作弊机制。但根据教程的设计,第四步更可能侧重于指针扫描而不是反作弊,所以重点应放在指针扫描步骤上。 总结下来,回答需要分步骤说明如何找到动态地址,如何使用指针扫描,如何确定正确的基址和偏移,以及如何验证和应用这些信息。同时,根据用户之前的引用,可能需要结合减少值扫描和排除干扰的方法,确保找到正确的指针链。 此外,用户可能需要相的扩展问题,比如如何处理多级指针、如何验证指针的正确性,或者在其他游戏中应用类似的方法。因此,生成的问题可以围绕指针扫描的优化、处理动态地址的其他方法,以及不同游戏中的应用场景展开。</think>根据Cheat Engine教程第四的常见设计特点(涉及动态地址与指针寻址),以下是分步解决方案: ### 核心步骤 1. **定位健康值动态地址** - 使用基础扫描:选择`未知初始值`→射击靶子→搜索`减少的数值`→重复直到找到当前地址[^1] - 确认地址有效性:修改数值观察靶子血条是否变化 2. **启动指针扫描** - 右键选中找到的地址→`找出是什么改写了这个地址` - 点击`Pointer scan`按钮→设置扫描范围(默认即可)→生成指针扫描结果 3. **分析指针链** - 筛选出绿色条目(静态基址) - 检查偏移量模式(如`base+10→+C→+4`) - 记录稳定的基址与偏移组合 4. **添加指针表达式** - 手动添加地址→勾选`Pointer`→输入`基址 + 偏移量链` - 示例表达式:`"game.exe"+3A45B0 + 10 + C` 5. **锁定数值** - 启用冻结功能→设置目标数值(如5000) - 验证:多次重置卡后血条仍保持锁定状态 ```python # 伪代码示例:指针解析过程 base_address = get_module_base("game.exe") offset_chain = [0x3A45B0, 0x10, 0xC] current_address = base_address for offset in offset_chain: current_address = read_memory(current_address + offset) health_value = read_memory(current_address) ``` ### 键验证点 - 重启游戏/卡后,指针表达式仍有效 - 修改数值后游戏无异常崩溃 - 冻结功能可抵抗血条自然衰减
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值