Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们可以使用dex2jar工具或任何其他方式混淆java中的注释吗?_Java_Android_Obfuscation_Aspectj - Fatal编程技术网

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

我们可以使用dex2jar工具或任何其他方式混淆java中的注释吗?,java,android,obfuscation,aspectj,Java,Android,Obfuscation,Aspectj,我正在AspectJ的帮助下构建一个项目,以便在Android中拦截该方法。 当我构建我创建的代码的jar文件时,它会创建我在方法上应用的每个切入点的编译语法,如下所示: 混淆前的代码: @After(value="(execution(* android.app.Activity.onCreate(..)) && (target(obj) && within(com.snapdeal.ui.activity.MainActivity)))", argNames

我正在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)
      {
        .
        .
        .
      }
 @After(value="(execution(* android.app.Activity.onCreate(..)) && (target(obj) && within(com.snapdeal.ui.activity.MainActivity)))", argNames="obj")
  public void pkt1(Object obj)
  {
      .
      .
      .
   }
当我使用dex2jar工具混淆这个方法时,它只会更改方法的名称

ajc$after$demo_Common_Aspects$19$a6eef354
我用来混淆
pkt1
的字符串,但方法定义上方的一行显示了方法拦截的详细信息

混淆后的代码:

 @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)
      {
        .
        .
        .
      }
 @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")
因此,我的辞职是:

  • 我们可以混淆注释吗?如果是,怎么做

  • 我们如何混淆某些方法的局部变量

  • 我们可以混淆注释吗?如果是,怎么做

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

    我们如何混淆某些方法的局部变量

    这是没有意义的。本地变量的名称首先不包括在源字节码文件中

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



    理论上,您可以使用一个模糊器+修改的AspectJ处理器来实现这一点。但是,没有迹象表明(例如)“proguard”或“dexguard”可以做到这一点。

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

    您可以通过使用本地aspectj语法来解决注释混淆的问题(对我来说这是一件非常脆弱的事情)。也许这更有希望,但我没有尝试过

    顺便说一句,对于混淆过度偏执通常不值得费心。JavaNoobs不会尝试反编译你的应用程序,真正的Java向导无论如何都可以反编译它的主要部分。但这有点离题了,对不起,我无法抗拒