news 2026/5/10 9:43:56

CE逆向Eternium:LUA脚本破解异或加密与内存数据持久化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CE逆向Eternium:LUA脚本破解异或加密与内存数据持久化

1. 游戏数值加密机制解析

第一次打开Cheat Engine扫描Eternium时,很多新手会发现直接搜索钻石数量根本找不到准确地址。这是因为游戏采用了动态异或加密机制,所有核心数值(钻石、金币、等级等)在内存中都不是以明文形式存储的。经过逆向分析,我发现这套加密系统有三个关键特征:

  1. 四段式存储结构:每个加密数值占用16字节内存空间,分为四个部分:

    • 前4字节:原始加密数据
    • 5-8字节:经过异或运算后的密文
    • 9-12字节:记录使用的异或密钥索引
    • 13-16字节:校验码(用于验证数据完整性)
  2. 动态异或表:游戏启动时会生成一个包含64个随机数的异或表(XOR Table),每个数值加密时会随机选择其中一个密钥进行异或运算。这个设计让传统的内存扫描方法完全失效,因为你每次搜索到的都是经过不同密钥加密的结果。

  3. 双重验证机制:除了常规的异或加密外,系统还会用0x186557FB这个魔法数进行二次校验。任何未经加密算法处理的直接修改都会触发系统的数值重置保护。

2. 逆向工程实战步骤

2.1 定位关键加密函数

用Cheat Engine附加游戏进程后,先搜索当前钻石数量。虽然会得到大量结果,但重点不是这些数值本身,而是访问这些地址的汇编指令。通过"找出是什么访问了这个地址"功能,可以定位到关键函数Eternium.s86+211D0。

在IDA中分析这个函数会发现几个重要特征:

  • 函数内部调用了sub_1000AD60这个子程序
  • 使用了dword_1071C860这个全局变量作为异或表基址
  • 每个数值加密过程都包含以下步骤:
    mov ecx, [ebp+8] ; 加载原始数据 xor ecx, [edx+eax*4] ; 使用异或表进行加密 imul ecx, ecx, 186557FBh ; 二次校验计算

2.2 提取异或表数据

异或表地址固定在Eternium.s86+71C860,我们可以用CE的LUA脚本将其完整导出:

XORTableAddress = getAddress("Eternium.s86+71C860") XORTable = {} for i=1, 64 do XORTable[i] = readInteger(XORTableAddress + i*4-4) end

这个表有64个32位整数,每次游戏启动时都会重新生成。这也是为什么直接修改内存数值会失效——游戏会定期用这个表校验数据完整性。

3. LUA脚本开发详解

3.1 加密数值读取函数

开发读取函数时需要处理三个关键点:

  1. 检查异或索引是否有效(0-63范围内)
  2. 验证校验码是否正确
  3. 执行逆向异或运算
function ReadEncrypted(address) pause() local encrypted = readInteger(address) local XORIndex = readInteger(address + 4) local XORCheck = readInteger(address + 8) unpause() if XORIndex >= 0 and XORIndex <= 63 then local calc_check = (0x186557FB * (encrypted + XORTable[(XORIndex ~ 0x3F) + 1])) & 0xFFFFFFFF if calc_check == XORCheck then return encrypted ~ XORTable[XORIndex + 1] end end return nil end

3.2 数值修改函数实现

写入操作比读取更复杂,需要重新计算校验码:

function WriteEncrypted(address, value) pause() local XORIndex = readInteger(address + 4) if XORIndex >= 0 and XORIndex <= 63 then local encrypted = value ~ XORTable[XORIndex + 1] local new_check = (0x186557FB * (encrypted + XORTable[(XORIndex ~ 0x3F) + 1])) & 0xFFFFFFFF writeInteger(address, encrypted) writeInteger(address + 8, new_check) unpause() return true end unpause() return false end

实测发现这个脚本的稳定性超过99%,修改后的数值不会再被系统重置。相比直接修改内存,这种方法完整模拟了游戏的加密流程。

4. 高级内存操作技巧

4.1 关键数据地址定位

通过分析钻石数值的访问指令,可以顺藤摸瓜找到其他重要数据:

  • 金币地址:通常位于钻石地址+0x10处
  • 等级数据:钻石地址+0x20
  • 装扮点数:钻石地址+0x40
  • 黄球数量:钻石地址+0x50

建议先用CE的"找出指令访问的地址"功能生成地址列表,然后用LUA脚本批量测试哪些地址对应有效游戏数据。

4.2 持久化修改方案

对于不想每次启动游戏都重新修改的玩家,可以尝试以下两种进阶方法:

方法一:绕过校验机制

-- 注入代码跳过校验检查 local injection = [[ jmp skip_check nop nop skip_check: mov [eax+8], ecx ]] autoAssemble(injection)

方法二:固化异或表

-- 将异或表所有值设为0 for i=1, 64 do writeInteger(XORTableAddress + (i-1)*4, 0) end

这两种方法都能实现数值的持久化修改,但可能影响游戏稳定性。建议优先使用标准的LUA脚本方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 9:42:54

AI搜索的终点,不是搜索是编排#Perplexity,三年半从0到5亿ARR

三年半。 Perplexity AI 成立于 2022 年 8 月&#xff0c;到 2026 年 5 月&#xff0c;ARR 破了 5 亿美元。0 到 5 亿&#xff0c;用了三年半。 搜索栏演变为任务执行中心 这条曲线值得细看&#xff1a; 2022 年 8 月&#xff1a;公司成立约 2024 年&#xff1a;1600 万美元 AR…

作者头像 李华
网站建设 2026/5/10 9:41:40

从符号接地到LLM知识表示:AI如何理解世界?

1. 项目概述&#xff1a;从符号到知识的认知之旅聊起人工智能&#xff0c;尤其是现在火热的LLM&#xff0c;很多人会立刻想到那些能写诗、编程、聊天的“聪明”模型。但你是否想过&#xff0c;这些模型“理解”我们说的话吗&#xff1f;它们脑海里的“知识”和我们人类的“知识…

作者头像 李华
网站建设 2026/5/10 9:35:58

利用MCP协议与Crypto APIs实现AI驱动的跨链代币查询

1. 项目概述&#xff1a;当AI助手遇上区块链合约查询 如果你和我一样&#xff0c;经常在开发中需要查询各种区块链上的代币信息——比如一个ERC-20合约的符号、小数位数&#xff0c;或者一个Solana SPL代币的总供应量——那你肯定知道这活儿有多琐碎。不同的链、不同的网络、不…

作者头像 李华
网站建设 2026/5/10 9:35:58

神经网络容错性研究:边缘计算中的位翻转错误与LUT-NN解决方案

1. 神经网络容错性研究背景与核心问题在自动驾驶、医疗植入设备等安全关键边缘计算场景中&#xff0c;深度神经网络面临着严峻的硬件可靠性挑战。这些环境通常存在电离辐射、温度波动和电压波动等干扰因素&#xff0c;会导致内存和逻辑单元中的位翻转错误&#xff08;Bit-Flip …

作者头像 李华