Android游戏保持被黑客入侵
所以我们现在已经经历过好几次了,我们发布了一个游戏(便宜的),然后有人把它打开并放在镜子上。 我们为所有应用程序设置了Google快讯,所以我们每天都会被告知谁在进行黑客行为。 到目前为止,我们已经按照Google的build议实施了许可服务,我们每次使用唯一的设备ID启动许可时,我们的盐是随机生成的。 当应用程序第一次启动时,我们运行一次检查服务。 然后我们生成一个512字符的哈希密钥和存储的值,在SharedPreferences中进行比较。
现在,我知道一次检查可能是应用程序被阻止的地方。 我们的字节码很可能在没有启动检查的行的情况下被查看和重新编译。
从这里,我不想混淆我们的代码,因为我以前看到它破碎了。 我想要一些更坚实的东西,我也想学习如何正确地做到这一点。 因为只有2%的人会寻找被黑客入侵的版本,所以我现在对学习更感兴趣,而不是赚钱。
到目前为止,我自己已经提出了一个随机数字发生器,放置在游戏的几个启动区域。 启动时(比如50次中的1次),检查许可证。 我知道这会让黑客难以入手,因为黑客必须消除每一种情况,编译,删除,编译。 然而,这种方法仍然是可以破解的…所以你们build议什么? 再一次,我对这个安全过程非常感兴趣,所以请教育一下,不要把它变成一个基于时间戳的混淆或者定期检查的讨论。
谢谢
我的想法不是黑客的证据,但可能会删除一些黑客入侵的兴趣。
免费增值模式
1)让第一个5-10级免费,让人们可以学习游戏,并有一些乐趣,而无需支付。 less就会想要破解第一层次,游戏会通过免费模式进一步传播。
共享软件/集群级别包
2)让部分游戏关卡或逻辑保持在线状态。 例如。 当达到5或10或15级时,然后下载游戏的小部件,并且每次从游戏中提交进度logging,并根据可能的值+哈希代码进行validation。 这也许能够自动closures被黑客户。
隐形骗子保护
3)你也可以只计算你在游戏中放置的“小警告标志”。 不要只在开始时检查“validation”,不要将这些标志build立到游戏逻辑本身中。 不要让它打破游戏,因为没有人会寻找它。 然后当用户到达关卡怪物的末端时,检查是否有任何logging的警告标志。 这些不会出现在游戏内部,因此被黑客入侵的未知用户可能会玩上几个小时/天,突然意识到他/她无法完成游戏或进入下一个级别,因为游戏有一个“bug”。 用户不知道的是,这个错误只发生在被黑客户端。
结论
比cookies更聪明。 愚弄他们认为工作已经完成。 做一个复制保护,并知道更先进的cookies将能够删除它。 但是他们可能不想玩50个关卡来检查这个破解是否也是一样的。
一旦他们意识到这个问题,他们也可能开始破解它。 但是如果你把游戏分成了一些级别的包,你仍然可以在每个包下载之间进行validation。 所以,一旦你收到黑客客户端的哈希数据,然后只是执行一个模拟,并在客户端崩溃的游戏。 哎呀游戏崩溃了。 不要告诉它,因为它被黑了。 程序错误可能会发生。 🙂
再次,它不是黑客的certificate。 但是可能会让他们感到烦恼,继续下一场比赛。 最后,你也可以定期更新游戏,只有最新版本应该能够“发布logging”等,所以活跃的用户将不得不更新以保持循环。
我一直在做一些apk反编译和黑客一段时间(不warez,但mods和黑客主要是谷歌应用程序和Android框架,始终坚持xda-开发人员的政策)。
一旦你学会阅读smali,它几乎就像读取原始的java代码(但是用更多的LOC)。 因此,您添加的用于检查密钥的任何代码都可以find并删除或replace。 你甚至不需要重新编译每次消除多个(有些search奇迹find类似的代码片段),即使编译/重新编译周期需要find它们,这只是一两分钟的问题反编译:一切都由apktool自动完成,甚至由apkmanager完成。
话虽如此,我的build议是实现某种在线评分表或类似的function,当用户在线查看评分表时,您可以检查您实施的哈希码,并将其与关联的gmail帐户进行比较。 这样,你可以向谷歌举报黑客,并向用户发送一个恶意的消息,解释为什么这是非法的。
当然,可以采取新的手段来消除评分表,但这会降低对商品的兴趣。
祝你好运。
更新
经过研究以回答这个问题: 向APK注入代码 (实际上关于Amazon DRM机制),我可以告诉一点亚马逊如何保护应用程序:它包括用于在任何地方检查安装有效性的方法(您可以看到一个示例在我对这个问题的回答中他们是如何做到这一点的)。 这将使任何尝试破解一个应用程序不是很困难,但非常繁琐。 我相信这是一个强项:黑客不会花太多的时间做这么多重复的任务:这不是挑战 ,也很无聊 。 我在这种方法中看到的主要缺陷是,当然可能会破坏亚马逊应用程序本身,总是返回有效的答案。 但是,如果您将当前的散列检查与分散在您的方法中的某种在线检查相混合,我相信它被黑客入侵的可能性可能会大大降低。
从我的解决scheme从这个post采取避免apk破解
实施您自己的许可证库
我也会引用你从Google I / O 2011 YouTube录制中看到这个:
逃避海盗和阻止吸血鬼
编辑:
从海盗和停止吸血鬼 的演示文稿
一些基本的关键点
- 修改LVL
- 实施LVL篡改抵抗
- 使用混淆
- 添加reflection
我知道你并不是真的陷入混淆,但我真的需要对此作出反应:
从这里,我不想混淆我们的代码,因为我以前看到它破碎了。 我想要一些更坚实的东西,我也想学习如何正确地做到这一点。
ProGuard在我的经验中是非常可靠的,尽pipe我使用了一些高级function,例如AIDL和一些调用Java方法的本地代码。读取文档并正确执行操作需要一些工作,但是一旦您有ProGuard是非常可靠的,也优化您的应用程序。
自定义的安全/密码技巧是好的,但没有混淆,就像在我的愚见中投掷石头在水中。
我在生产中使用ProGuard已经有好几个月了,而且完美无瑕。
如果您正在学习,请仔细阅读ProGuard手册,进行实验并检查其输出日志。
机会,有更多有才华的程序员,那么你(申请所有程序员)是100%。 如果这是真的,你不能修复黑客。 但是你可以花费很多的时间和精力去破产。
如果你想赚大钱,你需要对你的目标用户群和行为科学做一些研究。 你需要让玩家带来新的钱,那就是了。
另外,你把这一切弄错了。 黑客是你用户群中最活跃的成员,你的行为方式你不打算。
以Facebook上的Zynga游戏为例,你觉得你被黑客攻击了吗? – 当然,大约有10万玩家只能玩,因为你可以使用机器人,自动化一切。
拥有巨大的活跃用户群的实际人员僵尸networking,使归档types的玩家想玩游戏 – 如果你玩,看起来很酷,那么Avarage Joe也会玩。 如果Avarage Joe出场,那么他的朋友可能会想要玩,而你可能不会在乎别的东西,然后和他/她的朋友做得更好,消磨时间或者聊天。 平均来说,Joe的朋友很可能会愿意付出比Joe更好的付出,但是你会愿意投资一些能使他们变得更好的东西。
此外,如果真正的价值是免费玩游戏,那么使用免费黑客版本的用户很可能永远不会付钱。 但是你是乔伊斯和他们的朋友可能会。 所以这就像你可以拥有的最便宜的广告 如果你想赚取大量的用户基础,那么只需要对游戏的新版本进行一些小小的修改即可。
盗版永远是一个问题。 通过大型cookies比玩这个安全游戏比开发者更好。
多么有趣和令人不安的问题。 :-)作为一个练习,你可以尝试通过亚马逊释放一个应用程序; 他们有自己的DRM机制; 我想知道它是否比ProGuard更好…
在我看来,其中一个关键要素是分散代码,所以它不是在一个地方。 如果您有一个名为LicenseChecker.checkLicense()的函数来检索许可证并进行检查,则可以确定该许可证将被及时禁用。
你拥有的一个好处是,破解者无法看到你的代码的注释(如果你混淆了方法/variables的名字),所以想出一些奇怪的东西。 在一项活动的onCreate()中,您将获得许可证ID。 在onResume()中,你会得到另一个值来检查它。 也许创build一个线程,并在那里做一些检查。 然后,其他一些不相关的代码(也许玩家控制)可能会拿起价值,比较它并将结果存储在某个地方。 然后,其他三个不相关的代码将独立检查该值,如果不匹配,则禁用您的应用程序。
现在我应该先说,这可能会导致你头痛 – 显然,混乱,讨厌的代码更难debugging,并容易引起错误。 最坏的情况是,您在合法购买的应用程序中创build误报。
当然,所有的东西都可以进行逆向工程 – 一旦薄脆cookiesfind了应用程序被禁用的地方,就会追溯正在读取的值。 然后,他们可以追溯到存储的位置,并追溯到……或者更容易,他们可以禁用最后的检查(这就是为什么我build议3个不同的地方,所有触发延迟)。 安全性和最薄弱的环节一样好。
你将无法阻止盗版。 你最好的办法是延迟盗版的传播,直到你的应用程序的最初炒作已经平息下来。
首先,我不认为自己是SW安全领域的专家,但是:
我认为重要的是让应用程序依赖签名检查的某些部分。 不要让它立即影响,但让它设置一些标志或改变一些值。 稍后,使用这些标志,检查它们,让它们的缺失/不正确引起某种可能会终止应用程序的exception。 只要签名检查目前只是相关的,就很容易绕过它,删除该行,一旦触及代码中的更多区域,应用程序就变得更难(或者更简单一些)。 另外,正如我所看到的,并非所有的检查都应该使用相同的程序进行处罚,因为这样也可以很容易地find保护机制并终止它。
当然,对于非法软件的处理方式可能会有所不同,您可能会想要在非法使用时崩溃应用程序,但是您可能希望保持其运行状态,只发送要求用户购买合法副本的消息的应用程序。
如果这只是你不想听的话,那么我很抱歉你的时间:)
Android用户只会接受不断的电话之家的痛苦。 唯一安全的Android应用程序是一个永远连接的Android应用程序。
这在很大程度上是由于Google拒绝像苹果一样locking安装。 在IOS上,你必须越狱手机。 在Android上,您可以加载股票上的任何APK,工厂安装。
在服务器上保留一些/大部分/全部内容; 以块forms交付; validation每次通话的许可证/会话。
抑制这种types的行为将是难以置信的。 任何在客户端处理的东西都可以使用APK反编译和修改,使用Game Guardian等软件进行内存编辑。
我能看到如何部分解决这个问题的唯一方法就是制作一个在线游戏。 或者在线处理某些function。 或者如果像denuvo这样的防篡改encryption可用于Android / iOS。