- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于我的应用程序的付费版本,我选择了解锁器应用程序路线,因为它易于实现,允许在开发者控制台中显示个人统计信息,但主要是因为我不需要维护 2 个代码库(一个用于免费版本和另一个付费版本)。即使我使用 CVS(我这样做),继续合并功能和错误修复仍然是一件令人头疼的事情。解锁器应用程序整体上更容易实现......
但这有一个严重的缺点,很容易越过安全检查;除非我在这里遗漏了什么。
无论我做什么,这样的实现总是会导致一个简单的if
,就像这样:
if(Program.isPremiumVersion()) {
// Remove ads...
}
isPremiumVersion()
方法负责检查付费解锁器应用程序安装的所有工作,如果证书匹配等等。是的,解锁器应用程序受 LVL 保护(尽管我读过几篇文章提到 LVL 是多么不安全,但这不是现在的重点)。但最后,无论 isPremiumVersion()
中的代码变得多么复杂,它总是会返回一个 true
或 false
值。
覆盖此类安全功能只是对代码进行逆向工程并使其始终返回 true
的问题。不是吗?我们如何保护我们的 Android 应用程序免受此影响?是的,代码使用 ProGuard 进行了混淆处理。尽管如此,对于足够熟练的人来说应该不会太难。
请注意,我不是要与 cookies 打架,我们根本赢不了。我不会为此失眠,在“完美解决方案”上浪费无数时间。我只是在寻找一种使它更安全的方法。这似乎很容易破解,至少在理论上是这样。我错了吗?
有什么想法可以提高此类功能的安全性吗?
最佳答案
没有简单的方法解决这个问题。
你必须试着掩盖它。这里有一些提示:
提示 1: 返回 bool 值太明显了。尝试返回一个值(例如 int)。然后,使用比较来查看这是否是一个有效的已知返回值。
例如:获取包含某些内容的字符串的 md5,您可以从中判断它是否优质。假设您在每个应用程序上都有一个静态最终字符串。也许一个的 md5 以 9 开头,另一个以 1 开头。在这种情况下,计算 md5 并查看它是否大于您知道它位于其他两个数字之间的“随机”数字。假设“premium”的md5是987,“free”的md5是123,你可以算出md5和456比较。
技巧 2 - 更好:复制一些代码并每次都使用不同的值(而不是 456)!希望这将使解码混淆代码变得更加困难。
我知道所有这些检查最终都会映射到一个 bool 值(if(1 > 2)
将被评估为 if(true)
)但它应该是更难对您的应用进行逆向工程。
提示 3:不要在最明显的地方运行“isPremium”检查。例如,不要在启动应用程序时进行检查,因为这是最明显的地方。如果您想根据应用程序的版本使用条件逻辑,可能很难避免某些明显的地方,但请在这里尽力而为!
提示 4:构建和混淆您的应用。针对您的 apk 运行逆向工程工具。阅读并查看它的外观。
最后,每天早餐时观看这个 Google IO 演示:Evading Pirates and Stopping Vampires using License Verification Library, In-App Billing, and App Engine
[编辑 - 更多提示]
提示 6:尝试使用您用来 checkin 完全有效的地方的代码。这可能会掩盖你在那里真正做的事情。这可能包括调用代码来检查这是哪个版本的应用程序,但没有对它做任何有意义的事情。或者,在我之前的例子中,将 md5 与 012 或 999 进行比较,只是为了淡化这些变量的实际用途。
提示 7:您可以考虑在运行时构造字符串,而不是依赖于单个字符串。决赛和静力学也可能引起太多关注,因此避免这些可能是一件好事。
提示 8:永远不要使用谷歌教程中提供的 LVL 代码。修改它。很多!
注意:我不确定这些技巧中的任何一个是否真的会产生很大的不同,但你应该有很好的机会至少让破解者的生活更艰难一些。
关于android - 如何使 'android unlocker' 应用程序更安全地抵御黑客攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10539499/
总结 我依靠编译器指向代码中的每个位置,在更改父类中成员函数的签名时需要更新,但编译器未能指出子类中该函数的重写实例类,导致我的程序出现逻辑错误。我想重新实现这些类,以便在进行此类更改时可以更多地依赖
目前,我采用“将所有东西都扔到墙上,看看有什么能粘住”的方法来阻止上述问题。下面是我拼凑的函数: function madSafety($string) { $string = mysql_real_
.NET ConcurrentDictionary 易受竞争条件的影响,可能会导致意外数据,如 at the bottom of this MSDN article. 所述我假设有几个因素需要考虑。
我是一名优秀的程序员,十分优秀!