我正在构建一个项目,在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")
所以我的论点是:
我们可以混淆注释吗?如果是,如何?
我们如何模糊某些方法的局部变量?
答案 0 :(得分:1)
我们可以混淆注释吗?如果是的话怎么样?
理论上是的。但是,如果你这样做,AspectJ注释检查代码将无法识别它们。因此,这将是一个坏主意。
我们如何模糊某些方法的局部变量?
没有实际意义。首先,局部变量的名称不包含在源字节码文件中。
方法参数名称是另一回事。但在您的示例中,注释处理器使用参数的名称。如果混淆器在不改变引用它们的注释参数的情况下更改它们,则处理器将失败。
理论上,您可以使用混淆器+修改后的AspectJ处理器来完成此操作。但是,没有迹象表明(例如)“proguard”或“dexguard”可以做到这一点。
答案 1 :(得分:1)
编织完成后(我假设您正在编译编织时间?)您实际上可以删除注释。它们仅在匹配/编织阶段期间需要,它们通常不再被查询(例如在运行时)。您可以编写一个简单的Asm访问者,它可以删除org.aspectj包中的任何内容。
答案 2 :(得分:0)
您可以通过使用本机AspectJ语法来解决注释混淆问题(对我来说听起来很脆弱)。也许这更有希望,但我没有尝试过。
顺便说一下,关于混淆的过度偏执通常不值得麻烦。 Java noobs不会尝试反编译您的应用程序,真正的Java向导无论如何都能够反编译它的主要部分。但这有点偏离主题,对不起我无法抗拒。