/* * <Manal project is an eclipse plugin for the automation of malware analysis.> * Copyright (C) <2014> <Nikolay Akatyev, Hojun Son> * This file is part of Manal project. * * Manal project 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, version 3 of the License. * * Manal project 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 Manal project. If not, see <http://www.gnu.org/licenses/>. * * Contact information of contributors: * - Nikolay Akatyev: nikolay.akatyev@gmail.com * - Hojun Son: smuoon4680@gmail.com */ package com.dforensic.plugin.manal.wizards; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.Collections; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.WorkbenchException; import com.dforensic.plugin.manal.model.ProjectProperties; import com.dforensic.plugin.manal.perspective.SuspectAnalysisPerspective; /** * * Refer to the following article * http://www.ibm.com/developerworks/ru/library/os-eclipse-custwiz/ * * @author Zeoo * */ public class NewManalProjectWizard extends Wizard implements INewWizard, IExecutableExtension { private WizardManalPropertiesPage propertiesPage; private IWorkbench workbench; private IProject project; @Override public void addPages() { propertiesPage = new WizardManalPropertiesPage(); addPage(propertiesPage); super.addPages(); } @Override public void init(IWorkbench workbench, IStructuredSelection selection) { setWindowTitle("Suspect Analysis Project"); this.workbench = workbench; } @Override public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { // TODO Auto-generated method stub } @Override public boolean performFinish() { ProjectProperties.setApkNameVal(propertiesPage.getApkFileName()); // ProjectProperties.setPrjNameVal(propertiesPage.getProjectName()); ProjectProperties.setAndroidPathVal(propertiesPage.getAndroidDirectoryName()); final String updateDir = propertiesPage.getDecompiledSourceDirectoryName() + "\\eclipseproject";; try { URL decompilerUrl = FileLocator.resolve(FileLocator.find(Platform.getBundle( "com.dforensic.plugin.manal"), new Path("tools/decompiler/APKtoJava.exe"), Collections.EMPTY_MAP)); Process p = Runtime.getRuntime().exec(decompilerUrl.getFile() + " " + propertiesPage.getApkFileName() + " " + propertiesPage.getDecompiledSourceDirectoryName()); p.waitFor(); } catch (IOException | InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } boolean res = importProject(updateDir); boolean doOpenPerspective = MessageDialog.openQuestion(getShell(), "Process finished", "Open new suspect analysis perspective?"); if (res && doOpenPerspective) { openPerspective(SuspectAnalysisPerspective.SUSPECT_ANAL_PERSP_ID); } return res; } private boolean importProject(String baseDir) { if (baseDir != null) { File prjDir = new File(baseDir); try { IProjectDescription description = ResourcesPlugin .getWorkspace() .loadProjectDescription( new Path(prjDir.getAbsolutePath() + "/.project")); project = ResourcesPlugin.getWorkspace().getRoot() .getProject(description.getName()); project.create(description, null); project.open(null); project.setPersistentProperty(new QualifiedName(ProjectProperties.QUALIFIER, ProjectProperties.getApkNameKey()), ProjectProperties.getApkNameVal()); // project.setPersistentProperty(new QualifiedName(ProjectProperties.QUALIFIER, // ProjectProperties.getPrjNameKey()), // ProjectProperties.getPrjNameVal()); project.setPersistentProperty(new QualifiedName(ProjectProperties.QUALIFIER, ProjectProperties.getAndroidPathKey()), ProjectProperties.getAndroidPathVal()); return true; } catch (CoreException e) { System.err.println("Not valid project to be opened."); return false; } } else { System.err .println("Directory to import a project is not specified."); return false; } } private void openPerspective(String perspectiveID) { IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); try { workbench.showPerspective(perspectiveID, window); } catch (WorkbenchException e) { System.err.println("Unable to open Perspective [" + perspectiveID + "]."); MessageDialog.openError(window.getShell(), "Error Opening Perspective", "Could not open Perspective with ID: " + perspectiveID); } } /** * Catches output from a "java.lang.Process" and writes it to either * System.err or System.out. * * @author Klaas Waslander - Sun Java Center */ private class BackgroundPrinter extends Thread { private InputStream in; boolean isErrorOutput; public BackgroundPrinter(InputStream in, boolean isErrorOutput) { this.in = in; this.isErrorOutput = isErrorOutput; } public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(this.in)); // read buffer char[] buf = new char[1024]; // write data to target, until no more data is left to read int numberOfReadBytes; while ((numberOfReadBytes = reader.read(buf)) != -1) { char[] clearedbuf = new char[numberOfReadBytes]; System.arraycopy(buf, 0, clearedbuf, 0, numberOfReadBytes); } /* * } catch (IOException ioe) { // ignore this: process has ended, * causing IOException } catch (NullPointerException ioe) { // ignore * this: there was no resulting output */ } catch (Exception e) { } } public void close() { try { this.in.close(); } catch (Exception e) { } } } }