反编译返回的唯一注释方法是什么?

时间:2014-07-07 20:02:13

标签: java android bytecode

我正在寻找银行Android应用程序的源代码,我看到其中大多数都有一些方法什么也没做,而在其中只有一些奇怪的注释代码。

看看这个例子:

/* Error */
  public final void b()
  {
    // Byte code:
    //   0: aload_0
    //   1: getfield 68 example/com/PackagePMB:y    Lc/y;
    //   4: ifnonnull +15 -> 19
    //   7: aload_0
    //   8: new 640 c/y
    //   11: dup
    //   12: aload_0
    //   13: invokespecial 643  c/y:<init>  (Lc/w;)V
    //   16: putfield 68    example/com/PackagePMB:y    Lc/y;
    //   19: getstatic 645  c/g:m   B
    //   22: ifeq +18 -> 40
    //   25: aload_0
    //   26: getfield 174   example/com/PackagePMB:p    Ljava/util/Stack;
    //   29: invokevirtual 648  java/util/Stack:size    ()I
    //   32: ifle +8 -> 40
    //   35: aload_0
    //   36: invokevirtual 457  example/com/PackagePMB:j    ()V
    //   39: return
    //   40: aload_0
    //   41: getfield 174   example/com/PackagePMB:p    Ljava/util/Stack;
    //   44: invokevirtual 651  java/util/Stack:removeAllElements   ()V
    //   47: aload_0
    //   48: getfield 176   example/com/PackagePMB:u    Lc/ag;
    //   51: aload_0
    //   52: getfield 558   example/com/PackagePMB:f    Lc/c;
    //   55: invokevirtual 190  c/ag:a  (Landroid/view/View;)V
    //   58: aload_0
    //   59: getfield 176   example/com/PackagePMB:u    Lc/ag;
    //   62: invokevirtual 192  c/ag:b  ()V
    //   65: new 653    c/p
    //   68: dup
    //   69: getstatic 61   example/com/PackagePMB:a    Lexample/com/PackagePMB;
    //   72: invokespecial 654  c/p:<init>  (Landroid/content/Context;)V
    //   75: astore_1
    //   76: aload_1
    //   77: invokevirtual 655  c/p:a   ()V
    //   80: aload_1
    //   81: invokevirtual 656  c/p:b   ()V
    //   84: aload_1
    //   85: invokevirtual 660  c/p:getReadableDatabase ()Landroid/database/sqlite/SQLiteDatabase;
    //   88: astore 10
    //   90: aload 10
    //   92: ldc_w 662
    //   95: iconst_0
    //   96: anewarray 128  java/lang/String
    //   99: invokevirtual 668  android/database/sqlite/SQLiteDatabase:rawQuery (Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;
    //   102: astore 11
    //   104: aload 11
    //   106: invokeinterface 673 1 0
    //   111: ifle +55 -> 166
    //   114: aload_0
    //   115: new 282   java/lang/StringBuilder
    //   118: dup
    //   119: ldc_w 675
    //   122: invokespecial 285 java/lang/StringBuilder:<init>  (Ljava/lang/String;)V
    //   125: aload 11
    //   127: invokeinterface 673 1 0
    //   132: invokevirtual 289 java/lang/StringBuilder:append  (I)Ljava/lang/StringBuilder;
    //   135: ldc_w 677
    //   138: invokevirtual 294 java/lang/StringBuilder:append  (Ljava/lang/String;)Ljava/lang/StringBuilder;
    //   141: invokevirtual 297 java/lang/StringBuilder:toString    ()Ljava/lang/String;
    //   144: iconst_1
    //   145: invokestatic 683  android/widget/Toast:makeText   (Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
    //   148: invokevirtual 686 android/widget/Toast:show   ()V
    //   151: iconst_0
    //   152: istore 12
    //   154: iload 12
    //   156: aload 11
    //   158: invokeinterface 673 1 0
    //   163: if_icmplt +75 -> 238
    //   166: aload 10
    //   168: invokevirtual 689 android/database/sqlite/SQLiteDatabase:close    ()V
    //   171: aload_1
    //   172: invokevirtual 690 c/p:close   ()V
    //   175: new 653   c/p
    //   178: dup
    //   179: getstatic 61  example/com/PackagePMB:a    Lexample/com/PackagePMB;
    //   182: invokespecial 654 c/p:<init>  (Landroid/content/Context;)V
    //   185: astore 5
    //   187: aload 5
    //   189: invokevirtual 656 c/p:b   ()V
    //   192: aload 5
    //   194: invokevirtual 693 c/p:getWritableDatabase ()Landroid/database/sqlite/SQLiteDatabase;
    //   197: astore 6
    //   199: aload 6
    //   201: ldc_w 695
    //   204: ldc_w 697
    //   207: iconst_0
    //   208: anewarray 128 java/lang/String
    //   211: invokevirtual 701 android/database/sqlite/SQLiteDatabase:delete   (Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I
    //   214: pop
    //   215: aload 6
    //   217: invokevirtual 689 android/database/sqlite/SQLiteDatabase:close    ()V
    //   220: aload 5
    //   222: invokevirtual 690 c/p:close   ()V
    //   225: return
    //   226: astore_2
    //   227: new 703   java/lang/Error
    //   230: dup
    //   231: ldc_w 705
    //   234: invokespecial 706 java/lang/Error:<init>  (Ljava/lang/String;)V
    //   237: athrow
    //   238: aload 11
    //   240: iload 12
    //   242: invokeinterface 709 2 0
    //   247: pop
    //   248: aload_0
    //   249: aload 11
    //   251: aload 11
    //   253: ldc_w 711
    //   256: invokeinterface 714 2 0
    //   261: invokeinterface 717 2 0
    //   266: aload 11
    //   268: aload 11
    //   270: ldc_w 719
    //   273: invokeinterface 714 2 0
    //   278: invokeinterface 717 2 0
    //   283: iconst_0
    //   284: invokestatic 616  java/lang/Boolean:valueOf   (Z)Ljava/lang/Boolean;
    //   287: invokespecial 618 example/com/PackagePMB:a    (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)V
    //   290: iinc 12 1
    //   293: goto -139 -> 154
    //   296: astore 4
    //   298: aload_1
    //   299: invokevirtual 690 c/p:close   ()V
    //   302: goto -127 -> 175
    //   305: astore_3
    //   306: aload_1
    //   307: invokevirtual 690 c/p:close   ()V
    //   310: aload_3
    //   311: athrow
    //   312: astore 8
    //   314: aload 6
    //   316: invokevirtual 689 android/database/sqlite/SQLiteDatabase:close    ()V
    //   319: aload 5
    //   321: invokevirtual 690 c/p:close   ()V
    //   324: return
    //   325: astore 7
    //   327: aload 6
    //   329: invokevirtual 689 android/database/sqlite/SQLiteDatabase:close    ()V
    //   332: aload 5
    //   334: invokevirtual 690 c/p:close   ()V
    //   337: aload 7
    //   339: athrow
    // Local variable table:
    //   start  length  slot    name    signature
    //   0  340 0   this    ParsianPMB
    //   75 232 1   localp1 c.p
    //   226    1   2   localIOException    IOException
    //   305    6   3   localObject1    Object
    //   296    1   4   localSQLException1  android.database.SQLException
    //   185    148 5   localp2 c.p
    //   197    131 6   localSQLiteDatabase1    android.database.sqlite.SQLiteDatabase
    //   325    13  7   localObject2    Object
    //   312    1   8   localSQLException2  android.database.SQLException
    //   88 79  10  localSQLiteDatabase2    android.database.sqlite.SQLiteDatabase
    //   102    167 11  localCursor android.database.Cursor
    //   152    139 12  i1  int
    // Exception table:
    //   from   to  target  type
    //   76 80  226 java/io/IOException
    //   80 151 296 android/database/SQLException
    //   154    166 296 android/database/SQLException
    //   166    171 296 android/database/SQLException
    //   238    290 296 android/database/SQLException
    //   80 151 305 finally
    //   154    166 305 finally
    //   166    171 305 finally
    //   238    290 305 finally
    //   199    215 312 android/database/SQLException
    //   199    215 325 finally
  }

这些是什么?为什么这些评论没有被编译器跳过? 因为我从apk文件中提取了这个,而classes.dex是一个编译过的文件,所以里面不应该有任何注释,因为编译器会跳过它们。但在这种情况下它并没有,它们作为主要代码存在!

有没有人对这些方法有任何想法?

这种方法没有得到任何东西,没有任何回报,也没有做任何事情!

如果这是一个无法反编译此方法的反编译器的错误,那么我如何对自己的方法做同样的事情,以便反编译器不能对它们进行反编译?

1 个答案:

答案 0 :(得分:3)

  

这些是什么?

转储原始字节码。

  

为什么编译器不会跳过这些注释?

最有可能的原因是反编译器无法将字节码解码为Java。

  

因为我从apk文件中提取了这个,而classes.dex是一个已编译的文件,因此其中不应该有任何注释,因为编译器会跳过它们。但在这种情况下它并没有,它们作为主要代码存在!

这些不是原始来源的评论。正如你所说,这些注释不在字节码中。

  

有没有人对这些方法有任何想法?

是的,开发代码的人。名为b()的方法更容易被混淆,使其更难破解。

  

这种方法没有得到任何东西,没有任何回报,也没有做任何事情!

我确信字节代码可以做些什么。

  

如果这是一个无法反编译此方法的反编译器的错误,那么我怎样才能对我自己的方法做同样的事情,以便反编译器不能对它们进行反编译?

使用混淆器。