java class反编译后的代码还原(一)

java class 利用jad 反编译之后,偶尔回碰到一些不正常的代码,例如:label0 :_L1 MISSING_BLOCK_LABEL_30、JVM INSTR ret 7 、JVM INSTR tableswitch 1 3: default 269、 JVM INSTR monitorexit、JVM INSTR monitorenter,这些一般是由特殊的for循环、try catch finally语句块、synchronized语句反编译后产生的。下面,就简单介绍一下,一些反编译后的特殊代码的还原规则。本文在Jdk 1.4.2_08+jad 1.58f下测试。jad 1.5.8f可以到这里http://download.csdn.net/source/470540 下载。

   第一部分、for、while循环

1、普通的循环,原始

view plaincopy to clipboardprint?
public void f1() {  
        boolean flag = false;  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            for (int i = 0; i < 10; i++) {  
                flag = Boolean.getBoolean("sys");  
                if (flag) {  
                    System.exit(0);  
                }  
            }  
        }  
    }  
   
  

public void f1() {
   boolean flag = false;
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    for (int i = 0; i < 10; i++) {
     flag = Boolean.getBoolean("sys");
     if (flag) {
      System.exit(0);
     }
    }
   }
  }
 
 反编译后的代码 view plaincopy to clipboardprint?
public void f1()  
     {  
         boolean flag = false;  
         if(Boolean.getBoolean("sys"))  
         {  
             System.out.println("sys");  
         } else 
         {  
             for(int i = 0; i < 10; i++)  
             {  
                 flag = Boolean.getBoolean("sys");  
                 if(flag)  
                     System.exit(0);  
             }  
   
         }  
     }  
   
     

public void f1()
     {
         boolean flag = false;
         if(Boolean.getBoolean("sys"))
         {
             System.out.println("sys");
         } else
         {
             for(int i = 0; i < 10; i++)
             {
                 flag = Boolean.getBoolean("sys");
                 if(flag)
                     System.exit(0);
             }
 
         }
     }
 
  2、反编译后代码变的很古怪,这是java原代码 view plaincopy to clipboardprint?
public void f2() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            check: while (true) {  
                for (int i = 0; i < list.length; i++) {  
                    if (list[i] == 2) {  
                        continue check;  
                    } else {  
                        break;  
                    }  
                }  
            }  
        }  
    }  
   
      

public void f2() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    check: while (true) {
     for (int i = 0; i < list.length; i++) {
      if (list[i] == 2) {
       continue check;
      } else {
       break;
      }
     }
    }
   }
  }
 
     Java反编译后的代码,部分逻辑丢失。 view plaincopy to clipboardprint?
public void f2()  
     {  
         int list[] = {  
             1, 2, 3, 4 
         };  
         if(Boolean.getBoolean("sys"))  
             System.out.println("sys");  
         else 
             do 
             {  
                 int i = 0;  
                 if(i >= list.length || list[i] != 2);  
             } while(true);  
     }  
   
     

public void f2()
     {
         int list[] = {
             1, 2, 3, 4
         };
         if(Boolean.getBoolean("sys"))
             System.out.println("sys");
         else
             do
             {
                 int i = 0;
                 if(i >= list.length || list[i] != 2);
             } while(true);
     }
 
  3、就是比f2()多了一行System.out.println("list[i]");,反编译后也挺怪的。源码如下: view plaincopy to clipboardprint?
public void f3() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            check: while (true) {  
                for (int i = 0; i < list.length; i++) {  
                    System.out.println("list[i]");  
                    if (list[i] == 2) {  
                        continue check;  
                    } else {  
                        break;  
                    }  
                }  
            }  
        }  
    }  
      

public void f3() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    check: while (true) {
     for (int i = 0; i < list.length; i++) {
      System.out.println("list[i]");
      if (list[i] == 2) {
       continue check;
      } else {
       break;
      }
     }
    }
   }
  }
     反编译后的代码: view plaincopy to clipboardprint?
public void f3()  
     {  
         int list[] = {  
             1, 2, 3, 4 
         };  
         if(Boolean.getBoolean("sys"))  
             System.out.println("sys");  
         else 
             do 
             {  
                 int i;  
                 do 
                     i = 0;  
                 while(i >= list.length);  
                 System.out.println("list[i]");  
                 if(list[i] != 2);  
             } while(true);  
     }  
   
     

public void f3()
     {
         int list[] = {
             1, 2, 3, 4
         };
         if(Boolean.getBoolean("sys"))
             System.out.println("sys");
         else
             do
             {
                 int i;
                 do
                     i = 0;
                 while(i >= list.length);
                 System.out.println("list[i]");
                 if(list[i] != 2);
             } while(true);
     }
 
  4、f2()中的break语言,移动了位置。源码如下: view plaincopy to clipboardprint?
public void f4() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            check: while (true) {  
                for (int i = 0; i < list.length; i++) {  
                    if (list[i] == 2) {  
                        continue check;  
                    }  
                }  
                break;  
            }  
        }  
    }  
   
      

public void f4() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    check: while (true) {
     for (int i = 0; i < list.length; i++) {
      if (list[i] == 2) {
       continue check;
      }
     }
     break;
    }
   }
  }
 
     反编译后代码: view plaincopy to clipboardprint?
public void f4()  
     {  
         int list[] = {  
             1, 2, 3, 4 
         };  
         int i;  
         if(Boolean.getBoolean("sys"))  
             System.out.println("sys");  
         else 
 label0:  
             do 
             {  
                 for(i = 0; i < list.length; i++)  
                     if(list[i] == 2)  
                         continue label0;  
   
                 break;  
             } while(true);  
     }  
   
     

public void f4()
     {
         int list[] = {
             1, 2, 3, 4
         };
         int i;
         if(Boolean.getBoolean("sys"))
             System.out.println("sys");
         else
 label0:
             do
             {
                 for(i = 0; i < list.length; i++)
                     if(list[i] == 2)
                         continue label0;
 
                 break;
             } while(true);
     }
 
  5、就是比f4()多了一行System.out.println("list[i]");,反编译后相当怪的。源码如下: view plaincopy to clipboardprint?
public void f5() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            check: while (true) {  
                for (int i = 0; i < list.length; i++) {  
                    System.out.println("list[i]");  
                    if (list[i] == 2) {  
                        continue check;  
                    }  
                }  
                break;  
            }  
        }  
    }  
      

public void f5() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    check: while (true) {
     for (int i = 0; i < list.length; i++) {
      System.out.println("list[i]");
      if (list[i] == 2) {
       continue check;
      }
     }
     break;
    }
   }
  }
     反编译后比较晕的代码: view plaincopy to clipboardprint?
public void f5()  
     {  
         int list[] = {  
             1, 2, 3, 4 
         };  
         if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1  
 _L1:  
         System.out.println("sys");  
           goto _L3  
 _L2:  
         int i = 0;  
           goto _L4  
 _L6:  
         System.out.println("list[i]");  
         if(list[i] != 2) goto _L5; else goto _L2  
 _L5:  
         i++;  
 _L4:  
         if(i < list.length) goto _L6; else goto _L3  
 _L3:  
     }  
     

public void f5()
     {
         int list[] = {
             1, 2, 3, 4
         };
         if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1
 _L1:
         System.out.println("sys");
           goto _L3
 _L2:
         int i = 0;
           goto _L4
 _L6:
         System.out.println("list[i]");
         if(list[i] != 2) goto _L5; else goto _L2
 _L5:
         i++;
 _L4:
         if(i < list.length) goto _L6; else goto _L3
 _L3:
     }
  6、就是比f5()多了一行System.exit(0);代码,但是差异确很大。源码如下: view plaincopy to clipboardprint?
public void f6() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            check: while (true) {  
                for (int i = 0; i < list.length; i++) {  
                    System.out.println("list[i]");  
                    if (list[i] == 2) {  
                        continue check;  
                    }  
                }  
                System.exit(0);  
                break;  
            }  
        }  
    }  
      

public void f6() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    check: while (true) {
     for (int i = 0; i < list.length; i++) {
      System.out.println("list[i]");
      if (list[i] == 2) {
       continue check;
      }
     }
     System.exit(0);
     break;
    }
   }
  }
     编译后代码,比f5()差异太大了。 view plaincopy to clipboardprint?
public void f6()  
     {  
         int list[];  
         list = (new int[] {  
             1, 2, 3, 4 
         });  
         if(Boolean.getBoolean("sys"))  
         {  
             System.out.println("sys");  
             break MISSING_BLOCK_LABEL_75;  
         }  
 _L2:  
         int i = 0;  
           goto _L1  
 _L5:  
         System.out.println("list[i]");  
         if(list[i] != 2) goto _L3; else goto _L2  
 _L3:  
         i++;  
 _L1:  
         if(i < list.length) goto _L5; else goto _L4  
 _L4:  
         System.exit(0);  
     }  
     

public void f6()
     {
         int list[];
         list = (new int[] {
             1, 2, 3, 4
         });
         if(Boolean.getBoolean("sys"))
         {
             System.out.println("sys");
             break MISSING_BLOCK_LABEL_75;
         }
 _L2:
         int i = 0;
           goto _L1
 _L5:
         System.out.println("list[i]");
         if(list[i] != 2) goto _L3; else goto _L2
 _L3:
         i++;
 _L1:
         if(i < list.length) goto _L5; else goto _L4
 _L4:
         System.exit(0);
     }
  7、差异就是f6()中的System.exit(0);移动了位置,但是差异确很大。源码如下: view plaincopy to clipboardprint?
public void f7() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            check: while (true) {  
                for (int i = 0; i < list.length; i++) {  
                    System.out.println("list[i]");  
                    if (list[i] == 2) {  
                        continue check;  
                    }  
                }  
                break;  
            }  
            System.exit(0);  
        }  
    }  
      

public void f7() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    check: while (true) {
     for (int i = 0; i < list.length; i++) {
      System.out.println("list[i]");
      if (list[i] == 2) {
       continue check;
      }
     }
     break;
    }
    System.exit(0);
   }
  }
     编译后代码,比f6()差异太大了。 view plaincopy to clipboardprint?
public void f7()  
     {  
         int list[];  
         list = (new int[] {  
             1, 2, 3, 4 
         });  
         if(Boolean.getBoolean("sys"))  
         {  
             System.out.println("sys");  
             break MISSING_BLOCK_LABEL_75;  
         }  
 _L2:  
         int i = 0;  
           goto _L1  
 _L5:  
         System.out.println("list[i]");  
         if(list[i] != 2) goto _L3; else goto _L2  
 _L3:  
         i++;  
 _L1:  
         if(i < list.length) goto _L5; else goto _L4  
 _L4:  
         System.exit(0);  
     }  
     

public void f7()
     {
         int list[];
         list = (new int[] {
             1, 2, 3, 4
         });
         if(Boolean.getBoolean("sys"))
         {
             System.out.println("sys");
             break MISSING_BLOCK_LABEL_75;
         }
 _L2:
         int i = 0;
           goto _L1
 _L5:
         System.out.println("list[i]");
         if(list[i] != 2) goto _L3; else goto _L2
 _L3:
         i++;
 _L1:
         if(i < list.length) goto _L5; else goto _L4
 _L4:
         System.exit(0);
     }
  8、逻辑和f7比没有变,只是多了一些System.out.println()代码。 view plaincopy to clipboardprint?
public void f8() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            System.out.println(":check while");  
            check: while (true) {  
                System.out.println("for");  
                for (int i = 0; i < list.length; i++) {  
                    System.out.println("list[i]");  
                    if (list[i] == 2) {  
                        continue check;  
                    }  
                }  
                System.out.println("break");  
                break;  
            }  
            System.out.println("exit(0)");  
            System.exit(0);  
        }  
    }  
     

public void f8() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    System.out.println(":check while");
    check: while (true) {
     System.out.println("for");
     for (int i = 0; i < list.length; i++) {
      System.out.println("list[i]");
      if (list[i] == 2) {
       continue check;
      }
     }
     System.out.println("break");
     break;
    }
    System.out.println("exit(0)");
    System.exit(0);
   }
  }
    反编译后的代码:和f7()比较一下,基本就可以确定反编译后的代码对应关系了。 view plaincopy to clipboardprint?
public void f8()  
     {  
         int list[];  
         list = (new int[] {  
             1, 2, 3, 4 
         });  
         if(Boolean.getBoolean("sys"))  
         {  
             System.out.println("sys");  
             break MISSING_BLOCK_LABEL_107;  
         }  
         System.out.println(":check while");  
 _L2:  
         int i;  
         System.out.println("for");  
         i = 0;  
           goto _L1  
 _L5:  
         System.out.println("list[i]");  
         if(list[i] != 2) goto _L3; else goto _L2  
 _L3:  
         i++;  
 _L1:  
         if(i < list.length) goto _L5; else goto _L4  
 _L4:  
         System.out.println("break");  
         System.out.println("exit(0)");  
         System.exit(0);  
     }  
     

public void f8()
     {
         int list[];
         list = (new int[] {
             1, 2, 3, 4
         });
         if(Boolean.getBoolean("sys"))
         {
             System.out.println("sys");
             break MISSING_BLOCK_LABEL_107;
         }
         System.out.println(":check while");
 _L2:
         int i;
         System.out.println("for");
         i = 0;
           goto _L1
 _L5:
         System.out.println("list[i]");
         if(list[i] != 2) goto _L3; else goto _L2
 _L3:
         i++;
 _L1:
         if(i < list.length) goto _L5; else goto _L4
 _L4:
         System.out.println("break");
         System.out.println("exit(0)");
         System.exit(0);
     }
  9、逻辑和f8比没有变,只是多了一行System.out.println()代码,导致了反编译后的/* Loop/switch isn&apos;t completed */。 view plaincopy to clipboardprint?
public void f9() {  
        int[] list = new int[] { 1, 2, 3, 4 };  
        if (Boolean.getBoolean("sys")) {  
            System.out.println("sys");  
        } else {  
            System.out.println(":check while");  
            check: while (true) {  
                System.out.println("for");  
                for (int i = 0; i < list.length; i++) {  
                    System.out.println("list[i]");  
                    if (list[i] == 2) {  
                        System.out.println("continue check");  
                        continue check;  
                    }  
                }  
                System.out.println("break");  
                break;  
            }  
            System.out.println("exit(0)");  
            System.exit(0);  
        }  
    }  
 }  
      

public void f9() {
   int[] list = new int[] { 1, 2, 3, 4 };
   if (Boolean.getBoolean("sys")) {
    System.out.println("sys");
   } else {
    System.out.println(":check while");
    check: while (true) {
     System.out.println("for");
     for (int i = 0; i < list.length; i++) {
      System.out.println("list[i]");
      if (list[i] == 2) {
       System.out.println("continue check");
       continue check;
      }
     }
     System.out.println("break");
     break;
    }
    System.out.println("exit(0)");
    System.exit(0);
   }
  }
 }
     反编译后的代码: view plaincopy to clipboardprint?
public void f9()  
     {  
         int list[] = {  
             1, 2, 3, 4 
         };  
         if(!Boolean.getBoolean("sys")) goto _L2; else goto _L1  
 _L1:  
         System.out.println("sys");  
           goto _L3  
 _L2:  
         System.out.println(":check while");  
 _L5:  
         System.out.println("for");  
         for(int i = 0; i < list.length; i++)  
         {  
             System.out.println("list[i]");  
             if(list[i] != 2)  
                 continue;  
             System.out.println("continue check");  
             continue; /* Loop/switch isn&apos;t completed */ 
         }  
   
         System.out.println("break");  
         System.out.println("exit(0)");  
         System.exit(0);  
 _L3:  
         return;  
         if(true) goto _L5; else goto _L4  
 _L4:  
     }  
 }  

 

你可能感兴趣的:(java,jvm,jdk)