提问者:小点点

防止/难以修补二进制程序集


我不确定术语是否正确,您可以使用哪些代码实践来使某人难以修改二进制/程序集以绕过检查:

例如在源代码中。

bool verificationResult = verify();
if (verificationResult){
 allow_Something();
}else{
 prevent_Something();
} 

如果查看上述代码的反汇编版本的人可以修改“跳转操作码(?)”以运行allow_Something即使验证结果为假。

这里涵盖了类似的东西http://www.codeproject.com/Articles/18961/Tamper-Aware-and-Self-Healing-Code#pre0

注意,我正在C中创建二进制文件,以便在Android上通过NDK使用它。


共3个答案

匿名用户

到目前为止,普遍的共识是,不可能阻止任何一心想“破解”你的APK的人这样做。混淆技术只会增加一次“破解”APK所需的复杂性。在它被上传到无数提供免费托管APK的网站后,它只是谷歌搜索,甚至远离Android新手。

此外,通过默默无闻的安全不会让你走得太远。

关于保护您的APK免受黑客攻击,我推荐以下讨论Android上APK许可证验证现状的文章。其中描述的技术应该让您了解需要防范的常见攻击媒介。

ProGuard是开始混淆你的APK的好地方。

在你设法获得一个混淆的APK后,请通过以下工具运行它并观察解编译的源代码。所有这些都是非常流行的免费开源工具,肯定是任何像样的“破解者”都会尝试的第一件事:
1. baksmali
2.apktool
3.Dex2JarJD-Gui

继续在你的代码中添加混淆层,直到你对上述工具的输出相当复杂而有意义感到满意。(同样不要低估一个拥有可口可乐、比萨饼和DVM操作码知识的大学毕业生在周末能完成什么)。

关于您分享的链接中讨论的技术,我看不出如何在Android上实现它们来保护. dex。如果您最终在单独的.so中实现验证逻辑,那么所有“破解者”需要做的就是将java代码中的调用修补到.so中的验证()函数。

更新:

额外的混淆步骤来保护. so

1.不要遵循或多或少的线性路径。
在各处添加额外的跳跃是通过用如此多的潜在目标淹没“破解器”来工作的,这些目标需要单独修改、修补和验证是否绕过了保护。

2.添加定时检查这主要是通过让代码在调试和实际运行时遵循不同的路径来摆脱“破解者”。如果两点之间花费的时间比平时多得多,那么这清楚地表明你的程序正在被调试。也就是说,是时候跳到计算世界上钢琴数量的垃圾代码部分了。

3.编写自修改代码
同样,这会阻碍静态分析。例如,如果您跳转到二进制文件中不存在验证函数,但作为. so中某些init()函数的一部分到处都是补丁。

所有上述技术(以及更多)都在下面关于反调试技术的文章中通过示例进行了描述。

更全面的指南是Peter Ferrie的终极反调试参考。

匿名用户

避免使用过于透明的检查。尝试一些基本的工作流混淆(例如异或结果),这有助于防止简单的操作码替换。但是我向你保证,如果有人想(非常非常)破解你,他可以做到这一点,而不管你保护的复杂性。

匿名用户

德克斯卫士是由做ProGuard的人制作的,但它允许更细粒度的选择。也就是说,ProGuard或多或少是Android混淆的行业标准。尽管如此,如上所述,如果有专业知识的人想破解你的应用程序,无论是爱情还是金钱都没有保护措施。