gpt4 book ai didi

java - 如何在 FernFlower 中使用自定义重命名器?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:21 30 4
gpt4 key购买 nike

我目前有一个 FernFlower 的工作设置,它是这样的;

我有 fernflower.jar 和一个 fern.bat 文件,其内容是:

title FernFlower
java -jar fernflower.jar -dgs=1 -ren=1 C:\Users\bernhardkiv\Desktop\test\test-obf.jar C:\Users\bernhardkiv\Desktop\test\src

参数 -ren 1 使得名称少于 3 个字符(或类似名称)的任何方法和字段都重命名为 func_blahfield_blah(分别地,方法获得 func_ 名称,字段获得 field_ 名称。

在 fernflower 的自述文件中有这一部分:

 5. Renaming identifiers

Some obfuscators give classes and their member elements short, meaningless and above all
ambiguous names. Recompiling of such code leads to a great number of conflicts. Therefore it is
advisable to let the decompiler rename elements in its turn, ensuring uniqueness of each identifier.

Option 'ren' (i.e. -ren=1) activates renaming functionality. Default renaming strategy goes as follows:
- rename an element if its name is a reserved word or is shorter than 3 characters
- new names are built according to a simple pattern: (class|method|field)_<consecutive unique number>
You can overwrite this rules by providing your own implementation of the 4 key methods invoked by the decompiler while renaming. Simply pass a class that implements de.fernflower.main.extern.IIdentifierRenamer in the option 'urc' (e.g. -urc=com.mypackage.MyRenamer) to Fernflower.
The class must be available on the application classpath.

通过它,我已经通读并理解它是如何工作的,但是我在添加自己的重命名功能实现时遇到了麻烦。

我创建了一个类,实现了IIdentifierRenamer,其内容如下;

public class MyRenamer implements IIdentifierRenamer {

@Override
public String getNextClassname(String arg0, String arg1) {
return "_" + arg0 + "_" + arg1;
}

@Override
public String getNextFieldname(String arg0, String arg1, String arg2) {
return "_" + arg0 + "_" + arg1 + "_" + arg2;
}

@Override
public String getNextMethodname(String arg0, String arg1, String arg2) {
return "_" + arg0 + "_" + arg1 + "_" + arg2;
}

@Override
public boolean toBeRenamed(int arg0, String arg1, String arg2, String arg3) {

System.out.println(arg0 + ", " + arg1 + ", " + arg2 + ", arg3");
return true;
}

}

首先,在你质疑为什么我返回 nextMethod/Class/Field 方法的所有参数之前,我可以探索并查看这些参数实际上是什么,因为绝对没有文档 AFAIK。

我把这个类编译成一个jar,命名为custre.jar,并把它和我的fern.bat放在同一个文件夹中。

我现在不确定该怎么做才能继续,如果你对 FernFlower 有任何了解,请回复我,如果你能帮助我。

最佳答案

好吧,我花了一些时间才弄明白这一点。首先,注意fernflower源码中有一个实现默认重命名的类:

src/org/jetbrains/java/decompiler/modules/renamer/ConverterHelper.java

将此文件作为模板复制到您自己的位置,根据您的需要进行调整。我将包更改为:

package jimm3rs.renamer;

并将调试消息输出添加到 toBeRenamed 方法:

System.out.println("Custom Renamer: processing [" + classname + "]");

然后编译:

javac -cp ~/fernflower/trunk/fernflower.jar ConverterHelper.java

下一步是指示 fernflower 使用此自定义重命名器:

java -classpath fernflower.jar:/home/martin/mycode/ org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=1 -ren=1 -urc=jimm3rs.renamer.ConverterHelper /home/martin/Downloads/idea-IC-141.1532.4/lib/boot.jar .

请注意,在上面的代码目录 /home/martin/mycode/ 中包含一个名为 jimm3rs 的子目录,该子目录又包含名为 renamer 的目录它存储我们的自定义重命名器类。如果您希望执行额外的步骤,可以将其更改为使用 jar。

调试类加载时的一个有用提示是为 java 指定 -Dsun.misc.URLClassPath.debug=true 选项。

最后我想说的是使用-jar 语法来运行 fernflower.jar 并没有做诀窍:通过 -classpath 指定的自定义类对 fernflower 不可见。

关于java - 如何在 FernFlower 中使用自定义重命名器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712290/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com