mirror of
https://github.com/revanced/Apktool.git
synced 2025-01-21 01:07:34 +01:00
Smali and baksmali using SmaliMod and BaksmaliMod.
This commit is contained in:
parent
68899cf3f3
commit
4219a8e878
@ -17,14 +17,12 @@
|
|||||||
package brut.androlib.src;
|
package brut.androlib.src;
|
||||||
|
|
||||||
import brut.androlib.AndrolibException;
|
import brut.androlib.AndrolibException;
|
||||||
|
import brut.androlib.mod.SmaliMod;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import org.antlr.runtime.*;
|
import org.antlr.runtime.RecognitionException;
|
||||||
import org.antlr.runtime.tree.CommonTree;
|
|
||||||
import org.antlr.runtime.tree.CommonTreeNodeStream;
|
|
||||||
import org.jf.dexlib.CodeItem;
|
import org.jf.dexlib.CodeItem;
|
||||||
import org.jf.dexlib.DexFile;
|
import org.jf.dexlib.DexFile;
|
||||||
import org.jf.dexlib.Util.ByteArrayAnnotatedOutput;
|
import org.jf.dexlib.Util.ByteArrayAnnotatedOutput;
|
||||||
import org.jf.smali.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
|
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
|
||||||
@ -42,7 +40,8 @@ public class DexFileBuilder {
|
|||||||
public void addSmaliFile(InputStream smaliStream, String name)
|
public void addSmaliFile(InputStream smaliStream, String name)
|
||||||
throws AndrolibException {
|
throws AndrolibException {
|
||||||
try {
|
try {
|
||||||
if (!assembleSmaliFile(smaliStream, name)) {
|
if (! SmaliMod.assembleSmaliFile(
|
||||||
|
smaliStream, name, mDexFile, false, false, false)) {
|
||||||
throw new AndrolibException(
|
throw new AndrolibException(
|
||||||
"Could not smali file: " + smaliStream);
|
"Could not smali file: " + smaliStream);
|
||||||
}
|
}
|
||||||
@ -82,38 +81,5 @@ public class DexFileBuilder {
|
|||||||
return bytes;
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean assembleSmaliFile(InputStream smaliStream, String name)
|
|
||||||
throws IOException, RecognitionException {
|
|
||||||
ANTLRInputStream input = new ANTLRInputStream(smaliStream, "UTF8");
|
|
||||||
input.name = name;
|
|
||||||
|
|
||||||
smaliLexer lexer = new smaliLexer(input);
|
|
||||||
|
|
||||||
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
|
||||||
smaliParser parser = new smaliParser(tokens);
|
|
||||||
|
|
||||||
smaliParser.smali_file_return result = parser.smali_file();
|
|
||||||
|
|
||||||
if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfLexerErrors() > 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CommonTree t = (CommonTree) result.getTree();
|
|
||||||
|
|
||||||
CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
|
|
||||||
treeStream.setTokenStream(tokens);
|
|
||||||
|
|
||||||
smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
|
|
||||||
|
|
||||||
dexGen.dexFile = mDexFile;
|
|
||||||
dexGen.smali_file();
|
|
||||||
|
|
||||||
if (dexGen.getNumberOfSyntaxErrors() > 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final DexFile mDexFile = new DexFile();
|
private final DexFile mDexFile = new DexFile();
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,9 @@
|
|||||||
package brut.androlib.src;
|
package brut.androlib.src;
|
||||||
|
|
||||||
import brut.androlib.AndrolibException;
|
import brut.androlib.AndrolibException;
|
||||||
import brut.androlib.mod.IndentingWriter;
|
import brut.androlib.mod.BaksmaliMod;
|
||||||
import java.io.*;
|
import java.io.File;
|
||||||
import org.jf.baksmali.Adaptors.ClassDefinition;
|
import java.io.IOException;
|
||||||
import org.jf.baksmali.baksmali;
|
|
||||||
import org.jf.dexlib.ClassDefItem;
|
|
||||||
import org.jf.dexlib.Code.Analysis.ClassPath;
|
import org.jf.dexlib.Code.Analysis.ClassPath;
|
||||||
import org.jf.dexlib.DexFile;
|
import org.jf.dexlib.DexFile;
|
||||||
|
|
||||||
@ -42,51 +40,20 @@ public class SmaliDecoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void decode() throws AndrolibException {
|
private void decode() throws AndrolibException {
|
||||||
try {
|
if (mDebug) {
|
||||||
baksmali.useLocalsDirective = true;
|
ClassPath.dontLoadClassPath = true;
|
||||||
baksmali.useSequentialLabels = true;
|
}
|
||||||
if (mDebug) {
|
|
||||||
baksmali.registerInfo = org.jf.baksmali.main.DIFFPRE;
|
|
||||||
ClassPath.dontLoadClassPath = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
DexFile dexFile = new DexFile(mApkFile);
|
try {
|
||||||
for (ClassDefItem classDefItem :
|
BaksmaliMod.disassembleDexFile(mDebug, mApkFile.getAbsolutePath(),
|
||||||
dexFile.ClassDefsSection.getItems()) {
|
new DexFile(mApkFile), false, mOutDir.getAbsolutePath(),
|
||||||
decodeClassDefItem(classDefItem);
|
null, null, null, false, true, true, true, false,
|
||||||
}
|
mDebug ? org.jf.baksmali.main.DIFFPRE : 0, false, false);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
throw new AndrolibException(ex);
|
throw new AndrolibException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void decodeClassDefItem(ClassDefItem classDefItem)
|
|
||||||
throws AndrolibException, IOException {
|
|
||||||
TypeName name = TypeName.fromInternalName(
|
|
||||||
classDefItem.getClassType().getTypeDescriptor());
|
|
||||||
File outFile = new File(mOutDir, name.getFilePath(true)
|
|
||||||
+ (mDebug ? ".java" : ".smali"));
|
|
||||||
|
|
||||||
if (outFile.exists()) {
|
|
||||||
throw new AndrolibException(
|
|
||||||
"File already exists: " + outFile);
|
|
||||||
}
|
|
||||||
outFile.getParentFile().mkdirs();
|
|
||||||
|
|
||||||
IndentingWriter indentWriter =
|
|
||||||
new IndentingWriter(new FileWriter(outFile));
|
|
||||||
|
|
||||||
if (mDebug) {
|
|
||||||
indentWriter.write("package " + name.package_ + "; class "
|
|
||||||
+ name.getName(true, true) + " {/*\n\n");
|
|
||||||
}
|
|
||||||
new ClassDefinition(classDefItem).writeTo(indentWriter);
|
|
||||||
if (mDebug) {
|
|
||||||
indentWriter.write("\n*/}\n");
|
|
||||||
}
|
|
||||||
indentWriter.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
private final File mApkFile;
|
private final File mApkFile;
|
||||||
private final File mOutDir;
|
private final File mOutDir;
|
||||||
private final boolean mDebug;
|
private final boolean mDebug;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user