Xamarin.Android - 本机代码编译是不是使逆向工程更难?
Posted
技术标签:
【中文标题】Xamarin.Android - 本机代码编译是不是使逆向工程更难?【英文标题】:Xamarin.Android - does native code compilation make reverse engineering harder?Xamarin.Android - 本机代码编译是否使逆向工程更难? 【发布时间】:2013-10-05 01:23:03 【问题描述】:我们正在考虑将我们的 C# .NET 应用程序移植到 android,并且我已经开始阅读有关 Xamarin.Android 和 Mono 框架的信息。我刚刚开始进行 Android 开发。
我注意到http://xamarin.com/android 主页上写道:
本机代码 高性能编译代码,可完全访问所有原生 API。
这是否意味着生成的代码将是更难逆向工程的本机代码?我们希望创建一个包含我们的关键算法的类库,如果我们可以将其编译为本机代码以阻止逆向工程,那将减少我们对移植的恐惧。
我已经阅读了其他几篇关于 Android 代码的反编译并不比混淆的 .net 程序集更难的文章(在使用 ProGuard 之后)。本机代码编译是这些帖子之后出现的最新功能吗?感谢您的建议!
【问题讨论】:
声明Native Code High-performance compiled code with full access to all the native APIs.
并不暗示代码逆向工程的难度。
【参考方案1】:
目前,Android 下的 Xamarin 无法编译为本机处理器代码。它创建 .NET p 代码,该代码在 Mono 虚拟机中运行,每个 Xamarin 编译的应用程序都与其余的应用程序文件一起安装。据我所知,为 Android 创建原生代码的唯一合理方法是使用 Android NDK (http://developer.android.com/tools/sdk/ndk/index.html) 并用 C 或 C++ 编写代码。
我做了一些非正式的基准测试,比较了用 Xamarin 和 Dot42 编译的 C# 中的 Java 和类似代码,以及用于真实应用程序(文本处理)的本机代码。基本上,来自 Xamarin 的 C# 在该特定应用程序上比 Java 或 Dot42 快约 10-20%,而本机代码则快约 5-6 倍。阅读更多:
Does anyone have benchmarks (code & results) comparing performance of Android apps written in Xamarin C# and Java?
另外,为了保护我的 Android Java 代码免受黑客攻击,我使用了 DexGuard 混淆器 (http://www.saikoa.com/dexguard)。但是,我真的不知道优秀的黑客要反编译和篡改这样的混淆代码有多难。 DexGuard 当然不会保护 .NET Xamarin 代码,只保护 Java 代码或为 JVM 编译的其他代码。它甚至不会保护直接编译为 Dalvik VM p-code 的 Dot42 代码(所有普通 Android 应用程序都在其中运行的虚拟机,Java 代码也被“dexed”并转换为 Dalvik 代码,然后才能在 Android 上运行)。
格雷格
【讨论】:
有一个名为“将程序集捆绑到本机代码”的新功能。这里有人说它很省钱。【参考方案2】:因为 Xamarin.Android 是 JIT 的,所以它可以直接反编译回 C#。只需解压缩 APK 并将 ILSpy 与程序集/*.dll 一起使用。这不能在 Xamarin.ios 上完成,因为它是 AOT 编译的,因为 Apple 施加了运行时限制。
【讨论】:
最近的 Mono/Xamarin.Android 支持 AOT - 不再实际。 解压后在我的 APK 中找不到程序集文件夹。我只能看到 lib、res 和 META-INF。为什么不见了? @c.z 这是因为 APK 是使用 Debug 设置编译的。如果你用 Release 编译,它会有程序集。 @Luccas 我在哪里可以找到它? @hienbt88 如果您使用调试设置进行编译,您将无法在 APK 中找到程序集。使用 Release 配置编译,你会在解压后的 APK 的 Assemblies 文件夹中找到它们以上是关于Xamarin.Android - 本机代码编译是不是使逆向工程更难?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机
Xamarin.Android Java绑定库运行时失败访问本机库