我正在尝试对.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"
之类的事情时,我也不会注意到反编译输出中的任何区别。
答案 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();
}
}
然后您可以将字节写回到磁盘
希望有帮助!