在这篇博文中,我们将说明攻击者如何轻松地使用内存篡改技术在手机游戏中作弊,以及游戏开发人员如何使用简单的安全和预防技术来阻止他们。 虽然攻击向量各不相同,但越狱和非越狱设备都存在内存篡改风险。下面我们将在 2020 年最热门的 iOS 应用My Tamagotchi Forever的真实游戏中展示其中的几个漏洞。虽然不需要任何游戏开发经验,但理解和阅读代码片段的能力将会有所帮助。 如果您不熟悉,“Tamagotchi”是一种虚拟宠物,必须保持清洁、娱乐和喂养。在最初的版本中,它是一款在 90 年代深受孩子们欢迎的小型手持设备。在它作为手机游戏的轮回中,我的 Tamagotchi Forever中,硬币用于购买基本用品,如食物和玩具,但高级物品需要更高价值的货币:钻石。 在游戏中获得免费钻石几乎是不可能的,但用户可以通过 ApplePay 在应用内购买。这是作弊经常发生的地方...... 使用越狱的 iPhone 是在手机游戏中作弊的便捷途径。网上有无数黑客和开源工具可用于在越狱的 iOS 设备上操纵游戏内存。黑客可以使用这些工具人为地增加他们的钻石库存,从而有效地规避应用内购买的需要。此类工具的一个示例是“iGameGod”,这是一种流行且免费的内存修改器。它可以通过 Cydia 获得,并且可以在安装后在系统设置中启用。 iGameGod 可以扫描应用程序的内存以查找指定值,并列出包含该值的所有内存地址。然后,它可以用我们选择的任何值覆盖存储在这些地址的值。例如,我们可以搜索当前的钻石数量 (12,345) 并将其覆盖为 99,999。 安装 iGameGod 后,您的游戏屏幕上会出现一个粉红色的齿轮图标(请看下面屏幕截图中的冰箱)。点击此图标会打开 iGameGod 搜索栏,我们可以使用它来查找存储在游戏内存中的任何值。 在我们的例子中,iGameGod 只返回一个内存地址,包含值“12345”。点击搜索结果可以让我们修改相应地址的值。如果 iGameGod 返回多个搜索结果,我们可以一次覆盖所有出现的结果,但这可能会导致应用程序崩溃。更好的方法是使用 iGameGod 的筛选功能来比较特定操作前后的值,例如购买钻石。 此时,内存中的钻石值发生了变化,但屏幕上显示的钻石数还没有刷新。我们可以简单地重启应用程序来刷新 GUI。 万岁,我们只是在没有任何重要技术技能的情况下破解了游戏!我们现在可以比其他玩家更快地种植电子宠物,并且避免支付额外费用。 (注意:为了更好地理解像 iGameGod 这样的工具是如何工作的,请查看附录。它描述了如何在运行时扫描内存。这种方法在许多作弊引擎中广泛使用。我们还提供了一个片段,您可以将其用于类似的在非越狱设备上使用 LLDB / Xcode 的结果。) 到目前为止,我们已经使用越狱设备来更改 Tamagotchi 游戏中的钻石数量。现在让我们看看这种作弊是如何在非越狱设备上工作的。 iOS 阻止第三方应用程序(如 iGameGod)控制从 App Store 下载的应用程序。但是,这些限制不适用于使用开发人员证书签名的应用程序。因此,我们需要从越狱设备中转储应用程序,使用开发者证书将其重新注册,然后将其安装到非越狱设备上。 这个过程称为应用程序重新打包,我们可以分四个步骤进行: 另一种方法涉及使用 Frida 修改内存。Frida是一种运行时检测工具,它提供了一个 JavaScript API,用于在运行时修改应用程序的行为和数据。 从 Apple App Store 安装应用程序后,我们可以将其从越狱设备转储到计算机。网上有很多工具可以处理这个问题,比如bakbak和frida-ios-dump。 转储的 *.ipa 使用 App Store 证书签名,这可以防止我们修改应用程序或附加调试器。我们可以使用iOS App Signer通过我们自己的开发人员证书和配置文件来重新注册应用程序,这两者都可以使用您的 AppleID 轻松获得。 接下来,我们使用Xcode的“Devices”在设备上安装resigned *.ipa。 现在,我们可以像往常一样打开应用程序并播放 My Tamagotchi Forever。 因为我们使用开发人员证书签署了应用程序,所以我们现在能够附加调试器。在 Xcode 中,打开“Debug”选项卡并使用“Attach to Process”选项选择“mytamagotchiforever”。 成功连接后,使用调试器暂停应用程序。 我们想将 Tamagotchi 中的硬币数量从 1340 增加到 9999,因此我们需要扫描内存以查找整数 1340。我们可以使用以下命令来完成: (lldb) script import lldb.macosx.heap 让我们分解这些命令: script import lldb.macosx.heap导入iOS工具对heap进行操作,即游戏的内存。 int(1340).to_bytes(8, 'little')将 integer1340 转换为其 little endian 64 位十六进制表示形式。 cstr_refs搜索堆上出现的所有 integer1340。整数以十六进制小端表示形式给出。 cstr_refs扫描整个内存需要几秒钟。完成后,它将列出所有包含 64 位整数 1340 的内存地址。 出现的次数很少,所以我们将手动将它们一一覆盖。使用下面的命令覆盖每个内存地址的值。 (lldb) 内存写入 0x00000002801059ac --size 8 9999 一旦我们覆盖了各自的内存地址,我们就可以恢复并重新启动应用程序,这会将我们的硬币数量更新为 9999。 使用调试器的另一种方法是使用像Frida这样的工具。Frida的动态代码检测工具包提供了一个 API,用于将任意代码注入正在运行的应用程序。一旦我们为非越狱设备安装并配置了Frida,我们就可以使用以下命令生成应用程序: frida -U -f com.jan-tamagotchi.test --no-pause 使用 Frida 的 JavaScript API,我们可以创建一个脚本来覆盖所有出现的给定值。 让我们将脚本分为三个部分: 1.枚举游戏进程中的所有内存区域”: 2. 搜索所有等于 1340 的 64 位值: 3.覆盖每个找到的内存地址的值: 完整的脚本如下所示。 如您所见,破解手机游戏并不需要多年的逆向工程经验。对于许多手机游戏来说,作弊只需要熟悉一套广泛使用且易于使用的工具,例如 iGameGod 或 Frida。 这就是为什么游戏开发人员进行防御性编码比以往任何时候都更加重要。可以使用一些反篡改技术轻松防止本文中讨论的漏洞利用。以下是一些让您的手机游戏更安全的建议。 没有越狱保护的游戏很容易被破解,只要使用广泛使用的工具,如 iGameGod。即使是一个简单的越狱检查,如: 使这种方法变得更加困难。为了更好地抵抗越狱,我们建议实施额外的防篡改检查。一些基本的可以在OWASP-mstg的Resiliency Against Reverse Engineering页面免费获得。 由于缺乏调试和重新打包检测,在非越狱设备上显示的所有技术都是可能的。一旦攻击者能够使用自己的开发者证书退出应用程序,他就可以篡改应用程序的内存并修补其行为。此类应用程序通常会被破解并重新分发解锁的高级内容。OWASP-mstg 还提供了一些免费技术来防止应用程序重新打包。 理想情况下,玩家的资源应该在服务器端进行验证。但是,如果游戏是为离线工作而开发的,您至少应该强制验证最关键的功能,例如购买高级物品(例如钻石)。 iGameGod 等工具会扫描内存中的特定值。因此,通过一些基本的手动混淆,您可以有效地将它从内存扫描器中隐藏起来。示例可能包括将值分成两部分,或者在读取/写入值时对其进行异或运算。 对于手机游戏开发商来说,大部分收入来自应用内购买,例如这个电子鸡示例中的钻石。简而言之,您不能让黑客和骗子利用本文中描述的漏洞而逍遥法外。如您所见,作弊者使用现成的工具和最少的技术知识来击败未受到良好保护的游戏相对简单。幸运的是,保护游戏并不一定很复杂。如上所述,通过采用包括静态和动态保护在内的分层移动应用程序安全方法,您可以防止大部分作弊者得逞。游戏开始!
在越狱设备上作弊再简单不过了
iGameGod 在行动
在非越狱设备上进行黑客攻击
1. 从越狱设备中检索 Tamagotchi 的 *.ipa 文件
2.用开发者证书签署转储的*.ipa
3.在被监禁的设备上安装开发*.ipa
4.用调试器修改内存
(lldb) script int(1340).to_bytes(8, 'little')
(lldb) cstr_refs <上一个命令的结果>
替代方法:使用 Frida 修改内存
Process.enumerateRangesSync('rw-').forEach(r=>
console.log("Found a RW- memory region at" + r.base);
);
var res = Memory.scanSync(r.address, r.size, value);
if (res.length > 0){
console.log("Found the value");
}
res[i].writeU64(9999)
Process.enumerateRangesSync('rw-').forEach(m=> {
// Pattern is a value of `1340` in little endian format
var pattern = '3C 05 00 00 00 00 00 00';
try {
var res = Memory.scanSync(m.base, m.size, pattern);
for(i=0; i<res.length;i++){
res[i].address.writeU64(9999)
}
} catch (e) {
continue;
}
});
如何防止手游被篡改
实施越狱检查
if FileManager.default.fileExists(atPath: "/Applications/Cydia.app"){
// A jailbroken device detected
}
使用调试和重新打包检测
验证资源服务器端
使用代码混淆
不要让作弊者玩弄系统
查看附录以了解在运行时如何扫描内存 >
作弊很容易:如何防止手游内存被篡改
本文来自投稿,不代表本站立场,如若转载,请注明出处:https://typecho.firshare.cn/archives/1379.html
免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。避免网络欺诈,本站不倡导任何交易行为。如您私自与本站转载自公开互联网中的资讯内容中提及到的个人或平台产生交易,则需自行承担后果。本站在注明来源的前提下推荐原文至此,仅作为优良公众、公开信息分享阅读,不进行商业发布、发表及从事营利性活动。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。
-- 展开阅读全文 --