From 5e4c90f7150ffe16d98940448efd2bdb4a83245b Mon Sep 17 00:00:00 2001 From: Nico Mexis Date: Mon, 9 Aug 2021 22:52:12 +0200 Subject: [PATCH] Add workaround for invalid signatures cherry-pick from https://github.com/ThexXTURBOXx/dex2jar/commit/f1da047322d91427fd176367faa0c45472aa745f --- .../java/com/googlecode/d2j/dex/Dex2Asm.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java b/dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java index f37b4fad5..9c98f70b4 100644 --- a/dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java +++ b/dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java @@ -275,7 +275,16 @@ private static MethodVisitor collectBasicMethodInfo(DexMethodNode methodNode, Cl // clear ACC_DECLARED_SYNCHRONIZED and ACC_CONSTRUCTOR from method flags final int cleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | DexConstants.ACC_CONSTRUCTOR)); access &= cleanFlag; - return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), signature, xthrows); + try { + return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), signature, xthrows); + } catch (StringIndexOutOfBoundsException | IllegalArgumentException e) { + System.err.println("Applying workaround to method " + + methodNode.method.getOwner() + "#" + methodNode.method.getName() + + " with original signature " + signature + + " by changing its types to java.lang.Object."); + return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), + "(Ljava/lang/Object;)Ljava/lang/Object;", xthrows); + } } protected static Map collectClzInfo(DexFileNode fileNode) { @@ -523,9 +532,21 @@ public void convertField(DexClassNode classNode, DexFieldNode fieldNode, ClassVi } } Object value = convertConstantValue(fieldNode.cst); - final int FieldCleanFlag = ~DexConstants.ACC_DECLARED_SYNCHRONIZED; - FieldVisitor fv = cv.visitField(fieldNode.access & FieldCleanFlag, fieldNode.field.getName(), - fieldNode.field.getType(), signature, value); + + final int fieldCleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC)); + FieldVisitor fv; + try { + fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(), + fieldNode.field.getType(), signature, value); + } catch (StringIndexOutOfBoundsException | IllegalArgumentException e) { + System.err.println("Applying workaround to field " + + classNode.className + "#" + fieldNode.field.getName() + + " with original signature " + signature + + " by changing its type to java.lang.Object."); + fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(), + fieldNode.field.getType(), "Ljava/lang/Object;", value); + } + if (fv == null) { return; }