Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何制作';安卓解锁器&x27;应用程序对黑客更安全?_Android_Security_Reverse Engineering_Cracking - Fatal编程技术网

Android 如何制作';安卓解锁器&x27;应用程序对黑客更安全?

Android 如何制作';安卓解锁器&x27;应用程序对黑客更安全?,android,security,reverse-engineering,cracking,Android,Security,Reverse Engineering,Cracking,对于我的应用程序的付费版本,我选择unlocker应用程序路线,因为它易于实现,允许开发者控制台中的单个统计数据,但主要是因为我不需要维护两个代码库(一个用于免费版本,另一个用于付费版本)。即使我使用了CVS(我也这么做),继续合并功能和错误修复仍然是一件痛苦的事情。unlocker应用程序总体上更容易实现 但这有一个严重的缺点,它很容易超出安全检查;除非我遗漏了什么 无论我做什么,这样的实现总是会导致一个简单的if,如下所示: if(Program.isPremiumVersion()) {

对于我的应用程序的付费版本,我选择unlocker应用程序路线,因为它易于实现,允许开发者控制台中的单个统计数据,但主要是因为我不需要维护两个代码库(一个用于免费版本,另一个用于付费版本)。即使我使用了CVS(我也这么做),继续合并功能和错误修复仍然是一件痛苦的事情。unlocker应用程序总体上更容易实现

但这有一个严重的缺点,它很容易超出安全检查;除非我遗漏了什么

无论我做什么,这样的实现总是会导致一个简单的
if
,如下所示:

if(Program.isPremiumVersion()) {
    // Remove ads...
}
isPremiumVersion()
方法负责检查付费unlocker应用程序安装的所有工作,前提是证书匹配以及所有这些内容。是的,unlocker应用程序受LVL保护(虽然我读过一些文章提到LVL是多么不安全,但这不是现在的重点)。但最终,无论
isPremiumVersion()
中的代码有多复杂,它都会返回
true
false

覆盖这样的安全特性只是对代码进行反向工程,使其始终返回
true
。不是吗?我们如何保护我们的Android应用程序不受此影响?是的,代码被ProGuard混淆了。不过,对于一个足够熟练的人来说,这应该不会太难

请注意,我并不是想和那些破坏者战斗,我们根本无法取胜。我不会因为这个而失眠,在“完美解决方案”上浪费无数的时间。我只是在想办法让它更安全一点。至少在理论上,这似乎很容易破解。但我错了吗


有什么想法可以提高这类功能的安全性吗?

您可能已经看到了这一点,但下面是一些实现您所说内容的代码:


它检查免费和解锁应用程序上的签名是否相同。因此,不可能有人人为地创建一个具有正确名称的应用程序,因为符号会有所不同。然而,人们仍然有可能从手机上盗取apk并将其分发出去。对付这种情况的唯一方法是使用某种服务器身份验证,但这会增加成本和复杂性

解决这个问题没有简单的方法

你必须设法掩盖它。以下是一些提示:

技巧1:返回布尔值太明显。尝试返回一个值(例如int)。然后,使用比较查看这是否是有效的已知返回值

例如:获取一个字符串的md5,该字符串包含一些内容,您可以从中判断它是否是高级的。假设每个应用程序上都有一个静态的最终字符串。也许一个的md5以9开头,另一个以1开头。在这种情况下,计算md5,看看它是否大于一个“随机”数,你知道它在其他两个数之间。假设“premium”的md5为987,“free”的md5为123。您可以计算md5并将其与456进行比较

技巧2甚至更好:复制一些代码并每次使用不同的值(而不是456)!希望这将使解码模糊代码变得更加困难

我知道所有这些检查最终都会映射到一个布尔值(
if(1>2)
将被计算为
if(true)
),但对应用程序进行反向工程应该更困难

技巧3:不要在最明显的地方检查“isPremium”。例如,不要在启动应用程序时进行检查,因为这是最明显的检查位置。如果您想根据应用程序的版本使用条件逻辑,可能很难避免某些明显的点,但请在这里尽最大努力

技巧4:构建并混淆应用程序。针对您的apk运行反向工程工具。读一读,看看它是什么样子

最后,每天早餐时观看谷歌IO演示:

[编辑-更多提示]

技巧6:尝试使用您用来检查完全有效位置的代码。这可能会掩盖你在那里真正做的事情。这可能包括调用代码来检查这是哪个版本的应用程序,但对其不做任何有意义的操作。或者,在我前面的示例中,将md5与012或999进行比较,只是为了稀释这些变量的实际用途

技巧7:您可以考虑在运行时构造字符串,而不是依赖单个字符串。期末考试和静力学也可能会引起太多的注意,所以避免这些可能是一件好事

技巧8:永远不要使用谷歌教程中提供的LVL代码。修改它。很多


注意:我不确定这些技巧是否真的会有很大的不同,但你至少应该有机会让破解者的生活变得更艰难。

只要使用java等价物if
IFDEF
,或者将
isPremiumVersion
设为常量,并依靠编译器对其进行优化。这不是破解问题的解决方案,但是,如果您使用android库项目(不可启动),那么复制代码的问题应该得到缓解。它或多或少是一个共享的类库/布局库/绘图库,可以从可启动的应用程序中调用。创建两个版本的应用程序(免费、付费),并创建一个包含所有通用代码的库。在免费/付费版本中,如果布局/字符串/可绘图项等需要与共享库中的内容不同,则可以覆盖它们。应该满足你的需要:@Gophermofur是的,我知道图书馆的方法,但我不喜欢它,它还伴随着其他“问题”。不过没必要再深入了,这与问题无关。我已经决定了