我应该拿什么来拯救你,我的游戏?

面对小游戏被盗版的问题,本文探讨了混淆代码、弱联网加密校验和增加彩蛋等三种保护游戏的有效策略,帮助开发者增强游戏安全性。

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

前段时间,晓衡加入的一个小游戏个人开发者群突然, 炸锅了!群里有两位伙伴开发的小游戏,一个破解上架头条,一个破解打成 Android 包。

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

过程中大家也积极讨论了一些防破解的方法,在征得到大家的同意后,我将讨论的方案整理了出来,希望对正在做小游戏的开发者们有所帮助或启发,如果你有更好的方案也欢迎留言讨论。
  • 混淆代码,禁止调试

  • 弱联网加密校验

  • 增加彩蛋


1
混淆代码,禁止调试

对于 JavaScript 代码来说,最简单是对代码进行混淆加密。 当有不法 分子拿到代码后,使他不能直接阅读,进行二次开发。

晓衡曾经做过一个儿童教育应用,使用  javascript-obfuscator 做混淆加密,同时开启禁止调试功能,效果如下:

640?wx_fmt=png

混淆出来的代码,样子变成这样:

640?wx_fmt=png

这里是  javascript-obfuscator 的 github 地址:
https://github.com/javascript-obfuscator/javascript-obfuscator
除了使用 javascript-obfuscator 提供的命令行工具,它还支持 Grunt、Gulp、Webpack 等插件方式,具体使用方法请参考官方教程,这里就不赘述了。
但是对于 JavaScript 项目,对方接将我们的游戏代码、资源一起搬走,大不了不做二次修改,将图片一换仍然可以运行,没有丝毫招架之力!

2
弱联网校验

混淆代码只能是让“盗码者”不能阅读源码,做二次开发,但不能解决他们直接破解资源,换皮 打包的问题。 目前还有一种大多数单机使用的方案: 弱联网&资源校验。

1
弱联网
将我们的游戏关键数据保存到服务器上,比如关键配置、用户存档,或者是向服务请求加密验证,在游戏中使用自己的平台 appid 作为密钥等手段。
通过弱联网,就算游戏客户端代码、资源被盗也无法正常游戏,也能起到保护作用,是一种比较实用的方案。
2
资源校验
如果我们没有服务器怎么办呢?这里讨论一种方案供大家参考。
在工程中保存一个空配置文件,开发模式时不用读取它。发布 Release 构建时,对生成的关键图片资源、JS代码等生成 MD5 指纹,替换到构建资源中。
在引擎加载资源过程中,通过系统接口获文件对象,计算文件 MD5 做比较,如果 MD5 不匹配则不进行游戏。
下面是晓衡在网络上找一个 browser-md5-file 的模块,效果如下:

640?wx_fmt=png

browser-md5-file 它是一个 NPM 模块,使用很方便这里是 Github 地址:
https://github.com/forsigner/browser-md5-file
不过这里有一个难点,如何通用 Creator 引擎或其它 H5 引擎获取到资源文件的 File 对象呢?而且在不同平台,比如普通 H5 、微信小游戏、头条小游戏 环境不同还需要进一步研究。
除了微信小游戏、H5游戏,也有不少开发者使用引擎打包 iOS、Android 原生游戏,如果不做一些保护手段,直接将安装包中的res、src导出是非常容易的事情。读取原生资源文件相对简单,使用引擎提供的  jsb.fileUtils.getDataFromFile 即可。

3
彩蛋

” 彩 蛋“方 案是 一位伙伴想起曾经莉莉丝的《刀塔传奇》反编译案提出来的,看下图:

640?wx_fmt=png

案件情况如下:
《刀塔传奇》开发商莉莉丝在美国加州向法院提起对《Heroes Charge》开发商uCool的诉讼,斥其侵权,但由于玩法不被保护,所以莉莉丝的胜诉希望并不大。但莉莉丝任选择与 uCool 对簿公堂,可以想见是掌握了决定性证据,现在这个证据终于公布。
莉莉丝在Facebook官方主页发布了一段视频,这则视频内容表明了uCool所推出的游戏《Heroes Charge》反编译《刀塔传奇》代码的一个关键性证据。
在视频中,演示者从App Store登陆,下载了《Heroes Charge》的App,然后打开了App。演示者登陆游戏后,点击进入了“远古神庙”关卡,然后开始点击屏幕。
在多次点击屏幕之后,赫然跳出了一个窗口。窗口上写着“LILITH GAMES ©”。在《Heroes Charge》的游戏中出现了《刀塔传奇》开发商莉莉丝游戏的商标,这显然并不正常。
彩蛋是不得已 的最后 一手 ,当我们的游戏发现已经被盗时,向平台提出申诉,彩蛋将是一个重要的申述证据。

4
小结
随着微信小游戏日趋普及,开发商厂和个人开发者也大量涌入, 游戏同质化严重,不少小游戏厂商或个人将一套游戏代码经过简单换皮上线,更有投机者直接反编译别人的游戏变成自己的产品上架。
微信平台以及其它小游戏平台,为了打击这种现象,会对代码相似度进行审查,超过一定比例相似度的代码会被判定为“代码包侵权”,将不能通过审核。因此个人开发者上线小游戏时,建议对代码进行混淆,以免被人拿到引擎直接输出的代码混淆后上线,他将有机会逃过相似度审查。
晓衡也是一名普通的个人开发者,深知个人开发者的艰辛。 游戏被盗,作为个人是很难与一些不良公司抗衡的,更重要的是它会极大地打击我们学习和创作的动力。 上面介绍了三种保护游戏的方案,抛砖引玉,相信大家还有更多更好的方法,欢迎大家留言讨论或来公众号分享你的经验。

640?wx_fmt=jpeg

640?wx_fmt=png
好的,我可以为你设计一个基于命令行的冒险小游戏,具体规则和故事情节如下: 游戏规则: 1. 游戏中有多个场景,玩家需要在场景中进行探索,并且根据提示进行决策。 2. 玩家需要在规定的时间内完成任务,否则游戏失败。 3. 玩家可以收集物品,这些物品可以帮助他们完成任务。 4. 在游戏的不同阶段,玩家会遇到不同的敌人,需要与其进行战斗。 5. 游戏中有多个结局,玩家的选择会影响游戏的结局。 游戏故事: 故事发生在一个古老的城堡中,玩家扮演一名年轻的勇士,需要寻找并摧毁城堡深处的邪恶魔王,拯救被其控制的公主。 下面是代码实现: ```python import random import time # 定义游戏场景和敌人 scenes = { "entrance": "城堡入口", "hall": "大厅", "kitchen": "厨房", "tower": "城堡塔楼", "dungeon": "城堡地牢", "throne_room": "王座厅", "treasure_room": "宝藏房" } monsters = { "goblin": {"name": "哥布林", "health": 30, "attack": 5}, "orc": {"name": "兽人", "health": 50, "attack": 10}, "demon": {"name": "恶魔", "health": 100, "attack": 20}, "dragon": {"name": "巨龙", "health": 200, "attack": 30} } # 定义任务物品和玩家属性 items = { "key": "宝藏房的钥匙", "potion": "恢复药水", "sword": "宝剑", "armor": "盔甲", "torch": "火把" } player = { "name": "勇士", "health": 100, "attack": 10, "defense": 5, "items": [] } # 定义战斗函数 def fight(enemy): print("你遇到了一只%s!" % enemy["name"]) while enemy["health"] > 0 and player["health"] > 0: print("你的生命值:%d,攻击力:%d,防御力:%d" % (player["health"], player["attack"], player["defense"])) print("%s的生命值:%d,攻击力:%d" % (enemy["name"], enemy["health"], enemy["attack"])) action = input("请选择你的行动(攻击、逃跑):") if action == "攻击": enemy["health"] -= player["attack"] print("你发起了攻击,对%s造成了%d点伤害!" % (enemy["name"], player["attack"])) if enemy["health"] > 0: player["health"] -= enemy["attack"] - player["defense"] print("%s反击,对你造成了%d点伤害!" % (enemy["name"], enemy["attack"] - player["defense"])) else: print("你选择了逃跑!") return False if enemy["health"] <= 0: print("你打败了%s!" % enemy["name"]) return True else: print("你被%s打败了!" % enemy["name"]) return False # 定义场景函数 def enter_scene(scene): print("你来到了%s。" % scenes[scene]) if scene == "entrance": print("门被锁住了,你需要找到钥匙才能进入城堡。") return "key" elif scene == "hall": print("你在大厅发现了一把宝剑。") player["items"].append("sword") return None elif scene == "kitchen": print("你在厨房发现了一瓶恢复药水。") player["items"].append("potion") return None elif scene == "tower": print("你来到了城堡塔楼,发现了一件盔甲。") player["items"].append("armor") return None elif scene == "dungeon": print("你看到了一只哥布林,准备与其战斗。") if fight(monsters["goblin"]): print("你打败了哥布林,继续你的冒险吧!") return None else: print("你被哥布林打败了,游戏结束!") return "end" elif scene == "throne_room": print("你来到了王座厅,恶魔正在等待你的到来。") if fight(monsters["demon"]): print("你打败了恶魔,但是公主不在这里,你需要继续寻找。") return None else: print("你被恶魔打败了,游戏结束!") return "end" elif scene == "treasure_room": print("你成功找到了宝藏房,并且拿到了公主的救赎。") print("你获得了游戏的胜利!") return "end" # 定义游戏函数 def play_game(): print("欢迎来到城堡冒险游戏!") print("你的任务是摧毁城堡深处的邪恶魔王,拯救被其控制的公主。") print("你有60秒的时间完成任务,否则游戏失败。") print("你可以在不同的场景中探索和收集物品,与敌人进行战斗。") print("在游戏中,你可以输入help获取帮助,输入exit退出游戏。") print("祝你好运!") start_time = time.time() current_scene = "entrance" while True: current_time = time.time() if current_time - start_time > 60: print("时间到了,游戏失败!") return action = input("> ") if action == "help": print("你可以输入go [场景名称]前往不同的场景。") print("你可以输入take [物品名称]收集物品。") print("你可以输入fight与敌人进行战斗。") print("你可以输入items查看已收集的物品。") print("你可以输入exit退出游戏。") elif action == "exit": print("游戏结束。") return elif action.startswith("go "): scene = action.split()[1] if scene in scenes: item = enter_scene(scene) if item: player["items"].append(item) if scene == "treasure_room": return current_scene = scene else: print("无法前往该场景!") elif action.startswith("take "): item = action.split()[1] if item in items: print("你收集了%s。" % items[item]) player["items"].append(item) else: print("无法收集该物品!") elif action == "fight": if current_scene in ["dungeon", "throne_room"]: if fight(monsters["demon"]): enter_scene(current_scene) else: return else: print("该场景没有敌人!") elif action == "items": if len(player["items"]) == 0: print("你还没有收集任何物品!") else: print("你已经收集了以下物品:") for item in player["items"]: print(items[item]) else: print("无法识别的命令!") play_game() ``` 这个游戏还可以进行很多扩展,比如增加场景、增加任务、增加敌人等等。希望这个小游戏能够帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值