skylot / jadx

Dex to Java decompiler
Apache License 2.0
40.05k stars 4.74k forks source link

Java decompilation failed #2033

Open ADR66-Git opened 8 months ago

ADR66-Git commented 8 months ago

Issue details

The new version of jadx is decompiled every time. Many methods fail to decompile. The decompiler is not yet as user-friendly as 1.2.0. The more you do, the more garbage you become

Relevant log output or stacktrace

public final void A0O(p000X.2Xj r13, p000X.2hx r14) {
        /*
            r12 = this;
            java.util.List r2 = r12.A0G(r14)
            java.util.HashSet r1 = p000X.0vE.A0y(r2)
            X.2uI r0 = r12.A0J
            java.util.Set r3 = r0.A07(r1)
            r0.A09(r3)     // Catch: java.lang.Throwable -> L14c
            java.util.Map r11 = r12.A0H(r1)     // Catch: java.lang.Throwable -> L14c
            X.1Kx r0 = r12.A0K     // Catch: java.lang.Throwable -> L14c
            X.3Sp r10 = r0.A0C()     // Catch: java.lang.Throwable -> L14c
            X.3So r9 = r10.A04()     // Catch: java.lang.Throwable -> L142
            java.util.Iterator r8 = r2.iterator()     // Catch: java.lang.Throwable -> L138
        L23:
            boolean r0 = r8.hasNext()     // Catch: java.lang.Throwable -> L138
            if (r0 == 0) goto L9e
            java.lang.Object r6 = r8.next()     // Catch: java.lang.Throwable -> L138
            X.2hx r6 = (p000X.2hx) r6     // Catch: java.lang.Throwable -> L138
            X.2j9 r7 = r12.A07     // Catch: java.lang.Throwable -> L138
            if (r13 == 0) goto L92
            X.2dD r0 = r13.A00     // Catch: java.lang.Throwable -> L138
            byte[] r2 = r0.A00()     // Catch: java.lang.Throwable -> L138
        L39:
            X.1Kx r0 = r7.A03     // Catch: java.lang.Throwable -> L138
            X.3Sp r5 = r0.A0C()     // Catch: java.lang.Throwable -> L138
            android.content.ContentValues r4 = p000X.0vE.A04()     // Catch: java.lang.Throwable -> L94
            java.lang.String r1 = "recipient_id"
            java.lang.String r0 = r6.A02     // Catch: java.lang.Throwable -> L94
            r4.put(r1, r0)     // Catch: java.lang.Throwable -> L94
            java.lang.String r1 = "recipient_type"
            int r0 = r6.A01     // Catch: java.lang.Throwable -> L94
            p000X.0v6.A0o(r4, r1, r0)     // Catch: java.lang.Throwable -> L94
            java.lang.String r1 = "device_id"
            int r0 = r6.A00     // Catch: java.lang.Throwable -> L94
            p000X.0v6.A0o(r4, r1, r0)     // Catch: java.lang.Throwable -> L94
            java.lang.String r0 = "public_key"
            if (r2 == 0) goto L60
            goto L64
        L60:
            r4.putNull(r0)     // Catch: java.lang.Throwable -> L94
            goto L67
        L64:
            r4.put(r0, r2)     // Catch: java.lang.Throwable -> L94
        L67:
            java.lang.String r2 = "timestamp"
            X.2lW r0 = r7.A02     // Catch: java.lang.Throwable -> L94
            long r0 = p000X.2lW.A01(r0)     // Catch: java.lang.Throwable -> L94
            p000X.0v6.A0p(r4, r2, r0)     // Catch: java.lang.Throwable -> L94
            X.2ll r2 = r5.A02     // Catch: java.lang.Throwable -> L94
            java.lang.String r1 = "identities"
            java.lang.String r0 = "SignalIdentityKeyStore/saveIdentity"
            long r1 = r2.A0A(r1, r0, r4)     // Catch: java.lang.Throwable -> L94
            java.lang.StringBuilder r4 = p000X.001.A0s()     // Catch: java.lang.Throwable -> L94
            java.lang.String r0 = "axolotl saved identity for "
            r4.append(r0)     // Catch: java.lang.Throwable -> L94
            r4.append(r6)     // Catch: java.lang.Throwable -> L94
            java.lang.String r0 = " with resultant row id "
            p000X.0v5.A11(r0, r4, r1)     // Catch: java.lang.Throwable -> L94
            r5.close()     // Catch: java.lang.Throwable -> L138
            goto L23
        L92:
            r2 = 0
            goto L39
        L94:
            r1 = move-exception
            r5.close()     // Catch: java.lang.Throwable -> L99
            goto L9d
        L99:
            r0 = move-exception
            r1.addSuppressed(r0)     // Catch: java.lang.Throwable -> L138
        L9d:
            throw r1     // Catch: java.lang.Throwable -> L138
        L9e:
            r9.A00()     // Catch: java.lang.Throwable -> L138
            java.lang.String r0 = "axolotl saved identity completed successfully"
            com.whatsapp.util.Log.m61i(r0)     // Catch: java.lang.Throwable -> L138
            r9.close()     // Catch: java.lang.Throwable -> L142
            r10.close()     // Catch: java.lang.Throwable -> L14c
            java.util.Iterator r6 = p000X.000.A0t(r11)     // Catch: java.lang.Throwable -> L14c
        Lb0:
            boolean r0 = r6.hasNext()     // Catch: java.lang.Throwable -> L14c
            if (r0 == 0) goto L134
            java.util.Map$Entry r1 = p000X.001.A11(r6)     // Catch: java.lang.Throwable -> L14c
            java.lang.Object r0 = r1.getKey()     // Catch: java.lang.Throwable -> L14c
            X.2hx r0 = (p000X.2hx) r0     // Catch: java.lang.Throwable -> L14c
            com.whatsapp.jid.DeviceJid r5 = p000X.30F.A04(r0)     // Catch: java.lang.Throwable -> L14c
            java.lang.Object r0 = r1.getValue()     // Catch: java.lang.Throwable -> L14c
            X.2Xj r0 = (p000X.2Xj) r0     // Catch: java.lang.Throwable -> L14c
            if (r5 == 0) goto Lb0
            if (r13 != 0) goto Ld6
            if (r0 == 0) goto Lb0
            X.1a2 r0 = r12.A02     // Catch: java.lang.Throwable -> L14c
            r0.A06(r5)     // Catch: java.lang.Throwable -> L14c
            goto Lb0
        Ld6:
            if (r0 != 0) goto Lfa
            X.1a2 r2 = r12.A02     // Catch: java.lang.Throwable -> L14c
            X.2uI r1 = r2.A01     // Catch: java.lang.Throwable -> L14c
            com.whatsapp.jid.UserJid r0 = r5.userJid     // Catch: java.lang.Throwable -> L14c
            X.2hx r0 = p000X.30F.A03(r0)     // Catch: java.lang.Throwable -> L14c
            X.3ZO r4 = p000X.2uI.A00(r0, r1)     // Catch: java.lang.Throwable -> L14c
            java.util.Iterator r1 = p000X.2st.A02(r2)     // Catch: java.lang.Throwable -> L128
        Lea:
            boolean r0 = r1.hasNext()     // Catch: java.lang.Throwable -> L128
            if (r0 == 0) goto L122
            java.lang.Object r0 = r1.next()     // Catch: java.lang.Throwable -> L128
            X.3yJ r0 = (p000X.3yJ) r0     // Catch: java.lang.Throwable -> L128
            r0.BJN(r5)     // Catch: java.lang.Throwable -> L128
            goto Lea
        Lfa:
            boolean r0 = r13.equals(r0)     // Catch: java.lang.Throwable -> L14c
            if (r0 != 0) goto Lb0
            X.1a2 r2 = r12.A02     // Catch: java.lang.Throwable -> L14c
            X.2uI r1 = r2.A01     // Catch: java.lang.Throwable -> L14c
            com.whatsapp.jid.UserJid r0 = r5.userJid     // Catch: java.lang.Throwable -> L14c
            X.2hx r0 = p000X.30F.A03(r0)     // Catch: java.lang.Throwable -> L14c
            X.3ZO r4 = p000X.2uI.A00(r0, r1)     // Catch: java.lang.Throwable -> L14c
            java.util.Iterator r1 = p000X.2st.A02(r2)     // Catch: java.lang.Throwable -> L128
        L112:
            boolean r0 = r1.hasNext()     // Catch: java.lang.Throwable -> L128
            if (r0 == 0) goto L122
            java.lang.Object r0 = r1.next()     // Catch: java.lang.Throwable -> L128
            X.3yJ r0 = (p000X.3yJ) r0     // Catch: java.lang.Throwable -> L128
            r0.BJO(r5)     // Catch: java.lang.Throwable -> L128
            goto L112
        L122:
            if (r4 == 0) goto Lb0
            r4.close()     // Catch: java.lang.Throwable -> L14c
            goto Lb0
        L128:
            r1 = move-exception
            if (r4 == 0) goto L14b
            r4.close()     // Catch: java.lang.Throwable -> L12f
            goto L14b
        L12f:
            r0 = move-exception
            r1.addSuppressed(r0)     // Catch: java.lang.Throwable -> L14c
            goto L14b
        L134:
            p000X.2uI.A02(r3)
            return
        L138:
            r1 = move-exception
            r9.close()     // Catch: java.lang.Throwable -> L13d
            goto L141
        L13d:
            r0 = move-exception
            r1.addSuppressed(r0)     // Catch: java.lang.Throwable -> L142
        L141:
            throw r1     // Catch: java.lang.Throwable -> L142
        L142:
            r1 = move-exception
            r10.close()     // Catch: java.lang.Throwable -> L147
            goto L14b
        L147:
            r0 = move-exception
            r1.addSuppressed(r0)     // Catch: java.lang.Throwable -> L14c
        L14b:
            throw r1     // Catch: java.lang.Throwable -> L14c
        L14c:
            r0 = move-exception
            p000X.2uI.A02(r3)
            throw r0
        */
        throw new UnsupportedOperationException("Method not decompiled: p000X.2xS.A0O(X.2Xj, X.2hx):void");
    }

Provide sample and class/method full name

https://www.whatsapp.com/download

Jadx version

No response

skylot commented 8 months ago

Yeah, looks like Unreachable block error quite often now. Will try to fix this with top priority

    /*  JADX ERROR: JadxRuntimeException in pass: BlockProcessor
        jadx.core.utils.exceptions.JadxRuntimeException: Unreachable block: B:67:0x014b
            at jadx.core.dex.visitors.blocks.BlockProcessor.checkForUnreachableBlocks(BlockProcessor.java:81)
            at jadx.core.dex.visitors.blocks.BlockProcessor.processBlocksTree(BlockProcessor.java:47)
            at jadx.core.dex.visitors.blocks.BlockProcessor.visit(BlockProcessor.java:39)
        */

Sample link: https://apkpure.com/whatsapp-android/com.whatsapp/download/2.23.21.12 Method: X.33E.A0N(X.2cr r13, X.2n9 r14)

ADR66-Git commented 8 months ago

Yes, it needs to be resolved. A basic 30% -50% method for an app cannot be decompiled. You can refer to the mt manager and Jeb's GDA decompiler to make modifications. The best currently used decompilers are Jeb and GDA. Their decompiler can successfully decompile.

ljcool2006 commented 2 months ago

The new version of jadx is decompiled every time. Many methods fail to decompile. The decompiler is not yet as user-friendly as 1.2.0. The more you do, the more garbage you become

...what?