@Override public String decompileClassNode(ClassNode cn, byte[] b) { String exception = ""; try { String fileStart = BytecodeViewer.tempDirectory + BytecodeViewer.fs + "temp"; final File tempClass = new File(MiscUtils.getUniqueName(fileStart, ".class") + ".class"); try { final FileOutputStream fos = new FileOutputStream(tempClass); fos.write(b); fos.close(); } catch (final IOException e) { new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e); } DecompilerSettings settings = getDecompilerSettings(); LuytenTypeLoader typeLoader = new LuytenTypeLoader(); MetadataSystem metadataSystem = new MetadataSystem(typeLoader); TypeReference type = metadataSystem.lookupType(tempClass.getCanonicalPath()); DecompilationOptions decompilationOptions = new DecompilationOptions(); decompilationOptions.setSettings(DecompilerSettings.javaDefaults()); decompilationOptions.setFullDecompilation(true); TypeDefinition resolvedType = null; if (type == null || ((resolvedType = type.resolve()) == null)) { throw new Exception("Unable to resolve type."); } StringWriter stringwriter = new StringWriter(); settings .getLanguage() .decompileType(resolvedType, new PlainTextOutput(stringwriter), decompilationOptions); String decompiledSource = stringwriter.toString(); return decompiledSource; } catch (Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); e.printStackTrace(); exception = "Bytecode Viewer Version: " + BytecodeViewer.version + BytecodeViewer.nl + BytecodeViewer.nl + sw.toString(); } return "Procyon error! Send the stacktrace to Konloch at http://the.bytecode.club or [email protected]" + BytecodeViewer.nl + BytecodeViewer.nl + "Suggested Fix: Click refresh class, if it fails again try another decompiler." + BytecodeViewer.nl + BytecodeViewer.nl + exception; }
public String decompileClassNode(ClassNode cn, byte[] b) { String fileStart = BytecodeViewer.tempDir.getAbsolutePath() + BytecodeViewer.fs + "temp"; String start = MiscUtils.getUniqueName(fileStart, ".class"); final File tempClass = new File(start + ".class"); final File tempZip = new File(start + ".jar"); final File tempDex = new File(start + ".dex"); final File tempSmali = new File(start + "-smali"); // output directory try { final FileOutputStream fos = new FileOutputStream(tempClass); fos.write(b); fos.close(); } catch (final IOException e) { new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e); } ZipUtil.packEntry(tempClass, tempZip); Dex2Jar.saveAsDex(tempZip, tempDex); try { org.jf.baksmali.main.main( new String[] {"-o", tempSmali.getAbsolutePath(), "-x", tempDex.getAbsolutePath()}); } catch (Exception e) { new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e); } File outputSmali = null; boolean found = false; File current = tempSmali; while (!found) { File f = current.listFiles()[0]; if (f.isDirectory()) current = f; else { outputSmali = f; found = true; } } try { return FileUtils.readFileToString(outputSmali, "UTF-8"); } catch (Exception e) { new the.bytecode.club.bytecodeviewer.api.ExceptionUI(e); } return null; }
@Override public boolean accept(File f) { if (f.isDirectory()) return true; return PluginManager.pluginExtensions().contains(MiscUtils.extension(f.getAbsolutePath())); }