/* * Copyright (C) 2010 Ryszard Wiśniewski * Copyright (C) 2010 Connor Tumbleson * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package brut.androlib.mod; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeNodeStream; import org.apache.commons.io.IOUtils; import org.jf.dexlib2.writer.builder.DexBuilder; import org.jf.smali.smaliFlexLexer; import org.jf.smali.smaliParser; import org.jf.smali.smaliTreeWalker; import java.io.*; import java.nio.charset.StandardCharsets; public class SmaliMod { public static boolean assembleSmaliFile(String smali, DexBuilder dexBuilder, int apiLevel, boolean verboseErrors, boolean printTokens, File smaliFile) throws IOException, RuntimeException, RecognitionException { InputStream is = new ByteArrayInputStream(smali.getBytes()); return assembleSmaliFile(is, dexBuilder, apiLevel, verboseErrors, printTokens, smaliFile); } public static boolean assembleSmaliFile(InputStream is,DexBuilder dexBuilder, int apiLevel, boolean verboseErrors, boolean printTokens, File smaliFile) throws IOException, RecognitionException { // copy our filestream into a tmp file, so we don't overwrite File tmp = File.createTempFile("BRUT",".bak"); tmp.deleteOnExit(); OutputStream os = new FileOutputStream(tmp); IOUtils.copy(is, os); os.close(); return assembleSmaliFile(tmp,dexBuilder, apiLevel, verboseErrors, printTokens); } public static boolean assembleSmaliFile(File smaliFile,DexBuilder dexBuilder, int apiLevel, boolean verboseErrors, boolean printTokens) throws IOException, RecognitionException { CommonTokenStream tokens; smaliFlexLexer lexer; InputStream is = new FileInputStream(smaliFile); InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8); lexer = new smaliFlexLexer(reader, apiLevel); (lexer).setSourceFile(smaliFile); tokens = new CommonTokenStream(lexer); if (printTokens) { tokens.getTokens(); for (int i=0; i 0 || lexer.getNumberOfSyntaxErrors() > 0) { is.close(); reader.close(); return false; } CommonTree t = result.getTree(); CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t); treeStream.setTokenStream(tokens); smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); dexGen.setApiLevel(apiLevel); dexGen.setVerboseErrors(verboseErrors); dexGen.setDexBuilder(dexBuilder); dexGen.smali_file(); is.close(); reader.close(); return dexGen.getNumberOfSyntaxErrors() == 0; } }