转换FieldInsnNode的名称和信息

时间:2019-01-15 11:43:48

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

我正在尝试对.jar的代码进行模糊处理。我创建了一个模块,该模块成功重命名了方法(包括返回类型),类及其超类以及其字段。

我现在的问题是实际的字节码。我试图修改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);

我认为我误会了名称,所有者和desc。这是我目前的理解:

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

所有者有点混乱,我不太清楚确切是什么,我猜它是变量响应的类。例如,这里的所有者为g

我们将不胜感激,即使我做类似min.name = "TEST"之类的事情时,我也不会注意到反编译输出中的任何区别。

1 个答案:

答案 0 :(得分:0)

我最终想出了问题的答案。

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

简单的例子:

class MyCustomStatefulWidget extends StatefulWidget {
  final String title;

  MyCustomStatefulWidget(this.title);

  @override
  _MyCustomStatefulWidgetState createState() => _MyCustomStatefulWidgetState();
}

class _MyCustomStatefulWidgetState extends State<MyCustomStatefulWidget> {
  @override
  Widget build(BuildContext context) => Text(widget.title);

  @override
  void dispose() {
    print("dispose");
    super.dispose();
  }
}

然后您可以将字节写回到磁盘

希望有帮助!