【问题标题】:Obfuscate R.id class with or without proguard使用或不使用 proguard 混淆 R.id 类
【发布时间】:2013-08-16 12:47:44
【问题描述】:

我知道在 Proguard 中,建议您保留 R 内部类的字段名称,例如 ID。因为 ProGuard 不处理布局 xml 文件。你最终会得到断开的链接

但是是否可以通过其他方式混淆 R$id 之类的类,即使它涉及在通过 Ant 将其传递给 ProGuard 之前进行混淆。

我问这个是因为如果你有一个 ID 为 btnSaveArticle 的按钮,对于黑客来说,通过查看名称就很容易掌握周围的代码在做什么。

是否可以将所有源代码(包括资源文件)复制到另一个文件夹并使用 ant 运行正则表达式来更改 R.id 的名称以及更改它们在布局 xml 文件中的显示位置,以及然后以某种方式运行 generate 来重新创建 R 类?

或者您可以创建翻译类,例如 TR,然后将其映射到 R.class 中的字段

例如。

TR.btnSaveArticle = R.id.DHTXM; 

其中 DHTXM 是一些含义较少的词,可以在布局 XML 中使用。但是在代码中你总是引用 TR.btnSaveArticle,它会被 proguard 混淆。

有没有办法做到这一点,还是我在浪费时间?

【问题讨论】:

    标签: android ant obfuscation proguard android-resources


    【解决方案1】:

    我问这个是因为如果你有一个 id 为 btnSaveArticle 的按钮,对于黑客来说,通过查看名称就很容易掌握周围的代码在做什么。

    使用层次结构视图,无论您将其命名为什么,他们都可以在不到 30 秒的时间内确定“保存文章”按钮的实际 ID。而且我可以通过一些自定义工具来设想更快的解决方案。

    我是在浪费时间吗?

    恕我直言,是的。

    【讨论】:

    • 如果您有很多控件,则需要时间来计算所有控件。看到一个包含所有混淆名称的源文件会使一个随便的黑客不愿意破解。我明白你在说什么,我仍然无法理解黑客可以获取 Android 应用程序的完整源代码这一事实。
    • @pt123:“如果您有很多控件,则需要时间来计算所有控件”——您自己承认,他们不需要“计算所有控件” ,只有与他们尝试对您的应用程序执行的任何操作相关的重要内容,例如“保存文章”。 “看到一个包含所有混淆名称的源文件会让一个随便的黑客不愿意破解”——只有愚蠢的。
    • @pt123:“我仍然无法理解黑客可以获取 Android 应用程序的完整源代码这一事实”——他们可以获取“完整源代码”大多数操作系统的大多数客户端应用程序。诚然,像 Java 这样的基于字节码的语言往往比本机指令更容易反编译。如果您担心客户端应用程序的安全性,请仅编写服务器端应用程序(不过,请注意浏览器中讨厌的 JavaScript!)。
    • 我不关心有人希望在应用程序中做一些小改动,但担心有人能够做出相当大的改变(例如 10%)并将其上传到 Google Play。使用本机代码,这更难实现。我已经移动了一些部分来使用 JNI,希望 Google 提供更多的本地库。我的背景是写 ASP.net 页面,我写的 JavaScript 从来没有包含任何重要的东西。
    【解决方案2】:

    只需在下面使用,将其添加到您的 Proguard 配置文件中

    -keepclassmembers class **.R$* {
    public static <fields>;}
    

    【讨论】:

      【解决方案3】:

      使用 Android 的默认配置,ProGuard 会完全删除 R 类,除非您的代码对它们执行自省。在后一种情况下,ProGuard 还会保留字段的原始名称,以免破坏自省。

      话虽如此,资源名称也可以从资源 XML 文件中检索,ProGuard 保持不变。

      【讨论】:

      • 但是为什么 $R.id 字段会出现在 seed.txt 列表中,我没有使用自省,所以调用 findViewByID(R.id.btnSave) 会发生什么,proguard 是否替换它与整数,例如findViewByID(134234323)
      【解决方案4】:

      这可以通过 Ant 实现,因为它允许您设置不同的 gen 和 res 文件夹。

      因此,您所做的就是从原始文件复制到这些文件夹,然后使用正则表达式编辑文件以更新为新名称。

      您将需要一个像这样的翻译类(例如 D)将其映射到 R.class 中的字段,因此在您的代码中您可以使用非混淆名称。

      public final class D{
        public static final class id{
          D.btnSaveArticle = R.id.btnSaveArticle //DHTXM; 
      

      然后你还需要创建一个不同的 src 文件夹并从原始文件夹中复制。在那里你运行一个任务来编辑 D 类,所以它变成了

         D.btnSaveArticle = R.id.DHTXM;
      

      我必须创建一个通过 ant 运行的 java 程序来将名称交换为混淆名称。

      如果你对字符串做类似的事情,并且你在 apk 中的 XML 样式最终会看起来像这样:

      <TextView
              android:id="@+id/GnvCMa"
              android:text="@string/OVuCbd"
              style="@style/ZOVkuu.MGTRgZ" />
      

      设置起来有点费时,但一旦实施,它就可以用于其他项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-24
        • 2021-08-10
        • 1970-01-01
        • 2012-05-04
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多