我们可以使用dex2jar工具或任何其他方式在java中混淆​​注释吗?

时间:2014-09-25 07:37:36

标签: java android obfuscation aspectj

我正在构建一个项目,在AspectJ的帮助下拦截Android中的方法。 当我构建我创建的代码的jar文件时,它会创建我在方法上应用的每个切入点的编译语法,如下所示:

混淆之前的代码:

 @After(value="(execution(* android.app.Activity.onCreate(..)) && (target(obj) && within(com.snapdeal.ui.activity.MainActivity)))", argNames="obj")
      public void ajc$after$demo_Common_Aspects$1$dcc8d2c5(Object obj)
      {
        .
        .
        .
      }

当我使用dex2jar工具对此方法进行模糊处理时,它只会更改方法的名称

ajc$after$demo_Common_Aspects$19$a6eef354

到我用来混淆pkt1的字符串,但Anotation,即方法定义上方的行不会改变,这显示了方法拦截的细节。

混淆后的代码:

 @After(value="(execution(* android.app.Activity.onCreate(..)) && (target(obj) && within(com.snapdeal.ui.activity.MainActivity)))", argNames="obj")
  public void pkt1(Object obj)
  {
      .
      .
      .
   }

现在我知道我们可以混淆类,方法和变量的名称。 但我想混淆这一行:

@After(value="(execution(* android.app.Activity.onCreate(..)) && (target(obj) && within(com.snapdeal.ui.activity.MainActivity)))", argNames="obj")

所以我的论点是:

  1. 我们可以混淆注释吗?如果是,如何?

  2. 我们如何模糊某些方法的局部变量?

3 个答案:

答案 0 :(得分:1)

  

我们可以混淆注释吗?如果是的话怎么样?

理论上是的。但是,如果你这样做,AspectJ注释检查代码将无法识别它们。因此,这将是一个坏主意。

  

我们如何模糊某些方法的局部变量?

没有实际意义。首先,局部变量的名称不包含在源字节码文件中。

方法参数名称是另一回事。但在您的示例中,注释处理器使用参数的名称。如果混淆器在不改变引用它们的注释参数的情况下更改它们,则处理器将失败。


理论上,您可以使用混淆器+修改后的AspectJ处理器来完成此操作。但是,没有迹象表明(例如)“proguard”或“dexguard”可以做到这一点。

答案 1 :(得分:1)

编织完成后(我假设您正在编译编织时间?)您实际上可以删除注释。它们仅在匹配/编织阶段期间需要,它们通常不再被查询(例如在运行时)。您可以编写一个简单的Asm访问者,它可以删除org.aspectj包中的任何内容。

答案 2 :(得分:0)

您可以通过使用本机AspectJ语法来解决注释混淆问题(对我来说听起来很脆弱)。也许这更有希望,但我没有尝试过。

顺便说一下,关于混淆的过度偏执通常不值得麻烦。 Java noobs不会尝试反编译您的应用程序,真正的Java向导无论如何都能够反编译它的主要部分。但这有点偏离主题,对不起我无法抗拒。