【问题标题】:Android NDK possibility of decompiling native codeAndroid NDK 反编译本机代码的可能性
【发布时间】:2015-03-04 20:15:32
【问题描述】:

是否可以通过 ndk 解码编译并喜欢到 android 的本机代码?

是否可以从 apk 中重建项目并将其导入 eclipse(或任何其他 IDE)?

是否可以再次使用 apk 文件中的 .so 文件来重建项目或在 java 原生函数声明正确完成的情况下与另一个项目一起使用?

【问题讨论】:

  • 丢失了你的来源,嗯?
  • @Michael Todd 不是真的,我只是想确保我的代码是安全的。

标签: java android eclipse android-ndk


【解决方案1】:

将本机反编译为源代码是可能的(可能我没有尝试过),有一些像这样的工具https://www.hex-rays.com/products/decompiler/

可以从 apk 重建项目,但代码会被混淆(奇怪的类和方法名称)。您可以对照 apk2gold (https://github.com/lxdvs/apk2gold) 检查您的应用

至于你的最后一个问题,稍微努力一下 - 是的。

【讨论】:

  • 我想如果我让我的本机代码对包名称进行一些检查,如果它们被更改则会崩溃。那会有帮助吗? @jaroslawj
  • 在某种程度上——是的。但是你的库的逆向工程可以“禁用”这个限制或更改检查的包名称。您可以检查 .so 文件上的“字符串”命令 - 它会显示可见符号。攻击者还可以在他的 Java 代码中“调整”你的包命名...
【解决方案2】:

是否可以解码已编译的本机代码

没有。

是否可以从 apk 中重构项目

是的,很多。提取.class 文件很容易,主要是反编译。构建过程中的混淆步骤会使这变得更加困难。

但是,常量值和初始化程序很容易从编译的类中获得。不要尝试像private static String SECRET = "sesame123"; 这样的东西。这一点都不难逆向工程。 - 顺便说一下,这同样适用于.so 文件。

是否可以再次使用apk文件中的.so文件来重构项目

没有。

这取决于您对“项目”的含义。在任何情况下,您的本机库的函数和签名都可能很容易从相应的(已编译的)Java 类中恢复。在编译为本机代码后,(源代码)代码基本上永远“丢失”了。如果有人知道如何使用您的共享库(很容易理解,见上文),他将能够在他喜欢的任何应用程序中使用它。

总结一下:

a) 无法从已编译的本机代码重构源代码。

b) Java 源代码更容易从编译的.class 文件中重构;代码的混淆会使其更难。

c) 您的应用程序可能具有的任何功能,无论是否为原生功能,都可以很容易地被攻击者编写的另一个应用程序提取和利用。

另请参阅:http://en.wikipedia.org/wiki/Security_through_obscurity

【讨论】:

  • “源代码无法从已编译的本机代码中重建”——虽然丢失了原始源代码,但肯定有本机(机器)代码反编译器。见reverseengineering.stackexchange.com/questions/311/…
  • 是的,这些都在那里。 - 然而,对于像 gcc 这样带有O3 的积极优化编译器,反编译肯定会失败 - 或者更确切地说:它产生的结果几乎不比反汇编多。
  • 哦,同意。反编译/反汇编更难,而用这种方式搞砸更难,但是“更难”!=“不能”。
  • 感谢您提供的所有注释和建议。
【解决方案3】:

是否可以从 apk 中重建项目并导入它 eclipse(或任何其他 IDE)?

这可以通过dex反编译器和apk资源提取器来完成。

是否可以解码已编译并喜欢到 android 的本机代码 通过ndk?

是否可以再次使用apk文件中的.so文件来 如果 java 本机,则重建项目或与另一个项目 函数声明是否正确?

获得共享对象后,您可以将其包含在您自己的项目中。您可以转储库的全局符号并通过反编译的 Java 代码了解其用法。但是,如果共享对象是针对特定体系结构构建的,您可能无法在其他平台上重新构建它。

【讨论】:

  • ndk 为 7 或 8 个拱门构建。这意味着那些生成的.so 文件可能会在任何项目中使用。
  • 我想如果我让我的本机代码对包名称进行一些检查,如果它们被更改则会崩溃。会有帮助吗?
  • 可能。您可以通过本机代码检查您的 apk 有效性。这个问题可以帮助你:stackoverflow.com/questions/15025304/…
【解决方案4】:

是否可以通过 ndk 解码编译并喜欢到 android 的原生代码?

可以拆机;有 C/C++ 反编译器,但对于非常复杂的代码,它们几乎没用。

是否可以从 apk 中重建项目并将其导入 eclipse(或任何其他 IDE)?

可以对 .apk 进行 baksmali(反汇编),修复其中的某些内容,然后再次对其进行 smali(汇编)。可以用其他函数调用替换某些函数调用,还可以添加新类。

反编译成Java也是可以的,但是代码可能编译不出来,所以与其说是修改,不如说是分析。

如果他们在分析上投入一些精力,混淆代码仍然是可读的。

你可以混淆代码,但他们会看到图标,他们会找到资源 id,他们会找到 onClick() 按钮处理程序。

是否可以再次使用 apk 文件中的 .so 文件来重建项目,或者如果 java 本机,则可以与另一个项目一起使用 函数声明是否正确?

他们将 .so 原样用于另一个项目不会有任何问题(除非有人要求他们修复该 .so 中的错误)。同样,他们可以从您的 .apk 制作一个 .jar,并将该 .jar 用作另一个项目的库。

一般来说,.so 比 .jar 更难修改。

【讨论】:

  • 是否有办法阻止某人将我的代码用作 jar 文件并重新发布它?喜欢向 Google 举报?
  • 既然人类比机器人更聪明,不,至少不是自动的。你只能让它变得更加困难。但是你可以监控竞争对手的产品,如果你看到一些包/类/函数,比如com.package.hjh.Gjkjsfdl.jdsfgshhdfghj(String, String)(普通人不会使用这样的函数名称),你可以报告滥用。最简单的方法是在应用初始化时使用特定的日志消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多