【发布时间】:2012-05-19 08:24:13
【问题描述】:
对于我的应用程序的付费版本,我选择解锁器应用程序路线,因为它易于实施,允许在开发者控制台中进行个人统计,但主要是因为我不需要维护 2 个代码库(一个用于免费版和另一个付费版)。即使我使用了 CVS(我确实这样做了),继续合并功能和错误修复仍然会让人头疼。解锁器应用总体上更容易实现...
但这有一个严重的缺点,很容易超过安全检查;除非我在这里遗漏了什么。
无论我做什么,这样的实现总是会导致一个简单的if,像这样:
if(Program.isPremiumVersion()) {
// Remove ads...
}
isPremiumVersion() 方法负责检查付费解锁应用程序安装的所有工作,如果证书匹配等等。是的,解锁器应用程序受 LVL 保护(虽然我读过一些文章提到 LVL 是多么不安全,但这不是现在的重点)。但最终,无论isPremiumVersion() 内部的代码多么复杂,它总是返回一个true 或false 值。
重写此类安全功能只是对代码进行逆向工程并使其始终返回true。不是吗?我们如何保护我们的 Android 应用免受这种情况的影响?是的,代码被 ProGuard 混淆了。不过,对于足够熟练的人来说应该不会太难。
请注意,我并不是要与饼干打架,我们根本无法取胜。我不会为此失眠,在“完美解决方案”上浪费无数时间。我只是在寻找一种让它更安全的方法。至少在理论上,这似乎很容易破解。我错了吗?
有什么想法可以提高此类功能的安全性吗?
【问题讨论】:
-
如果
IFDEF使用java 等效项,或者将isPremiumVersion设为常量,然后依赖编译器对其进行优化。 -
不是破解问题的解决方案,但是如果您使用 android 库项目(不可启动),则应该可以缓解重复代码的问题。它或多或少是一个可以从可启动应用程序调用的类/布局/可绘制的共享库。创建您的应用程序的两个版本(免费、付费)并创建一个包含所有通用代码的库。在您的免费/付费版本中,您可以覆盖 layouts/strings/drawables/etc,如果它们需要与共享库中的不同。应该满足您的需求:developer.android.com/guide/developing/projects/…
-
@Gophermofur 是的,我知道图书馆的方法,但我不喜欢它,它伴随着其他“问题”。不过,无需深入探讨,它与问题无关。我很久以前就决定使用“解锁”方法,那里没有讨论。不过我很感谢你的建议:)
-
您只能从脚本 Kiddo 中阻止它。创建一个网络服务并隐藏它背后的高级功能。
-
@lukas 这不会导致同样的问题吗?我的意思是,无论我做什么,服务器检查将始终返回“许可”或“未许可”,然后我要么启用或不启用高级功能。到头来都是一样的……还是我遗漏了什么?
标签: android security reverse-engineering cracking