【问题标题】:Is NDK an alternative to reduce reverse engineering?NDK 是减少逆向工程的替代方案吗?
【发布时间】:2015-10-02 04:59:46
【问题描述】:

我已经放弃尝试让 Proguard 在 Eclipse 或 Android Studio 上工作。文档很神秘,无论我尝试什么,Proguard 混淆的 apk 都会受到打击。此外,有关 Proguard 的问题在此论坛上也没有得到太多关注。

标准 Android apk 文件的设计几乎可以引发逆向工程,我正在寻找一些方法来保护我的代码。不是我所有的代码都只是一些方法。

在我开始编写 Android 应用程序之前,我用 C 和 C# 编写了应用程序,我对这两种语言都很熟悉,实际上我更喜欢其中任何一种语言而不是 Java,所以我最近一直在阅读有关 NDK 的文章。

当然,NDK 是关于速度的,但我想知道它是否也有助于保护我的代码免受逆向工程和黑客检查。我知道它是“编译”代码,所以我想源代码将不可见。

我是在正确地吠叫吗?

谢谢,

院长

【问题讨论】:

  • 不得不从反汇编的机器代码中进行逆向工程并不会阻止一个积极的人/团体。这可能会阻止没有足够兴趣的新手花必要的时间分析反汇编。
  • 请注意,存在商业代码混淆器(适用于 Java 代码和本机代码),这远远超出了 ProGuard 所做的相对简单的混淆。我无权说出我可能有或可能没有经验的任何此类工具;我只是说,如果您认为这很重要,ProGuard 并不是唯一的选择。
  • “Proguard 混淆的 apk 打击” - 这是什么意思?将有助于了解您希望摆脱其他混淆技术的 proguard 混淆所缺少的内容。
  • Sam:“blows”的意思是“不幸的是,[myappname] 已停止”,此时我将处理一个模糊的堆栈跟踪。如果您愿意,请查看我最近发布的一些帖子。

标签: android android-ndk proguard reverse-engineering


【解决方案1】:

仅在 NDK 中实现一些方法可能不会有太大帮助。但是,如果您还对 NDK 代码应用混淆甚至运行时保护技术,则可以提高对逆向工程的抵抗力。简单的网络搜索给出a list of free tools。您还可以与 Arxan 等商业解决方案提供商合作。此外,如果您将应用程序的更多逻辑放在原生代码中,通常可以提高混淆程度。

【讨论】:

    【解决方案2】:

    原生 C 代码更难反编译,但可以使用正确的工具轻松反编译。

    特别是如果你只用 C 开发小部分,然后使用 JNI 与它进行通信,JNI 是一个清晰的接口,任何反编译你的应用程序的人也可以使用它。如果您可以简单地执行它,谁需要知道您的代码是如何工作的?

    结论:本机代码可能更难反编译。但通常唯一的区别是您需要不同的工具,并且需要更多的知识和实践来反编译。此外,修改某些内容通常更复杂。

    【讨论】:

      【解决方案3】:

      这取决于您正在寻找什么样的保护。如果这是一种革命性的算法,可以让你比现在更快地完成一些非常流行的任务,那么无论你如何混淆它,你的代码都将被逆向工程;你需要专利保护。如果你想隐藏一些不友好的行为(比如监视你的用户),它就会被发现。所以不要这样做。如果你想保护一些客户端-服务器通信的协议,它可能会在其他地方容易受到攻击。

      但在某些情况下,使用 C++ 确实有帮助;分发单体共享库“黑盒”可能比处理 Java API 更容易。我不认为混淆可以对您作为库出售的代码起作用。

      当我们销售一个巨大的通信 SDK 时,我们采用了这种方法,我们所有的 Java 代码都简单地向客户开放(部分是为了改变/定制,但有些类在标题中带有警告 "请不要修改这个类,如果你把它弄乱了,产品很有可能无法正常工作”

      【讨论】:

      • 你能推荐任何工具来通过逆向工程检查 SDK/NDK,我尝试使用 apktool 但无法查看。
      • @Rick 我不明白你在想什么样的“检查”。
      • 其实我的朋友已经在NDK中存储了DB加密密码,我正在尝试进行逆向工程并尝试获取该密码。我尝试使用apktool并将apk重命名为zip等,但还没有成功跨度>
      【解决方案4】:

      是的,如果您使用 NDK,您可能很难对代码进行逆向工程,而且不太可能有人会尝试。

      【讨论】:

      • 您能详细说明原因吗?否则这似乎是一条评论。
      • “不太可能有人会尝试”。如果它是一个足够有价值的攻击目标,那么有人会尝试这样做是完全不可能的。
      • NDK 将创建编译后的代码,因此可以作为文件读取,并且“入侵者”可能已经准备好命令表,以重新创建所使用的操作。它会使它变得更难,但不会混淆您的代码,只会删除符号指针变量的“名称”......但是,Java 中的混淆仍然不够。据我所知,保护代码的唯一方法是让它运行“服务器端”,就像在 JVM 之外完成操作一样......
      猜你喜欢
      • 2011-06-07
      • 2020-08-26
      • 2011-06-04
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多