Java不是抛弃了goto语句吗。是否有两种可能:
一是你反编译的类文件是很老的版本(这种可能性好象不大),二是此Java类被作者加密了,既就是为防止反编译而加入goto语句,让别人无法反编译。

解决方案 »

  1.   

    多谢两位老兄.下面的内容是带BREAK的反编译之后的代码:
    URL url1;
            url1 = null;
            if(s.startsWith("str1"))
            {
                url1 = new URL(url, s.substring(4));
                break MISSING_BLOCK_LABEL_1;
            }
            if(s.startsWith("str2:"))
            {
                url1 = new URL(url, s.substring(4));
                break MISSING_BLOCK_LABEL_1;
            }
    而且在整个那个JAVA文件中,再也找不到第三个地方有:MISSING_BLOCK_LABEL_1这个东东了.还有这种情况出错的:
    break MISSING_BLOCK_LABEL_2;
            IOException ioexception;
            ioexception;(无缘无故多了个这行,肯定是出错的).
    这样,我反编译过后就无法再编译过去了.不知是不是我的反编译工具不够利害还是JAVA的反编译确实不是那么简单顺利的就能完全反编译过来了?
      

  2.   

    TO  tengyuandao(无名) 兄:
    先谢谢你的回复了
    1、第一种可能是不会的,他的代码用了SWING,是用的JDK1。4。1的版本的。
    2、加密应该也不是,JAR包里有几十个文件,只有三四个文件有那种情况出现的。而且我以前在CSDN上看到过一篇介绍JAVA反编译的文章,说是如果FOR循环嵌套多了几层后,反编译过来的就可能会出现GOTO了,郁闷的是,我刚刚找那篇文章找了半天,居然没找到了
      

  3.   

    改成return之类的试试看。反正你已经知道它的业务逻辑,自己修改一下应该差不多。
    带有GOTO的循环语句很容易理解的,也可以贴出来看。
      

  4.   

    整个的代码有差不多4000行,贴出来可能也没有人有耐心全部看下去吧.
    我刚刚又仔细看了看,那些不正常的代码都是出现在一些方法里面的,我贴出一个完整的方法大家帮我看看:
    private boolean check()
        {
            String s;
            if((s = getParameter("GB")) == null)
                break MISSING_BLOCK_LABEL_237;/////////第一个不正常的地方?????
            boolean flag;
            long al[] = {
                0L, 0L, 0L, 0L, 0L
            };
            InetAddress inetaddress = InetAddress.getByName(getCodeBase().getHost());
            StringTokenizer stringtokenizer = new StringTokenizer(inetaddress.getHostAddress(), ".");
            al[0] = Long.parseLong(stringtokenizer.nextToken());
            al[1] = Long.parseLong(stringtokenizer.nextToken());
            al[2] = Long.parseLong(stringtokenizer.nextToken());
            al[3] = Long.parseLong(stringtokenizer.nextToken());
            al[4] = al[0] + (al[2] << 8) + (al[1] << 16) + (al[3] << 24);
            stringtokenizer = new StringTokenizer(s, ";");
            String s1;
            for(flag = al[4] == 0x100007fL; !flag && stringtokenizer.hasMoreTokens(); flag = (Long.parseLong(s1, 16) ^ 0x29dbda2dL) == al[4])
                s1 = stringtokenizer.nextToken();        m_bCopyright = flag;
            return flag;
            Exception exception;
            exception;/////////////第二个不正常的地方??????????
            System.out.println(exception.getMessage());
            m_bCopyright = false;
            return true;
            return false;////////这两个return有点莫明其妙????????????
        }
    还有其它几处地方的都是类似这种的,上面的这个方法是独立的,在上面的方法中,共有三处我觉得不正常的地方,都已经标出来了.
    另外一点:那个:break MISSING_BLOCK_LABEL_237的MISSING_BLOCK_LABEL_237在整个全文都找不到第二个地方的了?
    还烦各位老兄帮忙看看,谢谢!
      

  5.   

    我也用JAD反编译过很多这样的文件,你遇到多少GOTO,我遇到这种情况一般都遇到
    几百个GOTO,读是肯定读不懂的。连函数都搞不清楚有几个
      

  6.   

    第一处显然就是return或者exit,参数不正确的处理。
    第二处应该是异常处理。
      

  7.   

    这个类文件是用了混淆器处理过了,我也曾经反编译了好几个
      软件,里面不乏有上面的这种情况,这是由于在Java类文件中
    删除了许多无关的信息,如行号表等,因此呢反编译时有些就不
    可以还原成原来的样子, 不过,也不要紧, 分析一下,你就会发现
    一些规律.你的上面一段代码大致可改成:      private boolean check()
              {
                  String s;
                  if((s = getParameter("GB")) == null) return;
    //                  break MISSING_BLOCK_LABEL_237;/////////第一个不正常的地方?????
                  boolean flag;
                  long al[] = {
                      0L, 0L, 0L, 0L, 0L
                  };
                  try{
                  InetAddress inetaddress = InetAddress.getByName(getCodeBase().getHost());
                  StringTokenizer stringtokenizer = new StringTokenizer(inetaddress.getHostAddress(), ".");
                  al[0] = Long.parseLong(stringtokenizer.nextToken());
                  al[1] = Long.parseLong(stringtokenizer.nextToken());
                  al[2] = Long.parseLong(stringtokenizer.nextToken());
                  al[3] = Long.parseLong(stringtokenizer.nextToken());
                  al[4] = al[0] + (al[2] << 8) + (al[1] << 16) + (al[3] << 24);
                  stringtokenizer = new StringTokenizer(s, ";");
                  String s1;
                  for(flag = al[4] == 0x100007fL; !flag && stringtokenizer.hasMoreTokens(); flag = (Long.parseLong(s1, 16) ^ 0x29dbda2dL) == al[4])
                      s1 = stringtokenizer.nextToken();              m_bCopyright = flag;
                  return flag;
                  }catch(Exception exception){
                      System.out.println(exception.getMessage());
                      m_bCopyright = false;
                      return true;
                  }
                  //Exception exception;
                  //exception;/////////////第二个不正常的地方??????????
                  return false;////////这两个return有点莫明其妙????????????
              }}这个混淆的还不算历害,我反编译的一个项目,每个类的每个方法都混淆过了, 
    总共160多个类,做了一个星期也给做完,真的好辛苦.
      

  8.   

    多谢各位老兄的相助,尤其感谢Djava(Djava) 兄给我分析的代码,以前没有过这方面的经验,听你这么一分析,还真是有点规律,我今天晚上先照Djava(Djava) 兄的规律好好改一改,看看如何,不行明天再向各位请教.
      

  9.   

    经过各位的帮助后,那个BREAK LABLE差不多处理好了,不过另外的GOTO的情况,我看了半天还没找出规律来,各位再帮小弟看看这个包含GOTO的语句,指点指点其中的反编译的规律,不胜感激!public boolean create(GSLine gsline, double d, double d1)
        {
            GDot gdot4;
            GDot gdot5;
            double d2;
            int i;
            int l;
            int i1;
            boolean flag2;
            boolean flag3;
            boolean flag = false;
            gdot4 = null;
            gdot5 = null;
            d2 = 0.0D;
            l = -1;
            i1 = -2;
            flag2 = d >= 0.0D;
            flag3 = d1 >= 0.0D;
            d = flag2 ? d : -d;
            d1 = flag3 ? d1 : -d1;
            if(flag2 == flag3)
                if(!flag2);
            i = flag2 ? 0 : gsline.m_Data.size() - 1;
              goto _L1   ////////////第一处goto
    _L3:
            GDot gdot = gsline.m_Data.dotAt(i);
            GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1);
            double d3 = gdot.distance(gdot2.m_x, gdot2.m_y);
            if(d3 == 0.0D)
                continue; /* Loop/switch isn't completed */
            d2 += d3;
            if(d == 0.0D)
            {
                l = flag2 ? i + 1 : i - 1;
                gdot4 = new GDot(gdot.m_x, gdot.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 == d)
            {
                l = flag2 ? i + 1 : i - 1;
                gdot4 = new GDot(gdot2.m_x, gdot2.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 <= d)
                continue; /* Loop/switch isn't completed */
            l = flag2 ? i + 1 : i - 1;
            d2 = d - (d2 - d3);
            gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y));
            break; /* Loop/switch isn't completed */
            i = flag2 ? i + 1 : i - 1;
    _L1:
            if(flag2 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L3; /////第二处goto
            else goto _L2 //////////第三处goto
    _L2:
            l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0;
            i = flag3 ? 0 : gsline.m_Data.size() - 1;
              goto _L4   ///////第四处goto
    _L6:
            GDot gdot1 = gsline.m_Data.dotAt(i);
            GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1);
            double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y);
            if(d4 == 0.0D)
                continue; /* Loop/switch isn't completed */
            d2 += d4;
            if(d1 == 0.0D)
            {
                i1 = flag3 ? i + 1 : i - 1;
                gdot5 = new GDot(gdot1.m_x, gdot1.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 == d1)
            {
                i1 = flag3 ? i + 1 : i - 1;
                gdot5 = new GDot(gdot3.m_x, gdot3.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 <= d1)
                continue; /* Loop/switch isn't completed */
            i1 = flag3 ? i + 1 : i - 1;
            d2 = d1 - (d2 - d4);
            gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y));
            break; /* Loop/switch isn't completed */
            i = flag3 ? i + 1 : i - 1;
    _L4:
            if(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L6;//////第五处goto
            else goto _L5 /////////////////第六处goto
    _L5:
            i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0;
            GDots gdots = new GDots();
            if(l < i1)
            {
                System.out.println("iIndex1 " + l + " iIndex2 " + i1);
                gdots.addDot(gdot4);
                for(int j = l; j < i1; j++)
                    gdots.addDot(gsline.m_Data.dotAt(j));            gdots.addDot(gdot5);
            } else
            {
                System.out.println("iIndex1 " + l + " iIndex2 " + i1);
                gdots.addDot(gdot4);
                for(int k = i1; k < l; k++)
                    gdots.addDot(gsline.m_Data.dotAt(k));            gdots.addDot(gdot5);
            }
            m_pLine = gsline;
            m_dLength1 = d;
            m_dLength2 = d1;
            add(gdots);
            adjustRect();
            m_lID = gsline.m_lID;
            m_sName = gsline.m_sName;
            boolean flag1 = true;
            return flag1;
        }
      

  10.   

    感觉是while循环,goto语句是循环条件的判断。
      

  11.   

    感谢上面几位老兄抽时间看了那段代码.
    应该是用了混淆器的,goto也应该是在循环中条件判断,可这样一来,这代码反编译过来后不知如何去还原了,其中的规律硬是看不出来各位帮忙看看.感觉感谢!
    我的反编译工具是JAD
      

  12.   

    这还不算是混淆, 看看永中office中的java代码,你就知道什么是真正的混淆了
    除非必须要修改,否则放弃吧!
      

  13.   

    先在上面加了注释性质的块分割:
    public boolean create(GSLine gsline, double d, double d1)
        {
            GDot gdot4;
            GDot gdot5;
            double d2;
            int i;
            int l;
            int i1;
            boolean flag2;
            boolean flag3;
            boolean flag = false;
            gdot4 = null;
            gdot5 = null;
            d2 = 0.0D;
            l = -1;
            i1 = -2;
            flag2 = d >= 0.0D;
            flag3 = d1 >= 0.0D;
            d = flag2 ? d : -d;
            d1 = flag3 ? d1 : -d1;
            if(flag2 == flag3)
                if(!flag2);
            i = flag2 ? 0 : gsline.m_Data.size() - 1;
              goto _L1   ////////////第一处goto
    //while(flag2 ? i < gsline.m_Data.size() - 1 : i > 0);            
    //{===============================================================          
    _L3:
            GDot gdot = gsline.m_Data.dotAt(i);
            GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1);
            double d3 = gdot.distance(gdot2.m_x, gdot2.m_y);
            if(d3 == 0.0D)
                continue; /* Loop/switch isn't completed */
            d2 += d3;
            if(d == 0.0D)
            {
                l = flag2 ? i + 1 : i - 1;
                gdot4 = new GDot(gdot.m_x, gdot.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 == d)
            {
                l = flag2 ? i + 1 : i - 1;
                gdot4 = new GDot(gdot2.m_x, gdot2.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 <= d)
                continue; /* Loop/switch isn't completed */
            l = flag2 ? i + 1 : i - 1;
            d2 = d - (d2 - d3);
            gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y));
            break; /* Loop/switch isn't completed */
            i = flag2 ? i + 1 : i - 1;
    _L1:
            if(flag2 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L3; /////第二处goto
    //}===============================================================                  
            else goto _L2 //////////第三处goto
    _L2:
            l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0;
            i = flag3 ? 0 : gsline.m_Data.size() - 1;
              goto _L4   ///////第四处goto
    //while(flag3 ? i < gsline.m_Data.size() - 1 : i > 0)
    //{============================================================== 
    _L6:
            GDot gdot1 = gsline.m_Data.dotAt(i);
            GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1);
            double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y);
            if(d4 == 0.0D)
                continue; /* Loop/switch isn't completed */
            d2 += d4;
            if(d1 == 0.0D)
            {
                i1 = flag3 ? i + 1 : i - 1;
                gdot5 = new GDot(gdot1.m_x, gdot1.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 == d1)
            {
                i1 = flag3 ? i + 1 : i - 1;
                gdot5 = new GDot(gdot3.m_x, gdot3.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 <= d1)
                continue; /* Loop/switch isn't completed */
            i1 = flag3 ? i + 1 : i - 1;
            d2 = d1 - (d2 - d4);
            gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y));
            break; /* Loop/switch isn't completed */
            i = flag3 ? i + 1 : i - 1;
    _L4:
            if(flag3 ? i < gsline.m_Data.size() - 1 : i > 0) goto _L6;//////第五处goto
    //}======================================================================================
            else goto _L5 /////////////////第六处goto
    _L5:
            i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0;
            GDots gdots = new GDots();
            if(l < i1)
            {
                System.out.println("iIndex1 " + l + " iIndex2 " + i1);
                gdots.addDot(gdot4);
                for(int j = l; j < i1; j++)
                    gdots.addDot(gsline.m_Data.dotAt(j));            gdots.addDot(gdot5);
            } else
            {
                System.out.println("iIndex1 " + l + " iIndex2 " + i1);
                gdots.addDot(gdot4);
                for(int k = i1; k < l; k++)
                    gdots.addDot(gsline.m_Data.dotAt(k));            gdots.addDot(gdot5);
            }
            m_pLine = gsline;
            m_dLength1 = d;
            m_dLength2 = d1;
            add(gdots);
            adjustRect();
            m_lID = gsline.m_lID;
            m_sName = gsline.m_sName;
            boolean flag1 = true;
            return flag1;
        }
      

  14.   

    以下是我按上面的逻辑修改好的,估计问题不会很多了。
    请看我的部分注释。
    public boolean create(GSLine gsline, double d, double d1)
    {
        GDot gdot4;
        GDot gdot5;
        double d2;
        int i;
        int l;
        int i1;
        boolean flag2;
        boolean flag3;
        boolean flag = false;
        gdot4 = null;
        gdot5 = null;
        d2 = 0.0D;
        l = -1;
        i1 = -2;
        flag2 = d >= 0.0D;
        flag3 = d1 >= 0.0D;
        d = flag2 ? d : -d;
        d1 = flag3 ? d1 : -d1;
        if(flag2 == flag3)
            if(!flag2);//=============================>这里有问题!!
        i = flag2 ? 0 : gsline.m_Data.size() - 1;
        //===============================================================  
        while(flag2 ? i < gsline.m_Data.size() - 1 : i > 0);            
        { 
            GDot gdot = gsline.m_Data.dotAt(i);
            GDot gdot2 = gsline.m_Data.dotAt(flag2 ? i + 1 : i - 1);
            double d3 = gdot.distance(gdot2.m_x, gdot2.m_y);
            if(d3 == 0.0D)
                continue; /* Loop/switch isn't completed */
            d2 += d3;
            if(d == 0.0D)
            {
                l = flag2 ? i + 1 : i - 1;
                gdot4 = new GDot(gdot.m_x, gdot.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 == d)
            {
                l = flag2 ? i + 1 : i - 1;
                gdot4 = new GDot(gdot2.m_x, gdot2.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 <= d)
                continue; /* Loop/switch isn't completed */
            l = flag2 ? i + 1 : i - 1;
            d2 = d - (d2 - d3);
            gdot4 = new GDot((float)((double)(gdot2.m_x - gdot.m_x) * (d2 / d3) + (double)gdot.m_x), (float)((double)(gdot2.m_y - gdot.m_y) * (d2 / d3) + (double)gdot.m_y));
            break; /* Loop/switch isn't completed */
            i = flag2 ? i + 1 : i - 1;
        }
        //===============================================================                      l = l != -1 ? l : flag2 ? gsline.m_Data.size() - 1 : 0;
        i = flag3 ? 0 : gsline.m_Data.size() - 1;    //===============================================================
        while(flag3 ? i < gsline.m_Data.size() - 1 : i > 0)
        {
            GDot gdot1 = gsline.m_Data.dotAt(i);
            GDot gdot3 = gsline.m_Data.dotAt(flag3 ? i + 1 : i - 1);
            double d4 = gdot1.distance(gdot3.m_x, gdot3.m_y);
            if(d4 == 0.0D)
                continue; /* Loop/switch isn't completed */
            d2 += d4;
            if(d1 == 0.0D)
            {
                i1 = flag3 ? i + 1 : i - 1;
                gdot5 = new GDot(gdot1.m_x, gdot1.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 == d1)
            {
                i1 = flag3 ? i + 1 : i - 1;
                gdot5 = new GDot(gdot3.m_x, gdot3.m_y);
                break; /* Loop/switch isn't completed */
            }
            if(d2 <= d1)
                continue; /* Loop/switch isn't completed */
            i1 = flag3 ? i + 1 : i - 1;
            d2 = d1 - (d2 - d4);
            gdot5 = new GDot((float)((double)(gdot3.m_x - gdot1.m_x) * (d2 / d4) + (double)gdot1.m_x), (float)((double)(gdot3.m_y - gdot1.m_y) * (d2 / d4) + (double)gdot1.m_y));
            break; /* Loop/switch isn't completed */
            i = flag3 ? i + 1 : i - 1;
        }
        //================================================================
        i1 = i1 != -1 ? i1 : flag3 ? gsline.m_Data.size() - 1 : 0;
        GDots gdots = new GDots();
        if(l < i1)
        {
            System.out.println("iIndex1 " + l + " iIndex2 " + i1);
            gdots.addDot(gdot4);
            for(int j = l; j < i1; j++)
                gdots.addDot(gsline.m_Data.dotAt(j));        gdots.addDot(gdot5);
        } 
        else
        {
            System.out.println("iIndex1 " + l + " iIndex2 " + i1);
            gdots.addDot(gdot4);
            for(int k = i1; k < l; k++)
                gdots.addDot(gsline.m_Data.dotAt(k));        gdots.addDot(gdot5);
        }
        m_pLine = gsline;
        m_dLength1 = d;
        m_dLength2 = d1;
        add(gdots);
        adjustRect();
        m_lID = gsline.m_lID;
        m_sName = gsline.m_sName;
        boolean flag1 = true;
        return flag1;
    }