<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>逆向工程 on Vortex's Blog</title><link>https://3133q.github.io/tags/%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B/</link><description>Recent content in 逆向工程 on Vortex's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 23 Sep 2026 14:20:00 +0800</lastBuildDate><atom:link href="https://3133q.github.io/tags/%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>笔记：Cheat Engine 基础整理</title><link>https://3133q.github.io/p/cheat-engine-notes/</link><pubDate>Wed, 23 Sep 2026 14:20:00 +0800</pubDate><guid>https://3133q.github.io/p/cheat-engine-notes/</guid><description>&lt;img src="https://3133q.github.io/covers/03.jpg" alt="Featured image of post 笔记：Cheat Engine 基础整理" /&gt;&lt;h2 id="概述"&gt;概述&#10;&lt;/h2&gt;&lt;p&gt;Cheat Engine 简称 CE，是一款非常著名的开源内存扫描工具、十六进制编辑器和调试器。它由 Eric Heijnen（网名 Dark Byte）开发，主要用于修改单机电脑游戏中的数据，但也广泛应用于软件逆向工程、调试和安全测试。&lt;/p&gt;&#10;&lt;h2 id="1-核心工作原理"&gt;1. 核心工作原理&#10;&lt;/h2&gt;&lt;p&gt;游戏或软件在运行时，会将数据（如玩家的生命值、金钱、弹药量等）临时存储在电脑的内存（RAM）中。Cheat Engine 的核心功能就是&lt;strong&gt;读取和修改这些内存数据&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;扫描与筛选&lt;/strong&gt;：假设你在游戏中拥有 100 枚金币。你可以在 CE 中搜索数字“100”。CE 会在内存中找出成千上万个值为 100 的地址。接着，你在游戏里花掉一些金币，剩下 85 枚。你再在 CE 中搜索“85”，CE 就会在刚才的搜索结果中筛选出变化为 85 的地址。重复几次后，你就能精确定位到控制金币数量的那个唯一内存地址。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;修改与锁定&lt;/strong&gt;：找到地址后，你可以把 85 改成 999999，游戏里的金币就会瞬间暴涨。你还可以将其“锁定（Freeze）”，这样即使游戏试图扣除金币，数值也会保持不变（实现无限金钱或无敌）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-主要功能"&gt;2. 主要功能&#10;&lt;/h2&gt;&lt;p&gt;除了基础的数值修改，CE 还是一个功能强大的底层分析工具：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;内存扫描器 (Memory Scanner)&lt;/strong&gt;：支持各种数据类型（整数、浮点数、字符串等），也支持“未知初始值”扫描（比如游戏里只显示血条没有具体数字时，可以通过血量“减少”或“增加”来进行模糊搜索）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;调试器 (Debugger)&lt;/strong&gt;：可以找出是哪些程序代码（汇编指令）在读取或写入你找到的内存地址。这对于制作高级修改脚本至关重要。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;变速齿轮 (Speedhack)&lt;/strong&gt;：可以加快或减慢目标程序的运行速度。常用来跳过漫长的游戏过场动画，或者在动作游戏中放慢速度以完成高难度操作。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;指针扫描 (Pointer Scanner)&lt;/strong&gt;：现代操作系统和游戏为了安全，每次启动时数据的内存地址都会发生变化（动态内存分配）。指针扫描可以帮助用户找到固定的“基址（Base Address）”，从而制作出每次启动游戏都能直接使用的修改器（Trainer）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;脚本引擎 (Auto Assembler &amp;amp; Lua)&lt;/strong&gt;：允许高级用户编写汇编脚本或 Lua 脚本，实现更复杂的逻辑修改，甚至打包生成独立的修改器（.exe 文件）分享给别人。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-应用场景"&gt;3. 应用场景&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;单机游戏修改&lt;/strong&gt;：这是最常见的用途，玩家用来降低游戏难度、跳过重复刷怪（肝）的过程。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;软件逆向工程&lt;/strong&gt;：程序员和安全研究人员使用 CE 来分析未知软件的内部运作机制。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;学习汇编语言与计算机基础&lt;/strong&gt;：CE 自带了一个包含多个关卡的“闯关教程（Tutorial）”，非常适合新手通过实践来学习内存结构、指针、汇编语言等计算机底层知识。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="拓展"&gt;拓展&#10;&lt;/h2&gt;&lt;h3 id="rpg-maker"&gt;RPG Maker&#10;&lt;/h3&gt;&lt;p&gt;中文常译为 RPG 制作大师，是由日本 Enterbrain（现为角川集团旗下）开发的一系列**“低代码/无代码”游戏引擎**&lt;/p&gt;&#10;&lt;p&gt;初衷：让完全不懂编程的人，也能做出属于自己的王道 JRPG，它自带了海量的地图图块、音乐、战斗系统，你只需要像“搭积木”一样把它们拼起来。&lt;/p&gt;&#10;&lt;p&gt;虽然门槛极低，但它却诞生了无数神作，比如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;催泪神作：&lt;/strong&gt; 《去月球 (To the Moon)》、《寻找天堂》&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;心理恐怖/微恐解谜：&lt;/strong&gt; 《Omori》、《恐怖美术馆 (Ib)》、《青鬼》、《杀戮的天使》、《魔女之家》、《尸体派对》&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="ctf-中应用"&gt;CTF 中应用&#10;&lt;/h4&gt;&lt;h5 id="考点-aruby-语言的内存奇葩机制"&gt;考点 A：Ruby 语言的内存奇葩机制&#10;&lt;/h5&gt;&lt;p&gt;在搜内存时，往往需要把数字**“乘 2 加 1”**，你肯定觉得很奇怪，为什么不直接存数字，而非要存这样的式子？&lt;/p&gt;&#10;&lt;p&gt;因为对于 &lt;strong&gt;RPG Maker VX Ace&lt;/strong&gt;，它的底层脚本语言是 &lt;strong&gt;Ruby&lt;/strong&gt;。&#10;比如，在 C 语言或 C++ 里，数字 600 在内存里就是 600（二进制 0000 0258）。&#10;但在 Ruby 语言里，&lt;strong&gt;“万物皆对象”&lt;/strong&gt;。为了在内存中区分“这是一个对象指针”还是“这是一个极小的整数（Fixnum）”，Ruby 的底层引擎做了一个极客的设定：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;它把整数向左移动 1 位（相当于&lt;strong&gt;乘 2&lt;/strong&gt;）&lt;/li&gt;&#10;&lt;li&gt;然后把二进制的最后一位强制标记为 1（相当于&lt;strong&gt;加 1&lt;/strong&gt;）&lt;/li&gt;&#10;&lt;li&gt;当系统读取到一个内存地址，发现最后一位是 1 时，它就知道：“哦，这不是个指针，这是个整数，我把它减去 1 再除以 2 就能得到真实的数字了。”&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这就是为什么在 XP、VX、VX Ace 版本的 RM 游戏里，用 CE 永远搜不到面板数字的真相！&lt;strong&gt;这就叫逆向工程中的“数据结构识别”！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h5 id="考点-b极其死板的逻辑控制事件开关变量"&gt;考点 B：极其死板的逻辑控制（事件、开关、变量）&#10;&lt;/h5&gt;&lt;p&gt;RM 游戏没有复杂的物理引擎，它的世界运转全靠三个东西：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;开关 (Switches)：&lt;/strong&gt; 只有 True 和 False。比如 开关001：宝箱是否打开、开关002：BOSS 是否死亡。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;变量 (Variables)：&lt;/strong&gt; 存放整数。比如 变量001：收集到的硬币数、变量002：好感度。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;事件 (Events)：&lt;/strong&gt; 地图上的 NPC、宝箱、门，全叫事件。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;在更高级的 CTF 题中，出题人会把 FLAG 藏在某个事件里，并设置条件：只有当 变量051 == 9999 且 开关008 为 True 时，NPC 才会把 FLAG 告诉你。&#10;这时候，用 CE 动态改内存，或者用存档编辑器直接改变量，就成了破局的钥匙。&lt;/p&gt;&#10;&lt;h5 id="考点-c伪加密与解包-unpacking"&gt;考点 C：伪加密与解包 (Unpacking)&#10;&lt;/h5&gt;&lt;p&gt;比如说 &lt;strong&gt;Game.rgss3a&lt;/strong&gt; 文件，是 RM 游戏的“加密包”，里面打包了所有的图片、音乐和&lt;strong&gt;核心代码脚本&lt;/strong&gt;。&#10;这种加密非常薄弱。在逆向安全领域，有很多开源工具（比如 RPGMakerDecrypter）可以一键把这个 .rgss3a 文件解包。&#10;解包后，你可以直接拿到游戏的源代码。很多 CTF 选手甚至懒得打开游戏，直接用文本编辑器搜索解包后的源代码，三秒钟就能找到写在代码里的 FLAG！&lt;/p&gt;&#10;</description></item></channel></rss>