如何使用字节码ASM JAVA中的方法包装变量

时间:2019-02-08 18:32:12

标签: java bytecode java-bytecode-asm bytecode-manipulation jvm-bytecode

我正在遍历方法节点中的指令时尝试使用ASM对方法调用中的参数中的变量进行加密。

目前,我尝试在方法调用的前一行(在实际的Java代码中)对字符串进行加密。

即。如果该行是Logger(“ This is a log”,a)

我的算法所做的是,a = Project.Util.encode(a);在记录器的前一行中。示例代码如下。

if(abstractNode instanceof VarInsnNode) {
    VarInsnNode varnode = (VarInsnNode) abstractNode;
        insnList.add(new FieldInsnNode(GETSTATIC, "com/sample/Project", "Util", "Ljava/io/PrintStream;"));
        insnList.add(new VarInsnNode(ALOAD,varnode.var));
        insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)Ljava/lang/String;"));
       insnList.add(new VarInsnNode(ASTORE,varnode.var));
     }

我从方法调用描述中计算出参数,每当找到一个变量时,我都会通过改变其值来进行编码,然后在方法调用字节结构的末尾(通过向上遍历)将这些指令粘贴在它们之前

但是我想删除它的用法。相反,我想像这样。

Logger(“ This is a log”,encode(a));

考虑我将变量a作为抽象节点。 我尝试在此特定变量之前和之后添加指令。

 methodNode.instructions.insertBefore(abstractNode, new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
 methodNode.instructions.insertBefore(abstractNode.getNext(),new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)Ljava/lang/String;"));

说堆栈没有足够的空间会导致失败。

请在这种情况下帮助我。

0 个答案:

没有答案