/* * <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.views; import java.util.List; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import com.dforensic.plugin.manal.model.ApiDescriptor; /** * Draws a view to display found sinks and sources. * Refer to articles about UI elements in eclipse: * http://www.vogella.com/tutorials/EclipseJFace/article.html * http://www.vogella.com/tutorials/SWT/article.html * http://www.vogella.com/tutorials/EclipseJFaceTable/article.html * * @author Zeoo * */ public class SuspectListVw extends ViewPart { public static final String ID = "com.dforensic.plugin.manal.views.SuspectList"; public interface ApiDescriptorSelection { public abstract void onApiDescriptorSelected(ApiDescriptor apiDesc); } private LeakSourcesVw leakSourcesVw; // private TableViewer mViewer; private ListViewer mSinksListVw; // private SuspectSearch mParser; private List<ApiDescriptor> mSinks = null; private ApiDescriptorSelection mApiDescSelectioin = null; class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { ApiDescriptor apiDesc = (ApiDescriptor) obj; return apiDesc.getMethodName(); } public Image getColumnImage(Object obj, int index) { return getImage(obj); } public Image getImage(Object obj) { return PlatformUI.getWorkbench().getSharedImages() .getImage(ISharedImages.IMG_OBJ_ELEMENT); } } /** * This is a callback that will allow us to create the viewer and initialize * it. */ public void createPartControl(Composite parent) { IWorkbench wb = PlatformUI.getWorkbench(); IWorkbenchWindow win = wb.getActiveWorkbenchWindow(); IWorkbenchPage page = win.getActivePage(); leakSourcesVw = (LeakSourcesVw) page.findView(LeakSourcesVw.ID); /* mParser = new SuspectSearch(); XmlManager xmlManager = new XmlManager(); xmlManager.readApiDescriptor("suspicious_api_in.xml"); List<ApiDescriptor> parsedApi = xmlManager.getParsedApi(); System.out.println(">>parsed API:\n\n"); for (ApiDescriptor desc : parsedApi) { System.out.println(desc.toString()); } mParser.setSuspectApi(parsedApi); mParser.run(); viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); getSite().setSelectionProvider(viewer); viewer.setInput(getElements()); */ mSinksListVw = new ListViewer(parent); mSinksListVw.setContentProvider(new ArrayContentProvider()); // viewer.setLabelProvider(new ViewLabelProvider()); // getSite().setSelectionProvider(mSinksListVw); mSinksListVw .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) mSinksListVw .getSelection(); ApiDescriptor firstElement = (ApiDescriptor) selection .getFirstElement(); if (mApiDescSelectioin != null) { mApiDescSelectioin.onApiDescriptorSelected(firstElement); } if (firstElement != null) { leakSourcesVw.setSources(firstElement.getDependencyList()); leakSourcesVw.showSources(); } } }); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { // mViewer.getControl().setFocus(); mSinksListVw.getControl().setFocus(); } public void setSinks(List<ApiDescriptor> sinks) { mSinks = sinks; } public void showSinks() { if (mSinks != null) { mSinksListVw.setInput(getElements()); //substring���� �߶� �Ķ���� �Լ� �̸� split ����. /* for (ApiDescriptor sink : mSinks) { if (sink != null) { SinkInfo sinkInfo = sink.getSinkInfo(); if (sinkInfo != null) { System.out.println("Discovered sink: " + sinkInfo); // Show in the list } else { System.err .println("Discovered sink does not include information."); } } else { System.err.println("Discovered sink is NULL."); } } */ } else { System.err.println("Nothing to show, sinks are not initialized."); } } private ApiDescriptor[] getElements() { if (mSinks != null) { return mSinks.toArray(new ApiDescriptor[mSinks.size()]); } else { System.err.println("No sinks to display. It is NULL."); return null; } } // // Build up a simple data model // // TODO start parsing here // private ApiDescriptor[] getElements() { // if (mParser != null) { // List<ApiDescriptor> methods = mParser.getMethodDescriptions(); // if (methods != null) { // return methods.toArray(new ApiDescriptor[methods.size()]); // } else { // System.out.println(">>error: Methods are not extracted. NULL."); // return null; // } // } else { // System.out.println(">>error: Parser is not initialized."); // return null; // } // /* // * ApiDescription[] apiDescAr = new ApiDescription[2]; ApiDescription // * apiDesc = new ApiDescription(); apiDesc.setMethodName("openFile"); // * apiDescAr[0] = apiDesc; apiDesc = new ApiDescription(); // * apiDesc.setMethodName("connectHttp"); apiDescAr[1] = apiDesc; return // * apiDescAr; // */ // } public void registerApiDescriptorSelection(ApiDescriptorSelection listener) { mApiDescSelectioin = listener; } public void unregisterApiDescriptorSelection(ApiDescriptorSelection listener) { mApiDescSelectioin = null; } }