各位高手能帮我看看这段用jad反编译的代码如何还原成正确的代码吗?万分感谢!
  public FileID(String contentStr) 
  { 
    int firPos; 
    int endPos; 
    convertStr = ""; 
    boundary = "file.jsp?ID="; 
    firPos = 0; 
    endPos = 0; 
_L2: 
    boolean loopSign; 
    StringBuffer sb; 
    firPos = endPos; 
    loopSign = true; 
    sb = new StringBuffer(); 
    endPos = contentStr.indexOf(boundary, firPos + 1); 
    if (endPos  < 0) 
      break MISSING_BLOCK_LABEL_160; 
    endPos += 18; 
    this; 
    convertStr; 
    JVM INSTR new #31   <Class StringBuilder> ; 
    JVM INSTR dup_x1 ; 
    JVM INSTR swap ; 
    String.valueOf(); 
    StringBuilder(); 
    contentStr.substring(firPos, endPos); 
    append(); 
    toString(); 
    convertStr; 
    while (loopSign)  
    { 
      char thechar = contentStr.charAt(endPos); 
      if (ParamUtil.isNumber(thechar)) 
      { 
        sb.append(thechar); 
        endPos++; 
      } else 
      { 
        loopSign = false; 
      } 
    } 
    this; 
    convertStr; 
    JVM INSTR new #31   <Class StringBuilder> ; 
    JVM INSTR dup_x1 ; 
    JVM INSTR swap ; 
    String.valueOf(); 
    StringBuilder(); 
    EncryptBean.encrypt(sb.toString()); 
    append(); 
    toString(); 
    convertStr; 
    continue; /* Loop/switch isn't completed */ 
    this; 
    convertStr; 
    JVM INSTR new #31   <Class StringBuilder> ; 
    JVM INSTR dup_x1 ; 
    JVM INSTR swap ; 
    String.valueOf(); 
    StringBuilder(); 
    contentStr.substring(firPos); 
    append(); 
    toString(); 
    convertStr; 
    if (endPos > = 0) goto _L2; else goto _L1 
_L1: 
  } 

解决方案 »

  1.   

    初步来看,这个程序是一个从一个文本串中取file.jsp?ID=之后的18个字符和其后为合法数据字的字串作为ID设置到一个Bean中去的方法,还是一个类的构告函数,可以惜了,你给的只是部分代码,有些问题我判断不出来.
      

  2.   

    只有一个孤立的方法,很难得出正确的代码,我希望能有整个类的相关代码,没有代码的要给出class和相对路径,就像EncryptBean我就看不出来是什么
      

  3.   

    再下个jode,两个反编译的文件结合使用,基本上就OK了
      

  4.   

    这个反编译的难道是编译器的代码?我用jad反编译class文件从来没有遇到这样的情况...最多是混淆了代码,但是不会出现JVM这样的东西...
      

  5.   

    是啊,我也 反编译过很多,一般来讲,跟原本差不多,至少逻辑是不会变,只有中文变成了Unicode 码,还有文件开头加了几句JAD的信息 !
      

  6.   

    应要求贴出EncryptBean.encrypt的代码段:
      public static String encrypt(String str)
      {
        String retVal = "";
        try
        {
          byte salt[] = new byte[8];
          Random random = new Random();
          random.nextBytes(salt);
          PBEKeySpec keySpec = new PBEKeySpec("6867025".toCharArray());
          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
          javax.crypto.SecretKey key = keyFactory.generateSecret(keySpec);
          PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 1000);
          Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
          cipher.init(1, key, paramSpec);
          byte plaintext[] = str.getBytes("UTF8");
          byte ciphertext[] = cipher.doFinal(plaintext);
          BASE64Encoder encoder = new BASE64Encoder();
          String saltStr = encoder.encode(salt);
          String cipherStr = encoder.encode(ciphertext);
          retVal = (new StringBuilder(String.valueOf(saltStr))).append(cipherStr).toString();
        }
        catch (Exception e)
        {
          System.out.println((new StringBuilder("Error in EncryBean_encrypt:")).append(e.getMessage()).toString());
        }
        return retVal;
      }
      

  7.   

    另外需解决的代码中
    endPos += 18;  
    应为:
    endPos += 12;  
    不好意思:)
      

  8.   

    原反编译程序的格式:
    import util.EncryptBean;
    import util.ParamUtil;public class FileID
    {  private String convertStr;
      private String boundary;  public FileID(String contentStr)
      {
      /*加置顶的代码*/
      }  public String getEncryptStr()
      {
        return convertStr;
      }
    }
      

  9.   

    大体改了一下,还别说,我做了将进一年的盗版,几乎天天反编译,你这个是我见过的最乱的。
    说实在的,力不从心。有点怀疑你反编译的有问题。
    public FileID(String contentStr) {
    convertStr = "";
    boundary = "file.jsp?ID=";
    int firPos = 0;
    int endPos = 0;
    while (endPos >= 0) {
    boolean loopSign;
    StringBuffer sb;
    firPos = endPos;
    loopSign = true;
    sb = new StringBuffer();
    endPos = contentStr.indexOf(boundary, firPos + 1);
    if (endPos > 0) {
    endPos += 18;
    sb.append(contentStr.substring(firPos, endPos));
    while (loopSign) {
    char thechar = contentStr.charAt(endPos);
    if (ParamUtil.isNumber(thechar)) {
    sb.append(thechar);
    endPos++;
    } else {
    loopSign = false;
    }
    }
    convertStr = EncryptBean.encrypt(sb.toString());
    }
    }
    }
      

  10.   

    请问zzr82528你用的是什么来反编译的!谢谢
      

  11.   

    跟你一样,JAD,用过其它的,最后还是觉得这个最合用。
    只是从没反出来这么乱的代码。
    最多的是异常处理和内部类的问题。
      

  12.   

    上面的代码,我是用Xjad进行反编译的。
    如果在命令提示符下输入jad FileID.class就会报下面的错误:
    Parsing FileID.class...The class file version is 49.0 (only 45.3, 4
    6.0 and 47.0 are supported)
     Generating FileID.jad
    Couldn't fully decompile method <init>
    jad用了1.5.7g和1.5.8e2版本,都报这个错误。是不是这个原因导致?
      

  13.   

    我用最新的jad v1.5.8g进行反编译仍然报错
    Parsing FileID.class... Generating FileID.jad
    Couldn't fully decompile method <init>
    看来是因为混淆的原因
      

  14.   

    反编译用CAVAJ试试,可直接BAIDU找到,或者留下邮箱,我发
      

  15.   

    我咋觉得楼主这段反编译的结果还算清楚的啊……首先,原来的程序肯定是用 JDK1.5 以上的版本写的,因为用到了 StringBuilder。其次,反编译不能正确处理 StringBuilder,看样子是反编译器支持的版本比较低。可以考虑看看反编译器有没有什么参数可以控制这个。再有,反编译的结果里连符号调试信息都能看见,貌似没做过什么混淆,甚至编译的时候连 DEBUG 都没有关掉。
      

  16.   

    反编译有意思嘛,现在流行OPEN
      

  17.   

    jad确实有这样的问题,比如有内部类的时候等