如何解决这个 Java 项目是如何使用语言保留字作为标识符的?
我使用 JD-GUI 反编译了一个 Java 项目,当我看到所有标识符都使用 Java 保留关键字,例如 int do throw extends 等时,我感到很惊讶。
这是项目的片段:
int main(void) {
//Concanating two strings
char result[100];
const char str1[]= "hello";
const char str2[]= "buddy";
result= concanate(str1,str2);
printf("%s",result)
return 0;
}
我在另一篇关于使用 UTF-16 编码时的文章中读到,有些字符可能看起来相同,但实际上不同,所以我使用 Notepad++ 切换了编码,但这对显示没有影响。
我也尝试使用 Github 中的一些去混淆器,但没有成功。
我知道它并没有真正使用保留关键字,但我无法弄清楚,所以这里有什么技巧?
编辑:
这是项目中最小的类:
public class try extends Thread {
private int do;
private JSONArray if;
private int for;
private String int;
private String new;
}
这里是十六进制转储:
package tech.iresponse.break;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.log4j.Logger;
public class do {
public static void do(Throwable paramThrowable) {
Logger.getLogger("rootLogger").error(ExceptionUtils.getFullStackTrace(paramThrowable));
}
}
/* Location: C:\Users\User\Desktop\app.jar!\tech\iresponse\break\do.class
* Java compiler version: 8 (52.0)
* JD-Core Version: 1.1.3
*/
解决方法
虽然保留字可能不会出现在 Java 源代码中,但它们在编译的 Java 代码中是允许的。一些代码混淆工具可以利用这一点使反编译更加困难。例如,ProGuard 提供以下选项:
-obfuscationdictionary filename
指定一个文本文件,其中所有有效词都用作混淆的字段和方法名称。默认情况下,像“a”、“b”等短名称用作混淆名称。例如,使用混淆字典,您可以指定保留关键字列表或带有外来字符的标识符。 # 符号后的空格、标点符号、重复词和注释将被忽略。请注意,混淆字典几乎不能改善混淆。体面的编译器可以自动替换它们,并且可以通过使用更简单的名称再次混淆来简单地消除效果。最有用的应用程序是指定通常已经存在于类文件中的字符串(例如“代码”),从而稍微减少类文件的大小。仅在混淆时适用。
因此,如果您提供一个带有 Java 标识符(例如 this one)的列表,您最终会得到一个类文件,如果反编译会导致语法错误。当然,您可以简单地重命名变量以修复这些编译错误(例如在反编译之前自己使用 ProGuard),因此这只是一个小小的不便。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。