144

所以我们现在已经经历了几次,我们发布了一个游戏(便宜),有人破解了它并将它放在镜子上。我们为所有应用设置了 Google 快讯,因此我们每天都会被告知谁在进行黑客攻击。到目前为止,我们已经按照 Google 的建议实施了许可服务,每次使用唯一设备 ID 启动许可时,我们的盐都是随机生成的。当应用程序第一次启动时,我们运行一次检查服务。然后,我们为键和存储的值生成一个 512 个字符的哈希值,然后在 SharedPreferences 中进行比较。

现在,我知道检查一次可能是应用程序被阻止的地方。我们的字节码很可能在没有启动检查的行的情况下被查看和重新编译。

从这里开始,我不想混淆我们的代码,因为我之前已经看到它被破坏了。我想要一些更扎实的东西,我也想学习如何正确地做到这一点。在这一点上,我对学习比赚钱更感兴趣,因为只有 2% 的人会寻找破解版。

到目前为止,我自己已经想出了一个随机数生成器,它放置在游戏的几个启动区域中。启动时(例如,50 次中有 1 次)检查许可证。我知道这会使破解变得更加困难,因为破解者必须消除每个案例,编译,消除,编译。但是,这种方法仍然可以破解……那么你们有什么建议?同样,我对这个安全过程非常感兴趣,所以请教育,不要把它变成关于混淆或基于时间戳定期检查的讨论。

谢谢

4

11 回答 11

118

我的想法不是黑客证明,但可能会消除一些对黑客游戏的兴趣。

免费增值模式

1) 前 5-10 个关卡免费,这样人们就可以免费学习游戏并获得一些乐趣。更少的人想要破解第一关,游戏将通过免费增值模式传播得更远。

共享软件/集群级别包

2)让部分游戏关卡或逻辑保持在线。例如。当达到 5 级或 10 级或 15 级时,下载游戏的小部件,每次提交游戏的进度日志,并根据可能的值 + 哈希码进行验证。这也许可以自动关闭被黑客入侵的帐户。

隐形骗子保护

3)您也可以只计算您在游戏中放置的“小警告标志”。不要一开始就检查“验证”,不要将这些标志构建到游戏逻辑本身中。不要让它破坏游戏玩法,因为那样没有人会寻找它。然后当用户到达怪物级别的末尾时,检查是否有任何记录的警告标志。这些不会出现在游戏中,因此拥有被黑版本的不知情的用户可能会玩几个小时/几天,然后突然意识到他/她无法完成游戏或进入下一个级别,因为游戏有一个“错误”。用户不知道的是,这个错误只发生在被黑的客户端上。

结论

比饼干聪明。愚弄他们以为工作已经完成。进行版权保护,并知道更高级的破解者将能够将其删除。但是他们可能不想玩50级来检查破解是否也能一路奏效。

一旦他们意识到这个问题,他们可能也会开始破解它。但是,如果您将游戏分解为关卡包,您仍然可以在每个包下载之间进行验证。因此,一旦您收到被黑的客户端哈希数据,只需执行一个异常并在客户端上使游戏崩溃。哎呀游戏崩溃了。不要告诉它,因为它被黑了。可能会发生程序错误。:-)

同样,它不是黑客证明。但这可能会惹恼他们,让他们继续进行下一场比赛。最后,您还可以定期更新游戏,只有最新版本才能“发布记录”等,因此活跃用户必须更新以保持循环。

于 2011-04-08T23:40:06.557 回答
20

我一直在做一些apk反编译和黑客攻击(不是warez,而是主要针对谷歌应用程序和android框架的mods和hacks,始终遵守xda-developers政策)。

一旦你学会阅读 smali,它几乎就像阅读原始 java 代码一样(但有更多的 LOC)。因此,可以找到并删除或替换您添加用于检查密钥的任何代码。您甚至不需要每次都重新编译以消除多个(有些搜索会奇迹般地找到相似的代码),即使需要编译/重新编译周期才能找到它们,也只需一两分钟反编译:一切都由 apktool 自动化,甚至更多由 apkmanager 自动化。

话虽如此,我对您的建议是实现某种在线评分表或类似的,当用户在线查看评分表时,您可以检查您实现的哈希码并将其与关联的 gmail 帐户进行比较。这样你就可以向谷歌报告黑客攻击并向warez的用户发送一条令人讨厌的消息,解释为什么这是非法的。

当然,可以实施一种新的破解方法来消除计分表,但这会降低warez 的兴趣。

祝你好运。


更新

在研究回答这个问题之后:Injecting code into APK (really about the Amazon DRM mechanism),我可以告诉一点亚马逊是如何保护应用程序的:它包括检查安装有效性的方法(你可以看到一个例子在我对那个问题的回答中他们是如何做到的)。这将使任何破解应用程序的尝试都不是很困难,但非常乏味。我相信这是一个强项:黑客不想花太多时间做这么多重复的任务:这没有挑战性,也很无聊. 当然,我在这种方法中看到的主要缺陷是有可能破解亚马逊应用程序本身以始终返回有效答案。但是,如果您将当前的哈希检查与散布在您的方法中的某种在线检查混合在一起,我相信它被黑客入侵的机会可能会大大降低。

于 2011-04-08T20:35:41.460 回答
20

取自我这篇文章的解决方案避免 apk 破解

实现您自己的许可库

我还建议您从 Google I/O 2011 YouTube 录制中查看此内容:

躲避海盗和阻止吸血鬼

编辑:

逃避海盗和阻止吸血鬼的演示文稿

一些基本的关键点

于 2012-03-17T08:48:14.783 回答
8

我知道你并没有真正陷入混淆,但我真的需要对此做出反应:

从这里开始,我不想混淆我们的代码,因为我之前已经看到它被破坏了。我想要一些更扎实的东西,我也想学习如何正确地做到这一点。

根据我的经验,ProGuard 非常可靠,尽管我使用了一些高级功能,例如 AIDL 和一些调用 Java 方法的本机代码。阅读文档并正确执行操作需要一些工作,但是一旦你ProGuard 非常可靠,还可以优化您的应用程序。

自定义安全/加密技巧很好,但在我的拙见中,如果没有混淆,这就像在水中扔石头一样。

我已经在生产环境中使用 ProGuard 好几个月了,它运行得完美无缺。

如果您正在学习,请仔细阅读 ProGuard 手册,进行试验并检查其输出日志。

于 2011-04-15T10:56:39.920 回答
4

有比你(适用于所有程序员)更多有才华的程序员的机会是 100%。如果这是真的,您将无法修复黑客攻击。但是你可以花尽可能多的时间和精力去破产。

如果你想赚大钱,你需要对你的目标用户群和行为科学做一些研究。你需要让用户玩带来新的钱,就是这样。

此外,你全错了。黑客是您的用户群中最活跃的成员,您只是以您不希望他们的方式行事。

以 Facebook 上的 Zynga 游戏为例,你认为自己被黑了吗?- 当然,大约有 +100000 名玩家只玩,因为你可以使用机器人,让一切自动化。

拥有庞大的真实用户活跃用户群僵尸网络,使得存档类型的游戏玩家想要玩游戏 - 如果你玩,而且看起来很酷,那么 Avarage Joe 也会想玩。如果 Avarage Joe 玩,那么他的朋友可能想玩,而你可能不会关心其他任何事情,然后比他/她的朋友更好,消磨时间或聊天。Avarage Joe 的朋友很可能愿意花钱让他变得比 Joe 更好,但你更愿意投资一些能让他们变得更好的东西。

此外,如果真正的价值在于免费玩游戏,那么使用免费破解版的用户很可能永远不会为此付费。但你是 Avarage Joes 和他们的朋友。所以这就像你能拥有的最便宜的商业广告。如果您想从庞大的用户群中获利,那么只需对关卡和图形进行少量更改即可制作新版本的游戏。

于 2011-04-08T21:30:04.277 回答
3

盗版永远是个问题。与开发人员相比,大型破解者更擅长玩这个安全但默默无闻的游戏。

于 2011-04-08T20:34:49.483 回答
2

多么有趣和令人不安的问题。:-) 作为练习,您可以尝试通过亚马逊发布应用程序;他们有自己的 DRM 机制;我想知道它是否比 ProGuard 工作得更好......

于 2011-04-08T21:22:11.970 回答
2

在我看来,关键要素之一是分散代码,这样它就不会全部集中在一个地方。如果你有一个名为 LicenseChecker.checkLicense() 的函数来检索许可证并检查它,你可以确定它会被立即禁用。

您拥有的一个优势是破解者无法看到您代码的注释(并且,如果您混淆了方法/变量名称),所以想出一些奇怪的东西。在一项活动的 onCreate() 中,您将获得许可证 ID。在 onResume() 中,您会得到另一个值来检查它。也许创建一个线程并在那里做一些检查。然后,一些其他不相关的代码(可能是播放器控件)可能会获取该值并比较它并将结果存储在某处。然后其他三个不相关的代码都将独立检查该值并在不匹配时禁用您的应用程序。

现在我应该提前说,这会让你自己头疼——显然,杂乱、讨厌的代码更难调试,而且容易导致错误。最坏的情况是,您在合法购买的应用程序中产生误报。

而且,当然,一切都可以进行逆向工程——一旦破解者找到应用程序被禁用的地方,他们就会追溯正在读取的值。然后他们可以追溯它的存储位置,并追溯......或者,更容易,他们可以禁用最终检查(这就是为什么我推荐 3 个不同的地方,所有触发延迟)。安全性与最薄弱的环节一样好。

你将无法阻止盗版。最好的办法是推迟盗版的传播,直到关于你的应用程序的最初炒作平静下来。

于 2011-04-08T21:47:43.977 回答
1

首先,我认为自己是软件安全领域的专家,但是:

我认为重要的是让应用程序在某些部分依赖于签名检查。不要让它立即影响,而是让它设置一些标志或更改一些值。稍后,使用这些标志,检查它们,让它们的缺失/不正确导致某种异常,这可能会终止应用程序。只要签名检查目前仅相关,就很容易绕过它,删除该行,一旦它触及代码中的更多区域,您的应用程序就会变得更难(或更容易......)被黑客入侵。此外,正如我所见,并非所有检查都应调用相同的制裁例程,因为这也将使找到保护机制并终止它变得容易。

当然,对非法软件的制裁可能会有所不同,您可能希望在非法使用时使应用程序崩溃,但您可能希望保持其运行,并且只发送要求用户购买合法副本的消息的应用程序。

如果这只是您不想听到的,那么对不起您的时间:)

于 2011-04-08T20:38:46.463 回答
0

Android 用户将不得不接受不断打电话回家的痛苦。唯一安全的 Android 应用程序是始终连接的 Android 应用程序。

这在很大程度上是由于谷歌拒绝像苹果一样锁定安装。在IOS上,您必须越狱手机。在 Android 上,您可以在库存的工厂安装上加载任何 APK。

将部分/大部分/所有内容保存在服务器上;分块交付;在每次通话时验证许可证/会话。

于 2012-12-19T00:25:12.953 回答
0

抑制这种 ov 行为将非常困难。任何在客户端处理的东西都可以使用 APK 反编译和修改、使用Game Guardian等软件进行内存编辑来破解。

我可以看到如何部分绕过它的唯一方法是制作在线游戏。或者在线处理某些功能。或者,如果像 denuvo 这样的防篡改加密可用于 Android / iOS。

于 2017-07-04T00:08:46.570 回答