package the.bytecode.club.bytecodeviewer.plugin.preinstalled; import org.objectweb.asm.tree.ClassNode; import the.bytecode.club.bytecodeviewer.BytecodeViewer; import the.bytecode.club.bytecodeviewer.api.ExceptionUI; import the.bytecode.club.bytecodeviewer.api.Plugin; import the.bytecode.club.bytecodeviewer.api.PluginConsole; import javax.swing.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; /*************************************************************************** * Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite * * Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * ***************************************************************************/ /** * Runs the classes then simply grabs the static String[] z * * @author Konloch * @author Righteous * */ public class ZStringArrayDecrypter extends Plugin { PluginConsole gui = new PluginConsole("ZStringArray Decrypter"); StringBuilder out = new StringBuilder(); @Override public void execute(ArrayList<ClassNode> classNodeList) { JOptionPane pane = new JOptionPane( "WARNING: This will load the classes into the JVM and execute the initialize function" + BytecodeViewer.nl+ "for each class. IF THE FILE YOU'RE LOADING IS MALICIOUS, DO NOT CONTINUE." ); Object[] options = new String[] { "Continue", "Cancel" }; pane.setOptions(options); JDialog dialog = pane.createDialog(BytecodeViewer.viewer, "Bytecode Viewer - WARNING"); dialog.setVisible(true); Object obj = pane.getValue(); int result = -1; for (int k = 0; k < options.length; k++) if (options[k].equals(obj)) result = k; if (result == 0) { boolean needsWarning = false; try { for (Class<?> debug : the.bytecode.club.bytecodeviewer.api.BytecodeViewer.loadAllClassesIntoClassLoader()) { try { Field[] fields = debug.getDeclaredFields(); for ( Field field : fields ) { if ( field.getName().equals("z") ) { out.append(debug.getName() + ":" + BytecodeViewer.nl); field.setAccessible(true); if(field.get(null) != null && field.get(null) instanceof String[] && Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) { String[] fieldVal = (String[]) field.get(null); for ( int i = 0; i < fieldVal.length; i++ ) { out.append(" z[" + i + "] = " + fieldVal[i] + BytecodeViewer.nl); } } } } } catch(NoClassDefFoundError | Exception e) { System.err.println("Failed loading class " + debug.getName()); e.printStackTrace(); needsWarning = true; } } } catch (Exception e){ new ExceptionUI(e); } if(needsWarning) { BytecodeViewer.showMessage("Some classes failed to decrypt, if you'd like to decrypt all of them"+BytecodeViewer.nl+"makes sure you include ALL the libraries it requires."); } gui.setText(out.toString()); gui.setVisible(true); } } }