I want to decompile one apk file to see some part of its source code, but when I get to the part I am intrested in, JD-GUI gives following decompiled code
/* Error */
public void loginV2(Context paramContext, String paramString1, int paramInt, String paramString2, String paramString3, String paramString4, AsyncHttpResponseHandler paramAsyncHttpResponseHandler)
{
// Byte code:
// 0: new 20 java/lang/StringBuilder
// 3: dup
// 4: getstatic 91 com/ipanel/join/homed/mobile/myt/Config:SERVER_ACCESS Ljava/lang/String;
// 7: invokestatic 32 java/lang/String:valueOf (Ljava/lang/Object;)Ljava/lang/String;
// 10: invokespecial 35 java/lang/StringBuilder:<init> (Ljava/lang/String;)V
// 13: ldc_w 491
// 16: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 19: invokevirtual 45 java/lang/StringBuilder:toString ()Ljava/lang/String;
// 22: astore 10
// 24: new 226 cn/ipanel/android/net/http/AsyncHttpClient
// 27: dup
// 28: invokespecial 227 cn/ipanel/android/net/http/AsyncHttpClient:<init> ()V
// 31: astore 11
// 33: new 429 org/json/JSONObject
// 36: dup
// 37: invokespecial 430 org/json/JSONObject:<init> ()V
// 40: astore 12
// 42: aconst_null
// 43: astore 9
// 45: aconst_null
// 46: astore 8
// 48: new 20 java/lang/StringBuilder
// 51: dup
// 52: invokespecial 169 java/lang/StringBuilder:<init> ()V
// 55: aload_1
// 56: invokestatic 300 com/ipanel/join/homed/mobile/myt/utils/DeviceUtils:getDeviceId (Landroid/content/Context;)Ljava/lang/String;
// 59: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 62: invokevirtual 45 java/lang/StringBuilder:toString ()Ljava/lang/String;
// 65: astore 13
// 67: new 20 java/lang/StringBuilder
// 70: dup
// 71: aload 13
// 73: invokestatic 32 java/lang/String:valueOf (Ljava/lang/Object;)Ljava/lang/String;
// 76: invokespecial 35 java/lang/StringBuilder:<init> (Ljava/lang/String;)V
// 79: aload 13
// 81: invokestatic 497 com/ipanel/join/homed/helper/OperationUtils:getMD5 (Ljava/lang/String;)Ljava/lang/String;
// 84: bipush 7
// 86: bipush 8
// 88: invokevirtual 501 java/lang/String:substring (II)Ljava/lang/String;
// 91: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 94: invokevirtual 45 java/lang/StringBuilder:toString ()Ljava/lang/String;
// 97: astore 13
// 99: invokestatic 506 java/util/Calendar:getInstance ()Ljava/util/Calendar;
// 102: invokevirtual 510 java/util/Calendar:getTimeInMillis ()J
// 105: lstore 14
// 107: aload 12
// 109: ldc_w 294
// 112: aload 13
// 114: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 117: pop
// 118: aload 12
// 120: ldc_w 302
// 123: aload_2
// 124: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 127: pop
// 128: aload 12
// 130: ldc_w 469
// 133: iload_3
// 134: invokevirtual 513 org/json/JSONObject:put (Ljava/lang/String;I)Lorg/json/JSONObject;
// 137: pop
// 138: aload 12
// 140: ldc_w 467
// 143: aload 4
// 145: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 148: pop
// 149: aload 12
// 151: ldc_w 515
// 154: aload 5
// 156: invokestatic 497 com/ipanel/join/homed/helper/OperationUtils:getMD5 (Ljava/lang/String;)Ljava/lang/String;
// 159: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 162: pop
// 163: aload 6
// 165: invokestatic 112 android/text/TextUtils:isEmpty (Ljava/lang/CharSequence;)Z
// 168: ifne +13 -> 181
// 171: aload 12
// 173: ldc 99
// 175: aload 6
// 177: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 180: pop
// 181: aload 12
// 183: ldc_w 517
// 186: new 20 java/lang/StringBuilder
// 189: dup
// 190: invokespecial 169 java/lang/StringBuilder:<init> ()V
// 193: lload 14
// 195: invokevirtual 520 java/lang/StringBuilder:append (J)Ljava/lang/StringBuilder;
// 198: invokevirtual 45 java/lang/StringBuilder:toString ()Ljava/lang/String;
// 201: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 204: pop
// 205: aload 12
// 207: ldc_w 522
// 210: ldc 124
// 212: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 215: pop
// 216: aload 12
// 218: ldc_w 524
// 221: new 20 java/lang/StringBuilder
// 224: dup
// 225: aload 13
// 227: invokestatic 32 java/lang/String:valueOf (Ljava/lang/Object;)Ljava/lang/String;
// 230: invokespecial 35 java/lang/StringBuilder:<init> (Ljava/lang/String;)V
// 233: ldc_w 526
// 236: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 239: aload_2
// 240: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 243: ldc_w 526
// 246: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 249: iload_3
// 250: invokevirtual 176 java/lang/StringBuilder:append (I)Ljava/lang/StringBuilder;
// 253: ldc_w 526
// 256: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 259: aload 4
// 261: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 264: ldc_w 526
// 267: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 270: lload 14
// 272: invokevirtual 520 java/lang/StringBuilder:append (J)Ljava/lang/StringBuilder;
// 275: invokevirtual 45 java/lang/StringBuilder:toString ()Ljava/lang/String;
// 278: invokestatic 497 com/ipanel/join/homed/helper/OperationUtils:getMD5 (Ljava/lang/String;)Ljava/lang/String;
// 281: invokevirtual 435 org/json/JSONObject:put (Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 284: pop
// 285: new 223 org/apache/http/entity/StringEntity
// 288: dup
// 289: aload 12
// 291: invokevirtual 438 org/json/JSONObject:toString ()Ljava/lang/String;
// 294: ldc_w 440
// 297: invokespecial 442 org/apache/http/entity/StringEntity:<init> (Ljava/lang/String;Ljava/lang/String;)V
// 300: astore_2
// 301: getstatic 448 java/lang/System:out Ljava/io/PrintStream;
// 304: new 20 java/lang/StringBuilder
// 307: dup
// 308: ldc_w 450
// 311: invokespecial 35 java/lang/StringBuilder:<init> (Ljava/lang/String;)V
// 314: aload 12
// 316: invokevirtual 438 org/json/JSONObject:toString ()Ljava/lang/String;
// 319: invokevirtual 41 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder;
// 322: invokevirtual 45 java/lang/StringBuilder:toString ()Ljava/lang/String;
// 325: invokevirtual 455 java/io/PrintStream:println (Ljava/lang/String;)V
// 328: aload 11
// 330: aload_1
// 331: aload 10
// 333: aload_2
// 334: ldc -27
// 336: aload 7
// 338: invokevirtual 233 cn/ipanel/android/net/http/AsyncHttpClient:post (Landroid/content/Context;Ljava/lang/String;Lorg/apache/http/HttpEntity;Ljava/lang/String;Lcn/ipanel/android/net/http/AsyncHttpResponseHandler;)V
// 341: return
// 342: astore 4
// 344: aload 8
// 346: astore_2
// 347: aload 4
// 349: invokevirtual 456 org/json/JSONException:printStackTrace ()V
// 352: goto -24 -> 328
// 355: astore 4
// 357: aload 9
// 359: astore_2
// 360: aload 4
// 362: invokevirtual 236 java/io/UnsupportedEncodingException:printStackTrace ()V
// 365: goto -37 -> 328
// 368: astore 4
// 370: goto -10 -> 360
// 373: astore 4
// 375: goto -28 -> 347
// Local variable table:
// start length slot name signature
// 0 378 0 this APIManager
// 0 378 1 paramContext Context
// 0 378 2 paramString1 String
// 0 378 3 paramInt int
// 0 378 4 paramString2 String
// 0 378 5 paramString3 String
// 0 378 6 paramString4 String
// 0 378 7 paramAsyncHttpResponseHandler AsyncHttpResponseHandler
// 46 299 8 localObject1 Object
// 43 315 9 localObject2 Object
// 22 310 10 str1 String
// 31 298 11 localAsyncHttpClient AsyncHttpClient
// 40 275 12 localJSONObject JSONObject
// 65 161 13 str2 String
// 105 166 14 l long
// Exception table:
// from to target type
// 48 181 342 org/json/JSONException
// 181 301 342 org/json/JSONException
// 48 181 355 java/io/UnsupportedEncodingException
// 181 301 355 java/io/UnsupportedEncodingException
// 301 328 368 java/io/UnsupportedEncodingException
// 301 328 373 org/json/JSONException
}
I searched web and found that maybe the reason is the apk'a author deliberately made this error to protect the critical part of the code to be decompiled by JD-GUI.
What I want to ask is
Could these so called "Byte code" be understood ? I read the code , authough I am not able to understand the code completely,I think it still keep the actual code info, I found getMD5 function in the code, so could someone explain to me which parameters the code uses and how to do MD5(actually this is the part I am interested in)
Could someone give me some suggestions to help me to understand such codes by myself, for example , give me some reference web links to understand the so called "Byte Code" language's specification(just like c++ or C#), so next time maybe I can do the job myself
Thanks!
ps: I tried another hex viewer , and get following result code
public void loginV2(final Context p0, final String p1, final int p2, final String p3, final String p4, final String p5, final AsyncHttpResponseHandler p6) {
//
// This method could not be decompiled.
//
// Original Bytecode:
//
// 0: new Ljava/lang/StringBuilder;
// 3: dup
// 4: getstatic com/ipanel/join/homed/mobile/myt/Config.SERVER_ACCESS:Ljava/lang/String;
// 7: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
// 10: invokespecial java/lang/StringBuilder.<init>:(Ljava/lang/String;)V
// 13: ldc_w "account/user/v2/login"
// 16: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 19: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
// 22: astore 8
// 24: new Lcn/ipanel/android/net/http/AsyncHttpClient;
// 27: dup
// 28: invokespecial cn/ipanel/android/net/http/AsyncHttpClient.<init>:()V
// 31: astore 9
// 33: new Lorg/json/JSONObject;
// 36: dup
// 37: invokespecial org/json/JSONObject.<init>:()V
// 40: astore 10
// 42: aconst_null
// 43: astore 11
// 45: new Ljava/lang/StringBuilder;
// 48: dup
// 49: invokespecial java/lang/StringBuilder.<init>:()V
// 52: aload_1
// 53: invokestatic com/ipanel/join/homed/mobile/myt/utils/DeviceUtils.getDeviceId:(Landroid/content/Context;)Ljava/lang/String;
// 56: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 59: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
// 62: astore 14
// 64: new Ljava/lang/StringBuilder;
// 67: dup
// 68: aload 14
// 70: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
// 73: invokespecial java/lang/StringBuilder.<init>:(Ljava/lang/String;)V
// 76: aload 14
// 78: invokestatic com/ipanel/join/homed/helper/OperationUtils.getMD5:(Ljava/lang/String;)Ljava/lang/String;
// 81: bipush 7
// 83: bipush 8
// 85: invokevirtual java/lang/String.substring:(II)Ljava/lang/String;
// 88: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 91: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
// 94: astore 15
// 96: invokestatic java/util/Calendar.getInstance:()Ljava/util/Calendar;
// 99: invokevirtual java/util/Calendar.getTimeInMillis:()J
// 102: lstore 16
// 104: aload 10
// 106: ldc_w "deviceno"
// 109: aload 15
// 111: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 114: pop
// 115: aload 10
// 117: ldc_w "devicetype"
// 120: aload_2
// 121: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 124: pop
// 125: aload 10
// 127: ldc_w "accounttype"
// 130: iload_3
// 131: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;I)Lorg/json/JSONObject;
// 134: pop
// 135: aload 10
// 137: ldc_w "account"
// 140: aload 4
// 142: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 145: pop
// 146: aload 10
// 148: ldc_w "pwd"
// 151: aload 5
// 153: invokestatic com/ipanel/join/homed/helper/OperationUtils.getMD5:(Ljava/lang/String;)Ljava/lang/String;
// 156: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 159: pop
// 160: aload 6
// 162: invokestatic android/text/TextUtils.isEmpty:(Ljava/lang/CharSequence;)Z
// 165: ifne 178
// 168: aload 10
// 170: ldc "code"
// 172: aload 6
// 174: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 177: pop
// 178: aload 10
// 180: ldc_w "timestamp"
// 183: new Ljava/lang/StringBuilder;
// 186: dup
// 187: invokespecial java/lang/StringBuilder.<init>:()V
// 190: lload 16
// 192: invokevirtual java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
// 195: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
// 198: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 201: pop
// 202: aload 10
// 204: ldc_w "isforce"
// 207: ldc "1"
// 209: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 212: pop
// 213: aload 10
// 215: ldc_w "signature"
// 218: new Ljava/lang/StringBuilder;
// 221: dup
// 222: aload 15
// 224: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
// 227: invokespecial java/lang/StringBuilder.<init>:(Ljava/lang/String;)V
// 230: ldc_w "|"
// 233: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 236: aload_2
// 237: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 240: ldc_w "|"
// 243: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 246: iload_3
// 247: invokevirtual java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
// 250: ldc_w "|"
// 253: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 256: aload 4
// 258: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 261: ldc_w "|"
// 264: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 267: lload 16
// 269: invokevirtual java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
// 272: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
// 275: invokestatic com/ipanel/join/homed/helper/OperationUtils.getMD5:(Ljava/lang/String;)Ljava/lang/String;
// 278: invokevirtual org/json/JSONObject.put:(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
// 281: pop
// 282: new Lorg/apache/http/entity/StringEntity;
// 285: dup
// 286: aload 10
// 288: invokevirtual org/json/JSONObject.toString:()Ljava/lang/String;
// 291: ldc_w "UTF-8"
// 294: invokespecial org/apache/http/entity/StringEntity.<init>:(Ljava/lang/String;Ljava/lang/String;)V
// 297: astore 26
// 299: getstatic java/lang/System.out:Ljava/io/PrintStream;
// 302: new Ljava/lang/StringBuilder;
// 305: dup
// 306: ldc_w "para: "
// 309: invokespecial java/lang/StringBuilder.<init>:(Ljava/lang/String;)V
// 312: aload 10
// 314: invokevirtual org/json/JSONObject.toString:()Ljava/lang/String;
// 317: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
// 320: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
// 323: invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V
// 326: aload 26
// 328: astore 11
// 330: aload 9
// 332: aload_1
// 333: aload 8
// 335: aload 11
// 337: ldc "text/html"
// 339: aload 7
// 341: invokevirtual cn/ipanel/android/net/http/AsyncHttpClient.post:(Landroid/content/Context;Ljava/lang/String;Lorg/apache/http/HttpEntity;Ljava/lang/String;Lcn/ipanel/android/net/http/AsyncHttpResponseHandler;)V
// 344: return
// 345: astore 13
// 347: aload 13
// 349: invokevirtual org/json/JSONException.printStackTrace:()V
// 352: goto 330
// 355: astore 12
// 357: aload 12
// 359: invokevirtual java/io/UnsupportedEncodingException.printStackTrace:()V
// 362: goto 330
// 365: astore 12
// 367: aload 26
// 369: astore 11
// 371: goto 357
// 374: astore 13
// 376: aload 26
// 378: astore 11
// 380: goto 347
// Exceptions:
// Try Handler
// Start End Start End Type
// ----- ----- ----- ----- --------------------------------------
// 45 178 345 347 Lorg/json/JSONException;
// 45 178 355 357 Ljava/io/UnsupportedEncodingException;
// 178 299 345 347 Lorg/json/JSONException;
// 178 299 355 357 Ljava/io/UnsupportedEncodingException;
// 299 326 374 383 Lorg/json/JSONException;
// 299 326 365 374 Ljava/io/UnsupportedEncodingException;
//
// The error that occurred was:
//
// java.lang.IllegalStateException: Expression is linked from several locations: Label_0330:
// at com.strobel.decompiler.ast.Error.expressionLinkedFromMultipleLocations(Error.java:27)
// at com.strobel.decompiler.ast.AstOptimizer.mergeDisparateObjectInitializations(AstOptimizer.java:2592)
// at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:235)
// at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
// at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:214)
// at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:99)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:757)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:655)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:532)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:499)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:141)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:130)
// at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:105)
// at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
// at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
// at the.bytecode.club.bytecodeviewer.decompilers.ProcyonDecompiler.decompileClassNode(ProcyonDecompiler.java:120)
// at the.bytecode.club.bytecodeviewer.gui.ClassViewer$13.doShit(ClassViewer.java:624)
// at the.bytecode.club.bytecodeviewer.gui.PaneUpdaterThread.run(PaneUpdaterThread.java:16)
//
throw new IllegalStateException("An error occurred while decompiling this method.");
}
Ran into a similar issue trying to decompile a Java 8 file that used try-with-resources and lambdas.
After trying the following unsuccessfully:
This guy did the trick: