ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Cheat Engine 编译核心:Lazarus 与 FPC 版本匹配技巧

2026/9/18 9:39:08 拓冰建站 浏览量
Cheat Engine 编译核心:Lazarus 与 FPC 版本匹配技巧 先说结论Cheat Engine 7.2 和 7.5 的编译流程核心是搞定 Lazarus 和 FPC 的版本匹配其它都是小问题。但“其它都是小问题”这句话背后是我从 Lazarus 2.0.x 一路试到 2.2.6踩了十几个编译错误、重装了三遍环境之后才得出的。这篇东西就是把我这两天的完整过程、每个报错的定位思路和最后能稳定编译的配置全部摊开写出来给后面要自己动手编 CE 的人省点时间。Cheat Engine 本身是开源项目源码在 GitHub 上可以直接拿到但很多人在第一步就被“用 Delphi 还是 Lazarus”“要不要装 VS”“为什么 7.5 用老版本 Lazarus 编不过去”这些问题拦住。我这次把 7.2 和 7.5 各编了一遍Windows 和 Linux 两个平台也都跑通了。下面按我的实际操作顺序来讲不是抄官方 Wiki是我自己验证过、能落地的流程。1. 为什么折腾源码编译官方安装包给不了的东西很多人会先问我一句官方论坛不是直接有安装包吗下载解压就能用何必从头编译这个问题的答案其实分三层。第一层是信任问题。CE 是个调试器也是内存扫描工具这类工具你要往系统里加载最好自己知道里面每一行代码在干什么。官方发布的二进制虽然经过签名但毕竟不是所有用户都有能力逆向验证。自己编译相当于把整个构建过程暴露在阳光下哪怕你不逐行读源码至少可以确认这个 exe 是从我刚拉下来的源码编出来的不是被塞了私货的版本。第二层是定制需求。CE 7.x 之后加入了 Lua 脚本环境大量功能可以通过脚本实现但有些行为是写在 Pascal 源码里的。比如我需要在内存 View 里加一个自定义的解析器或者改掉默认的字体渲染方式这些不改源码做不到。官方安装包是一锤子买卖想改就得编译。第三层是学习价值。CE 的代码质量在开源逆向工具里算很高的它内部集成了 Windows 调试 API、Veh 调试器、DBK 内核驱动、Lua 脚本引擎、符号处理、Mono/Net 数据采集器这些东西单拆出来每一个都是能写一本书的主题。编译它就是把这些模块之间怎么组织、怎么协作的过程完整走了一遍。说实话把一个 CE 源码结构看懂比看十篇讲“内存断点原理”的文章都管用。所以别嫌折腾编译 CE 这件事本身就是在学逆向工程的工程化组织方式。后面我会把源码目录结构也梳理一遍你看完就知道 CE 不是一个“一个 exe 打天下”的玩具项目它是一整套工具链。2. 环境选型7.2 和 7.5 对工具链的要求完全不一样先说最影响成败的一点Cheat Engine 不是用 Visual Studio 写的。核心部分是 Free Pascal Lazarus虽然有 DBK 驱动是 C/C 工程但默认用户态编译根本不需要打开 VS。很多第一次编译的人第一反应去装 VS2010、VS2019结果毫无用处还跑出一个 msb6006 的报错白白浪费半天。2.1 7.2 的推荐搭配CE 7.2 是 2020 年底发布的版本对应的 Lazarus 版本比较老。我实际测试下来用以下组合最稳Lazarus 2.0.10 FPC 3.2.0编译平台Windows x64 或 x86不需要额外装任何 SDK这个组合下7.2 基本是“拉下来直接就能编过”。如果你用更高的 Lazarus 2.2.x 去编 7.2有概率会碰到一些 LCL 类型定义不一致的问题比如TList泛型化相关的方法签名变了虽然也能改但没必要给自己找麻烦。2.2 7.5 的推荐搭配7.5 的源码更新对工具链的要求也水涨船高。我测试时用的组合是Lazarus 2.2.6 FPC 3.2.2编译平台Windows x64建议装完 Lazarus 后确认 FPC 版本号能对上7.5 的代码里用到了不少新版 FPC 才提供的特性。我之前用 Lazarus 2.0.10 编 7.5报了一堆unit not found比如找不到lazutils.StrUtils之类。这不是源码缺文件而是旧版 Lazarus 自带的 FPC 库没有这些新单元。所以 7.5 如果编不过十有八九先检查环境版本而不是去改代码。2.3 版本对应关系背后的原理为什么 CE 对 Lazarus/FPC 版本这么敏感因为 CE 的界面层大量依赖 Lazarus 的 LCL 组件库而 LCL 在不同版本之间 API 并不完全兼容。FPC 的 RTL 和 FCL 库也在持续演进新增单元、改函数签名是常态。CE 官方不可能为一个版本维护多套代码所以它只保证在某个范围内的编译器版本下能通过。打个比方这就像你拿新版 GCC 去编译一个依赖旧版头文件的 C 项目大概率会遇到implicit declaration警告甚至直接报错。不是你代码不行是工具链版本错配。CE 编译最大的坑也就在这版本不对后面的所有努力都是白费。3. 操作流程拉源码、开工程、出 exe环境装好之后编译本身其实不复杂。我把完整流程拆成几个步骤每一步的注意事项写清楚。3.1 获取源码与目录结构CE 的源码托管在 GitHub仓库名就是 cheat-engine/cheat-engine。你可以用 git 拉也可以直接下对应版本的 zip 包git clone https://github.com/cheat-engine/cheat-engine.git拉下来之后你会看到根目录下有一堆文件夹。其中最核心的是Cheat Engine这个子目录里面放着主程序的 Lazarus 工程。其它目录也用得上目录作用Cheat Engine主程序源码含 CheatEngine.lpi 工程文件CEClientCE 客户端用于连接 CE 服务和共享内存DBK内核驱动源码C/C 工程默认不参与编译Tutorial官方培训教程程序的源码Cheat Component一些可复用的组件库和第三方工具我第一次编译时犯了个错误直接打开根目录下的某个.lpi乱找结果工程加载报错。后来才搞清楚7.2 和 7.5 的主工程文件都在Cheat Engine/CheatEngine.lpi。你只要在 Lazarus 里 File - Open 打开这个文件就行。3.2 在 Lazarus 里设置好目标和平台打开工程后先不要急着按 F9 编译先确认两个关键配置。第一是 FPC 源目录。位置在 Lazarus 菜单Tools - Options - Files - FPC Source Directory。这里要填你安装的 FPC 源码路径。Windows 下一般长这样C:\lazarus\fpc\3.2.2\source如果这个路径没填对或者填成了编译器的 bin 目录后面会报一堆找不到系统单元的错误。这是小白最容易忽略的点。第二是编译目标 CPU 架构。CE 编译时可以选 x86_64 或 i386位置在Project - Project Options - Compiler Options - Config and Target - Target CPU family。这里需要说明一下如果你想编 64 位 CE就直接用 64 位 Lazarus选x86_64如果你要编 32 位 CE需要用 32 位版本 Lazarus选i386。不建议用交叉编译方式在 64 位 Lazarus 里编 32 位程序因为 CE 用了一些平台相关的汇编代码交叉编译环境不好调直接用对应位数的 IDE 最省心。3.3 编译并定位输出文件配置好之后按 ShiftF9 编译不带运行或者直接按 F9 编译并运行。第一次编译会花几分钟因为 FPC 要重新编译大量 RTL 单元。之后增量编译就很快了。编译成功后可执行文件默认会生成在源码目录下的output文件夹里也可能是Cheat Engine\output具体看工程配置。Windows 下生成的文件名一般是cheatengine-x86_64.exe64 位或cheatengine-i386.exe32 位。你可以右键 exe - 属性 - 详细信息确认版本号是 7.5 还是 7.2。如果你不想跑起来只想要一个 Portable 版本这一步就够用了。编译出的 exe 不依赖安装包拷贝到其它机器上能直接跑。4. Linux 下编译 CE依赖比 Windows 更多但没那么可怕CE 从 7.x 开始官方支持 Linux很多人在 Windows 上编完后想试试 Linux 版结果卡在依赖安装上。我在 Ubuntu 22.04 下编译 7.5 的过程如下。4.1 安装 Lazarus、FPC 和依赖包先装基础环境sudo apt update sudo apt install lazarus fp-compiler fp-units-rtl这里有个要注意的地方Ubuntu 仓库里的 Lazarus 版本可能比较老比如 22.04 自带的是 2.2.6 左右编译 7.5 勉强够。如果你发现版本太老建议从 Lazarus 官网下载新版 deb 包不要硬编。CE 的界面依赖 GTK2再加上它还要读取libcurl、libsqlite3之类的库所以还需要这些开发包sudo apt install libgtk2.0-dev libcurl4-openssl-dev libsqlite3-dev4.2 Linux 编译和 Windows 的差异打开工程后Lazarus 会根据当前系统自动选择 Linux 目标通常不需要手动改 OS。但有几个点要留意CE 在 Linux 下默认用的是ptrace调试机制编译时不需要额外的驱动DBK 目录完全不用管。如果你用的发行版不是 Ubuntu/Debian 系包管理器安装的命令可能不一样但依赖库的名字差别不大。Linux 下编译速度通常比 Windows 快一些因为 FPC 全量编译时磁盘占用更小。我第一次在 Ubuntu 上编 CE 时漏装了 libgtk2.0-dev结果编译到 GUI 部分直接报cannot find -lgtk-x11-2.0。这个问题只看源码根本查不出来必须确认开发库装了。很多从 Window 转到 Linux 编译的人都会栽在这建议编译前先把依赖库一次装齐。4.3 Linux 下运行自测Linux 版编译成功后直接在终端执行./cheatengine-x86_64如果界面能正常弹出来就说明编译成功。需要注意的是Linux 版 CE 在 Wayland 会话下可能显示异常建议用 Xorg/X11 会话跑这是 CE 本身在 Linux 下的兼容问题不是编译导致的。5. 编译期高频报错排查实录这一节是我最想写的因为网上关于 CE 编译报错的讨论很零散而实际编译时踩的坑就那么几个。我把它们按出现频率从高到低列出来每个都给出定位思路而不是只给答案。5.1 msb6006 cmd.exe 已退出代码为 3 —— 几乎都是环境问题首先这一点必须说明如果你只是编译用户态 CELazarus 主工程根本不会碰到 msb6006。这个报错几乎都出现在用 Visual Studio 编译 DBK 驱动工程时或者某些人试图在 VS 里打开 CE 的 C/C 项目时。“cmd.exe 已退出代码为 3”这个提示很误导它只是说某个命令执行失败了真正的错误信息往往在上面几百行的日志里。我的排查套路是不要盯着 msb6006 本身往上看日志找到真正失败的步骤。最常见的原因是 WDKWindows Driver Kit没装或者装的版本和 DBK 工程不匹配。DBK 是内核驱动编它需要 WDK 对应版本的库文件。其次是路径问题。工程里的中间目录用了带空格的路径或者源码放在中文目录下cmd.exe 解析时出错。最后可能是杀毒软件拦截了 cmd.exe 调用。CE 的驱动代码行为太像恶意程序某些安全软件会直接阻止编译工具链创建子进程。如果你只是想要一个能用的 CEDBK 驱动其实不是必需的。CE 7.x 默认使用 VEH 调试器不装 DBK 也能完成绝大多数内存调试操作。所以遇到 msb6006 别慌跳过驱动部分把 Lazarus 工程编出来功能完全够用。5.2 unit not found版本错配的重灾区这类报错的表现形式很多什么Fatal: Cannot find unit xxx、unit not found: lazutils.TimerSupport、cannot find unit interfaces。我见过有人因为这个重装了三次系统实际上就是环境版本不对。比如你用 Lazarus 2.0.10 编 CE 7.5自带的 FPC 3.2.0 缺少 7.5 源码引用的新单元于是报unit not found。这种错误用搜索引擎很难查到因为不同 CE 版本需要的单元不一样但根因非常一致Lazarus/FPC 版本低于项目要求。修复方式是先把 Lazarus 版本升到官方推荐的版本7.5 建议 2.2.6 FPC 3.2.2然后重新编译。别指望手动拷贝几个缺失的.ppu文件能解决因为版本不匹配会导致编译出的单元二进制格式不一致拷过来也是白搭。5.3 资源文件与 LFM 界面描述编译失败CE 的界面全部用 Lazarus 的 .lfm 文件描述编译时 LRSLazarus Resource工具会把 .lfm 转成二进制资源。如果 .lfm 文件里有新版 Lazarus 不认识的属性就会在编译资源阶段报错比如CheatEngine.lfm(123,4) Error: Unknown property TForm1.Padding这类问题的原因基本是源码里的 .lfm 是用新版 Lazarus 写的但你的 IDE 版本太旧不认识新增的属性。解决方法和上面一样升级 Lazarus。反过来如果你用新版 Lazarus 编老版本 CE 的源码也可能因为某些旧属性被移除而报错。所以版本匹配这个事真的是第一优先级。5.4 32 位与 64 位工程混乱CE 源码里的两套目标经常让人绕晕。你把源码拉下来后默认工程可能是 32 位也可能是 64 位取决于当时作者提交时的状态。如果编译出来运行提示“不是有效的 Win32 应用程序”说明你目标平台选错了。解决办法是在 Project Options 里显式指定 Target CPU family 和 Target OS。Windows 上如果直接下载的是 64 位版本编译时选 x86_64 就行如果你需要 32 位并且 IDE 是 64 位最好老老实实再装一个 32 位 Lazarus两个 IDE 可以共存不用卸载。5.5 编译通过但启动报缺少 DLL这类问题出现在编译成功之后运行 exe 时提示缺少某个 DLL比如libcurl.dll或lua54.dll。CE 源码里部分第三方库是动态加载的编译时不会自动把 DLL 复制到输出目录。解决办法是去 CE 的源码目录里找对应的 DLL 文件。CE 官方源码会带上运行所需的动态库通常在Cheat Engine\或者resources目录下。你把这几个 DLL 复制到 exe 同一目录即可lua54.dll libcurl.dll sqlite3.dllWindows 下我用的是 CE 源码自带的 dllLinux 则是直接用系统的 .so 库。总的来说编译成功只是第一步运行环境缺库是另一个坑别以为 exe 编出来就万事大吉。6. 编译完成后的验证、使用与二次开发入口编译完成不代表真的能干活我一般会按这个顺序测试。6.1 自测流程打开 CE看 About 里的版本号是否和源码版本一致。附加到一个普通进程比如记事本看能不能正常读取内存和扫描数值。切到 Memory View随便跳到某个模块地址看反汇编窗口是否正常工作。跑一遍 Lua 脚本比如执行print(getAddress(kernel32.dll))确认脚本引擎没被静态编译漏掉。如果这些都没问题说明主要模块编译完整。CE 的 Lua 引擎是内置在二进制里的编译后不会有单独脚本文件所以能执行 Lua 语句就说明集成成功。6.2 便携版整理自己编译完 CE 后如果想做成便携版可以按这个方式整理目录CE-Portable/ cheatengine-x86_64.exe lua54.dll libcurl.dll sqlite3.dll dbk64.sys # 如果编译了驱动的用户态部分值得注意的是官方安装包会额外创建一些目录和配置文件但便携模式下 CE 会自动在当前目录生成配置。把编译出的 exe 和依赖 dll 放在同一个文件夹里运行一次就会自动生成Cheat Engine的配置目录不需要安装程序。6.3 源码结构和二次开发入口如果你编译 CE 不仅仅是为了用还想改点东西我建议按这个顺序看源码结构Cheat Engine/主程序目录里面最大的是MainUnit.pas对应主界面。Cheat Engine/MemoryViewUnit.pas对应内存查看窗口很多逆向功能都在这里。Cheat Engine/ProcessListUnit.pas进程列表窗口。Cheat Engine/lua相关目录是 Lua 引擎的封装层CE 环境和脚本指令的绑定都在这里。想加一个自定义脚本函数入口一般在LuaHandler.pas或者luaengine.pas里面找到lua_register就能看到所有注册给脚本的函数列表。照着现有函数写一个注册调用重新编译你的自定义 Lua API 就生效了。这是我目前玩 CE 源码感觉最有意思的点。7. 给新人的几条实用建议最后说几条我在实际操作中的体会不一定都写在官方文档里但很实用。第一版本的坑不要自己死磕。CE 源码的 README 或者 GitHub Wiki 一般会写推荐的 Lazarus 版本直接按推荐来。用比我推荐更新的版本不一定有好处反而可能踩到 CE 还没适配的新 API。稳定编译比追新重要。第二装完 Lazarus 后先编一个空项目确认 FPC 源目录配置正确再打开 CE 工程。如果你连一个空窗口程序都编不出来那问题不在 CE 而在环境。这一步能帮你把时间花在真正的问题上。第三编译时把杀毒软件关了或者加白名单。CE 的代码特征太明显不少安全软件会在编译中途直接删除生成的 exe 或者拦截进程创建。我第一次编的时候Windows Defender 把编译产物给删了我还以为自己代码有问题排查了半小时。第四遇到报错往下刨不要只搜报错信息。很多编译错误都有“真实错误”和“表象错误”两层。比如 msb6006 是表象真实错误可能是 WDK 没装。养成先看完整日志、再搜索最小错误关键字的习惯会让你少走很多弯路。第五如果只是日常用没必要每版都自己编译。想省事直接用官方安装包自己编译更多是为了定制和学习。我后面整理的二次开发入口和源码结构目的就是让你把这个工具变成“自己的”。编译这块折腾一次就够了剩下的时间应该花在研究 CE 强大的调试和内存分析能力上。所有流程和报错基本上就这些。CE 7.2 和 7.5 编译说难不难说简单也真不简单。最核心的还是把工具链版本搞定后面就是点几个按钮的事。希望这篇踩坑记录能把你从环境地狱里捞出来。