diff --git a/d2j-smali/build.gradle b/d2j-smali/build.gradle index 5cfacdeab..74ccc6cfc 100644 --- a/d2j-smali/build.gradle +++ b/d2j-smali/build.gradle @@ -1,9 +1,9 @@ apply plugin: 'antlr' dependencies { - compile 'org.antlr:antlr4-runtime:4.5' + compile 'org.antlr:antlr4-runtime:4.9.3' // Newer versions only for Java 11+ compile project(':dex-reader') - antlr 'org.antlr:antlr4:4.5' + antlr 'org.antlr:antlr4:4.9.3' // Newer versions only for Java 11+ compile project(':d2j-base-cmd') compile project(':dex-writer') testImplementation "com.android.tools.smali:smali-baksmali:3.0.3" diff --git a/d2j-smali/src/main/antlr4/com/googlecode/d2j/smali/antlr4/Smali.g4 b/d2j-smali/src/main/antlr4/com/googlecode/d2j/smali/antlr4/Smali.g4 index 506fd2a95..af0a0d3a3 100644 --- a/d2j-smali/src/main/antlr4/com/googlecode/d2j/smali/antlr4/Smali.g4 +++ b/d2j-smali/src/main/antlr4/com/googlecode/d2j/smali/antlr4/Smali.g4 @@ -33,7 +33,7 @@ HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; fragment ESC_SEQ - : '\\' ('b'|'t'|'n'|'f'|'r'|'\''|'\"'|'\\') + : '\\' ('b'|'t'|'n'|'f'|'r'|'\''|'"'|'\\') | UNICODE_ESC | OCTAL_ESC ; @@ -58,7 +58,7 @@ fragment FRAGMENT_ARRAY_TYPE: ('[')+ (FRAGMENT_PRIMITIVE_TYPE|FRAGMENT_OBJECT_TYPE); fragment -FRAGMENT_ID: (ESC_SEQ| ~('\\'|'\r'|'\n'|'\t'|' '|':'|'-'|'='|','|'{'|'}'|'('|')'|'+'|'\"'|'\''|'#'|'/'|'.'|';'|'@'))+; +FRAGMENT_ID: (ESC_SEQ| ~('\\'|'\r'|'\n'|'\t'|' '|':'|'-'|'='|','|'{'|'}'|'('|')'|'+'|'"'|'\''|'#'|'/'|'.'|';'|'@'))+; fragment FRAGMENT_METHOD_PROTO: '(' (FRAGMENT_OBJECT_TYPE|FRAGMENT_ARRAY_TYPE|FRAGMENT_PRIMITIVE_TYPE)* ')' ('V' | FRAGMENT_OBJECT_TYPE|FRAGMENT_ARRAY_TYPE|FRAGMENT_PRIMITIVE_TYPE) ; diff --git a/d2j-smali/src/main/java/com/googlecode/d2j/smali/Smali.java b/d2j-smali/src/main/java/com/googlecode/d2j/smali/Smali.java index cbed0f517..77969c733 100644 --- a/d2j-smali/src/main/java/com/googlecode/d2j/smali/Smali.java +++ b/d2j-smali/src/main/java/com/googlecode/d2j/smali/Smali.java @@ -21,7 +21,11 @@ import com.googlecode.d2j.smali.antlr4.SmaliLexer; import com.googlecode.d2j.smali.antlr4.SmaliParser; import com.googlecode.d2j.visitors.DexFileVisitor; -import org.antlr.v4.runtime.*; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CodePointCharStream; +import org.antlr.v4.runtime.CommonTokenStream; import java.io.IOException; import java.io.InputStream; @@ -37,22 +41,19 @@ public class Smali { public static void smaliFile(Path path, DexFileVisitor dcv) throws IOException { try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { - ANTLRInputStream is = new ANTLRInputStream(reader); - is.name = path.toString(); + CodePointCharStream is = CharStreams.fromReader(reader, path.toString()); smali0(dcv, is); } } - public static void smaliFile(String name, String buff, DexFileVisitor dcv) throws IOException { - ANTLRInputStream is = new ANTLRInputStream(buff); - is.name = name; + public static void smaliFile(String name, String buff, DexFileVisitor dcv) { + CodePointCharStream is = CharStreams.fromString(buff, name); smali0(dcv, is); } public static void smaliFile(String name, InputStream in, DexFileVisitor dcv) throws IOException { try (InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { - ANTLRInputStream is = new ANTLRInputStream(reader); - is.name = name; + CodePointCharStream is = CharStreams.fromReader(reader, name); smali0(dcv, is); } } @@ -63,13 +64,13 @@ public static DexClassNode smaliFile2Node(String name, InputStream in) throws IO return dfn.clzs.size() > 0 ? dfn.clzs.get(0) : null; } - public static DexClassNode smaliFile2Node(String name, String buff) throws IOException { + public static DexClassNode smaliFile2Node(String name, String buff) { DexFileNode dfn = new DexFileNode(); smaliFile(name, buff, dfn); return dfn.clzs.size() > 0 ? dfn.clzs.get(0) : null; } - private static void smali0(DexFileVisitor dcv, CharStream is) throws IOException { + private static void smali0(DexFileVisitor dcv, CharStream is) { SmaliLexer lexer = new SmaliLexer(is); CommonTokenStream ts = new CommonTokenStream(lexer); SmaliParser parser = new SmaliParser(ts); @@ -79,10 +80,9 @@ private static void smali0(DexFileVisitor dcv, CharStream is) throws IOException } } - public static void smaliFile(String fileName, char[] data, DexFileVisitor dcv) throws IOException { + public static void smaliFile(String fileName, char[] data, DexFileVisitor dcv) { // System.err.println("parsing " + f.getAbsoluteFile()); - ANTLRInputStream is = new ANTLRInputStream(data, data.length); - is.name = fileName; + CodePointCharStream is = CharStreams.fromString(new String(data), fileName); smali0(dcv, is); } diff --git a/d2j-smali/src/test/java/a/SmaliTest.java b/d2j-smali/src/test/java/a/SmaliTest.java index b5bb0dbfe..8b493ba1c 100644 --- a/d2j-smali/src/test/java/a/SmaliTest.java +++ b/d2j-smali/src/test/java/a/SmaliTest.java @@ -64,6 +64,10 @@ public void test2() throws IOException { for (File f : fs) { if (f.getName().endsWith(".dex") || f.getName().endsWith(".apk")) { System.out.println(f.getName()); + if (f.getName().equals("dex040.dex")) { + // FIXME smali 3.0.3 not support space in SimpleName + continue; + } dotest(f); } }