security - 如何避免APK的某个文件被逆向工程?

  显示原文与译文双语对照的内容

我开发一个支付处理应用安卓,我想阻止黑客访问任何资源, assets 或源代码 APK文件。

If someone changes. apk extension to. zip then they can unzip it and easily access all resources of app and assets,and using dex2jar and a Java decompiler, they can also access source code. 很容易反向工程一个android的apk文件(更多细节见堆栈溢出问题 逆向工程从一个apk文件项目

我使用了 Android SDK提供的混淆工具。 当我逆向工程使用签名密钥库和混淆器生成的APK文件时,我得到了混淆代码。 但是,Android组件的名称保持不变,并且应用中使用的一些代码,如 key-values,保持不变。 根据混淆器文档,该工具无法混淆 Manifest 文件中提到的组件。

现在我的问题是:

  1. 我怎么能完全避免逆向工程的一个android的apk? 这可能吗?
  2. 如何保护应用程序,assets 和源代码的所有资源,以便黑客不能以任何方式入侵APK文件?
  3. 有一种方法可以让黑客更加困难甚至不可能? 如何保护APK文件中的源代码?
时间:

1.如何完全避免对 Android APK逆向工程? 这可能吗?

相反,完全避免逆向工程没有任何技巧。

@inazaruk: 也很好地说 无论你做什么你的代码,一个潜在的攻击者能够以任何方式改变它她或他觉得可行。 你基本上不能保护你的应用程序被修改。 你放入的任何保护都可以被禁用或者删除。

2.如何保护应用程序,assets 和源代码的所有资源,以便黑客无法以任何方式 hack 文件?

你可以用不同的技巧让黑客更难。 例如使用模糊处理( 如果是Java代码) 。 这通常会降低逆向工程的速度。

3 。有什么方法可以让黑客更加困难甚至不可能? 如何保护APK文件中的源代码?

就像大家所说,而且你可能知道,没有 100%安全性。 但是,谷歌内置的Android的地方是混淆器。 如果你有的选项包括共享库 C++ 中,可以包含所需的代码来验证文件大小。集成。等等 如果需要添加外部在每次构建本地库添加到库中的硬软件文件夹,那么你可以使用它通过下面的建议。

将该库放在默认为"库"的本地库路径中,该路径在你的项目文件夹中。 如果你建立的本机代码 'armeabi' 目标然后把它放到了 libs/armeabi 。 如果是使用构建 armeabi-v7a 然后会开始将来自 libs/armeabi-v7a 。


<project>/libs/armeabi/libstuff.so

现在,你不能保护/res 目录中的文件,因为它们现在被保护。

不过,你可以采取一些措施来保护你的源代码,或者至少它如果不是一切。

  1. 使用类似混淆器的工具。这些工具会混淆你的代码,并且在反编译时更难阅读,如果不是不可能的话。
  2. 将服务中最关键的部分移出应用程序,并将它的放入 web service,隐藏在像PHP这样的服务器端语言。 例如如果你有一个算法,你会花费一百万美元来写。 显然你不希望人们从你的应用中抢走它。 移动算法并让它处理远程服务器上的数据,并使用该应用简单地提供数据。 或者使用NDK将它们原生地写入. so 文件,这比apks更容易被反编译。 我认为. so 文件的反编译器现在甚至不存在。 另外,就像在评论中提到的@nikolay,在服务器和设备之间交互时应该使用 SSL 。
  3. 在设备上存储值时,不要将它的存储为原始格式。 例如如果你有一个游戏,并且你正在存储游戏货币的金额,用户在SharedPreferences中。 假设是 10000 币。 不是直接保存 10000,而是使用 ((currency*2)+1)/13 之类的算法保存它。 所以 10000, 你保存 1538.53846154 SharedPreferences 。 然而,上面的例子并不是完美的,你必须工作,以得到一个不会丢失货币的舍入错误。
  4. 你可以为服务器端任务做类似的事情。 现在,让我们来看看你的付款处理应用程序。 假设用户必须支付 $200 。 不要向服务器发送原始的$200 值,而是发送一系列更小predefined预定义的值,这些值可以添加到 $200 。 例如在你的服务器上有一个将单词与值等同的文件或者表格。 假设 Charlie 对应于 $47,而 John 对应于 $3 。 而不是发送 $200 时,你可以发送 Charlie 四次, John 四次。 在服务器上,解释它们的含义并添加它。 这可以防止黑客向你的服务器发送任意值,因为他们不知道哪个词对应什么值。 作为安全措施的补充,你也可以得到类似于 3的等式,并且每天更改关键字的每一个 n 数。
  5. 最后,你可以将随机无用的源代码插入到你的应用程序中,这样黑客就可以在大海捞针。 插入包含来自互联网的Fragment的随机类,或者只用于计算随机事物( 如Fibonacci序列)的函数。 确保这些类是编译的,但不是由应用程序的实际功能使用的。 添加足够的假类,黑客会很难找到你真正的代码。

总之,没有办法保护你的应用程序 100% 。 你可以让它更难,但不是不可能。 你的web服务器可能会妥协,黑客可以找出关键词通过监测多个事务量和关键词你发送,黑客可以通过源和煞费苦心地去找出哪些代码是一个假。

你只能反击,但永远不能赢。

1.如何完全避免对 Android APK逆向工程? 这可能吗?

这是不可能的,

2.如何保护应用程序,assets 和源代码的所有资源,以便黑客不能以任何方式入侵APK文件?

当有人将. apk 扩展更改为. zip, 之后,在解压缩之后,有人可以轻松获得所有资源( 除了 Manifest.xml ),但使用英镑 APKtool 可以获得清单文件的真实内容。 再一次,一个没有。

3 。有什么方法可以让黑客更加困难甚至不可能? 如何保护APK文件中的源代码?

再一次,不,但你可以阻止某个级别,也就是说

即使使用 Smali,人们也可以使用你的代码。 总之,这是不可能的。

100%避免逆向工程的android的apk是不可能的,但你可以使用这些方法来避免提取更多的数据,如源代码, assets apk,形式和资源:

  1. 使用混淆器混淆应用程序代码

  2. 使用 NDK使用c和 C++ 将你的应用程序的核心和安全代码在 .so 文件的一部分

  3. 要保护资源,不要将 assets 文件夹中的所有重要资源包含在文件夹中。 在应用程序首次启动时下载这些资源。

开发人员可以采取以下措施防止APK被盗,

  • 最基本的方法是使用像 ProGuard 这样的工具来迷惑他们的代码,但是直到现在,完全阻止有人反编译一个应用。

  • 我也听说过一个工具 HoseDex2Jar 。 它通过在 Android APK中插入无害代码来停止 Dex2Jar,它迷惑和禁用 Dex2Jar 并保护代码免受反编译。 它可以阻止黑客将一个APK反编译为可读的java代码。

  • 使用某些服务器端应用程序仅在需要时与应用程序通信。 它可以帮助防止重要数据。

总之,你不能完全保护你的代码和潜在的黑客。 不知何故,你可以有点困难和令人沮丧的任务反编译代码。 最有效的方法之一是在原生 code(C/C++) 中编写并将它的存储为编译的库。

1.如何完全避免对 Android APK逆向工程? 这可能吗?

不可能的

2.如何保护应用程序,assets 和源代码的所有资源,以便黑客不能以任何方式入侵APK文件?

开发人员可以采取措施,如使用混淆器等工具混淆他们的代码,但到目前为止,它已经很难完全防止有人反编译应用程序。

这是一个非常好的工具,可以增加'正在反转'代码的难度,同时减少代码的占用。

集成的混淆器支持:混淆器现在用SDK工具打包。 开发者现在可以混淆他们的代码作为发布版本的集成部分。

3 。有什么方法可以让黑客更加困难甚至不可能? 如何保护APK文件中的源代码?

在研究时,我了解了 HoseDex2Jar 。 这里工具将保护代码免受反编译,但似乎不可能完全保护你的代码。

一些有用的链接,你可以参考它们。

这里的主要问题是,可以反编译dex文件,答案是"的"。 有disassemblers像 dedexersmali 。

正确配置的混淆器将混淆你的代码。 DexGuard是一个商业扩展的商业扩展版本,可以帮助更多的。 但是,你的代码仍然可以转换为 smali,并且具有reverse-engineering经验的开发人员可以从smali中找出你正在做什么。

也许选择一个好的许可,并以最好的方式实施它。

...