转换 FieldInsnNode 的名称和信息

Transforming FieldInsnNode's names and information

我正在尝试对 .jar 的代码进行去混淆处理。我创建了一个成功重命名方法(包括 return 类型)、class 及其超级 class 及其字段的模块。

我现在的问题是实际的字节码。我正在尝试修改 FieldInsnNode 和 MethodInsnNode 的值以更改它们的名称。示例:g.y.x(); 应为 node.next.generateHash()

MethodInsnNode min = (MethodInsnNode) insn;

min.name = remappedNames.getOrDefault(min.owner + "." + min.name + min.desc, min.name);
min.owner = remappedNames.getOrDefault(min.owner, min.owner);
min.desc = transformMethodDesc(min.desc);

我想我误解了名称、所有者和描述是什么。这是我目前的理解:

name = 变量的实际名称。例如。在我之前的示例中,next 的字段混淆后的 name 值为 y

所有者有点混乱,我不太确定那是什么,我猜它是变量响应的 class。例如这里的所有者是 g

希望得到任何澄清,因为即使我做了类似 min.name = "TEST" 的操作,我也没有注意到反编译输出有任何差异。

我终于找到了问题的答案。

Field/Method 节点是 class 的表示,但显然改变它们不会改变 class 本身的任何内容。为了更改 classes,您必须使用 JarOutputStream 和 ClassWriter 之类的东西将其输出回磁盘。

简单示例:

JarOutputStream jos = ...
ClassWriter cw = new ClassWriter();
cw.accept(myClassNode);
byte[] bytes = cw.toByteArray();

然后你可以将字节写回磁盘

希望对您有所帮助!