12

我从 apt 工具页面中了解到,可以创建 AnnotationProcessors 来生成新的派生文件(源文件、类文件、部署描述符等)。我正在寻找这样做的例子。

我需要在编译时对所有带注释的字符串进行编码,以便读取类文件不允许读取静态字符串:

基本代码:

String message = (@Obfuscated "a string that should not be readable in class file");

应该重做为:

String message = new ObfuscatedString(new long[] {0x86DD4DBB5166C13DL, 0x4C79B1CDC313AE09L, 0x1A353051DAF6463BL}).toString();

基于ObfuscatedString.obfuscate(String)TrueLicense 框架的静态方法,处理器可以生成代码来替换带注释的字符串。实际上,此方法会生成字符串“new ObfuscatedString([numeric_code]).toString()”。在运行时,ObfuscatedString 的 toString() 方法能够返回以数字代码编码的字符串。

关于如何编写 AnnotationProcessor 的 process() 方法来编辑带注释的代码的任何想法?

提前致谢,

4

4 回答 4

2

你可以有

String message = Obfuscated.decode("a string that should not be readable in class file");

它可以正常编译,但是在编译后你有一个检查字节码的工具,例如使用 ObjectWeb 的 ASM,改变字符串文字,所以它看起来像

String message = Obfuscated.decode("\u86DD\u4DBB\u5166\uC13D\u4C79\uB1CD\uC313\uAE09\u1A35\u3051\uDAF6\u463B");

为了更容易识别需要更改的字符串,您可以为它们添加一个前缀,并且您可以确保该前缀在代码被混淆后确实出现。

String s = "Obfuscate: a string that should not be readable in class file";
// later
String message = Obfuscated.decode(s);
于 2011-07-01T12:28:49.497 回答
2

我敢打赌勺子可能就是你要找的东西。但是为什么要混淆静态字符串呢?

于 2011-07-06T13:48:40.770 回答
1

Zelix KlassMaster提供了这种能力。内存的话,以前3人以下的公司是免费的,但是我刚查了他们的购买页面,现在好像对小公司收取小开发者费用。我已经好几年没用过了(至少 5 年或 7 年),但它在混淆字符串和一般代码方面做得非常出色。

于 2012-05-07T14:59:25.480 回答
1

当我要生成分发它的版本时,我有一个类使用 Ofuscated String 调用覆盖所有常量:

这是过程:

  1. 我运行我的 ANT,将所有代码复制到其他地方。
  2. 对 OfuscateJavaConstant 的 ANT 调用。
  3. 我编译代码。

蚂蚁:

 <java classname="de.schlichtherle.util.ObfuscatedString">
     <arg value="${of.constant}" />
     <classpath>
         <pathelement location="${exit.path}/${buildDir}" />
         <path refid="myclasspath" />
     </classpath>
  </java>

Java Ofuscate 代码(ObfuscatedString):

public static void main(String[] args) {
    if ( args!=null ){
        String[] ficheros = args[0].split(";");

        if ( args!=ficheros )
            for (String ruta:ficheros)
                ofuscateConstantClass( ruta );
    }
}

private static void ofuscateConstantClass( String fileName ){

    File archivo = null;
    FileReader fr = null;
    BufferedReader br = null;
    List<String> sb  = new ArrayList<String>();
    FileWriter fichero = null;
    PrintWriter pw = null;

    try{
        archivo = new File( fileName );
        fr = new FileReader (archivo);
        br = new BufferedReader(fr);
        String linea;
        while( (linea=br.readLine())!=null ){

            String noWhite = linea.trim().replaceAll(" +", " ");

            if ( noWhite.toLowerCase().startsWith("public static final string") && noWhite.endsWith("\";") ){

                String firstPart = noWhite.substring(0, noWhite.indexOf("\"") );
                String constant = noWhite.substring(noWhite.indexOf("\"")+1, noWhite.lastIndexOf("\"") );
                String ofuscatedConstant = obfuscate( constant );
                String secondPart = noWhite.substring(noWhite.lastIndexOf("\"")+1 );
                sb.add( firstPart + ofuscatedConstant + secondPart );
                System.out.println( constant + "-->" + ofuscatedConstant );
            } else
                sb.add( linea );
        }

        fichero = new FileWriter( fileName );
        pw = new PrintWriter(fichero);
        for (String s:sb)
            pw.println( s );

    } catch ( Exception e){

    } finally {
         try{
             if( null != fr )
                 fr.close();
             if( null != pw )
                 pw.close();
             if( null != fichero )
                 fichero.close();
         }catch (Exception e2){
            e2.printStackTrace();
         }
    }

}

希望能帮助到你 :)

于 2012-05-07T15:09:58.330 回答