Android NDK原生代码反编译的可能性

5

是否有可能通过 NDK 编译和链接到 Android 平台的本地代码进行解码?

从 apk 文件中重构项目并导入到 Eclipse(或其他 IDE)是否可行?

如果 Java 本地方法声明适当,是否可以再次使用 apk 文件中的 .so 文件重建项目或与另一个项目一起使用?


3
你丢失了源文件,是吗? - Michael Todd
1
@Michael Todd,不是很想,我只是想确保我的代码是安全的。 - user3788055
4个回答

3

将本地代码反编译为源代码是可能的(我没有尝试过),有一些类似于https://www.hex-rays.com/products/decompiler/的工具可以使用。

从apk中重构项目是可能的,但代码会被混淆(类和方法名很奇怪)。您可以使用apk2gold (https://github.com/lxdvs/apk2gold)来检查您的应用程序。

至于您的最后一个问题,只要稍加努力,就可以做到。


我在想,如果让我的本地代码检查一下包名,如果被更改就崩溃,这样有用吗?@jaroslawj - user3788055
在某种程度上是可以的。但是,对您的库进行逆向工程可能会“禁用”此限制或更改已检查的包名称。您可以在.so文件上检查“strings”命令-它将显示可见符号。攻击者还可以在他的Java代码中“适应”您的包命名... - jaroslawj
你有没有读过这篇文章:http://fuzion24.github.io/android/obfuscation/ndk/llvm/o-llvm/2014/07/27/android-obfuscation-o-llvm-ndk/? - jaroslawj

1

能否解码编译的本地代码?

不行。

从apk文件中是否可以重构项目?

可以,很多内容都可以。提取.class文件很容易,反编译也大多数情况下可行。在构建过程中加入混淆步骤会使这一过程更加困难。

然而,常量值和初始化器非常容易从已编译的类中获得。不要尝试像private static String SECRET = "sesame123";这样的操作。这种方法并不难以逆向工程。同样地,对于.so文件也是如此。

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

不行。

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

总之:

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

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

c)攻击者可能编写的任何应用程序都可以轻松地提取和利用您的应用程序具有的任何本地或非本地功能。

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


1
“从编译后的本地代码中无法重建源代码”--尽管原始源代码已丢失,但肯定存在本地(机器)代码反编译器。请参见http://reverseengineering.stackexchange.com/questions/311/why-are-machine-code-decompilers-less-capable-than-for-example-those-for-the-clr。 - CommonsWare
是的,它们在那里。然而,使用像gcc带有“O3”这样激进优化编译器的反编译注定会失败 - 或者更确切地说:它几乎只产生了汇编代码。 - JimmyB
3
好的,明白了。翻译如下:没错,这种方式更难反编译/反汇编和搞乱代码,但是“更难”并不等于“不可能”。 - CommonsWare
感谢您提供的所有笔记和建议。 - user3788055

1

是否有可能通过ndk解码编译并链接到Android的本地代码?

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

从apk文件中重构项目并导入eclipse(或任何其他IDE)是否可行?

可以将.apk文件反汇编(baksmali),修复其中的某些问题,并再次汇编(smali)。可以将一些函数调用替换为其他函数调用,也可以添加新类。

反编译为Java也是可能的,但代码可能无法编译,因此更多是关于分析而不是修改。

混淆的代码仍然可读,前提是他们要在分析方面投入一些努力。

您可以混淆代码,但他们将看到图标,找到资源ID,并找到onClick()按钮处理程序。

如果Java本地函数声明得当,是否可以再次使用apk文件中的.so文件重构项目或与另一个项目一起使用?

他们使用已有的.so文件应该不会有问题,除非有人要求他们修复那个.so文件中的错误。同样的,他们可以从你的.apk文件中制作一个.jar文件,并将该.jar文件作为库与另一个项目一起使用。
通常来说,.so文件比.jar文件稍微难以调整。

有没有办法防止别人将我的代码作为JAR文件使用并重新发布,例如向Google举报? - user3788055
由于人类比机器更有创造力,自动化地做不到。你只能增加难度。但是你可以监测竞争对手的产品,如果发现一些包/类/函数,如com.package.hjh.Gjkjsfdl.jdsfgshhdfghj(String, String)(普通人从不会使用这样的函数名),你可以报告其滥用。最简单的方法是在应用程序初始化时使用特定的日志消息。 - 18446744073709551615

0
能否从apk文件中重构项目并导入到eclipse(或任何其他IDE)?
这可以通过dex反编译器和apk资源提取器来完成。
是否可能解码通过ndk编译和链接到android的本地代码?
如果Java本机函数声明适当,是否可以再次使用apk文件中的.so文件来重构项目或与另一个项目一起使用?
一旦获得共享对象,您可以将其包含在自己的项目中。您可以转储库的全局符号,并通过反编译的Java代码了解其用法。但是,如果共享对象针对特定架构构建,则可能无法在其他平台上重新构建它。

NDK可以为7或8个架构进行构建。这意味着生成的.so文件可能会在任何项目中使用。 - user3788055
我在想,如果让我的本地代码检查包名并在其更改时崩溃,这样会有帮助吗? - user3788055
很可能可以。您可以通过本地代码检查apk的有效性。这个问题可以帮助您:https://dev59.com/GmUp5IYBdhLWcg3wz6AH - Efe Kahraman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接