我正在遍历方法节点中的指令时尝试使用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;"));
说堆栈没有足够的空间会导致失败。
请在这种情况下帮助我。