Search in sources :

Example 1 with CCallgraph

use of com.google.security.zynamics.binnavi.disassembly.CCallgraph in project binnavi by google.

the class PostgreSQLCallgraphLoader method loadCallgraph.

/**
 * Loads the call graph of a module.
 *
 * The module, the call graph ID, and all functions of the function list must refer to objects
 * stored in the database connected to by the provider argument.
 *
 * @param provider The SQL provider that provides the connection.
 * @param module The module whose call graph is loaded.
 * @param callgraphId The view ID of the call graph to load.
 * @param functions A list that contains all functions of the module.
 *
 * @return The loaded call graph.
 *
 * @throws CouldntLoadDataException Thrown if the call graph could not be loaded.
 */
public static CCallgraph loadCallgraph(final AbstractSQLProvider provider, final CModule module, final int callgraphId, final List<INaviFunction> functions) throws CouldntLoadDataException {
    checkArguments(provider, module, functions);
    final CConnection connection = provider.getConnection();
    try {
        final Pair<List<ICallgraphNode>, Map<Integer, CCallgraphNode>> nodeResult = loadNodes(connection, callgraphId, functions);
        final List<ICallgraphEdge> edges = loadEdges(connection, callgraphId, nodeResult.second());
        return new CCallgraph(nodeResult.first(), edges);
    } catch (final SQLException exception) {
        throw new CouldntLoadDataException(exception);
    }
}
Also used : CConnection(com.google.security.zynamics.binnavi.Database.CConnection) ICallgraphEdge(com.google.security.zynamics.binnavi.disassembly.ICallgraphEdge) SQLException(java.sql.SQLException) CouldntLoadDataException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map) CCallgraph(com.google.security.zynamics.binnavi.disassembly.CCallgraph)

Example 2 with CCallgraph

use of com.google.security.zynamics.binnavi.disassembly.CCallgraph in project binnavi by google.

the class CPostgreSQLModuleContentTest method testCModuleContentConstructor.

@Test
public void testCModuleContentConstructor() throws LoadCancelledException, CouldntLoadDataException {
    final CModule module = (CModule) getDatabase().getContent().getModules().get(0);
    module.load();
    final ListenerProvider<IModuleListener> listeners = new ListenerProvider<IModuleListener>();
    final CCallgraph callgraph = module.getContent().getNativeCallgraph();
    final IFilledList<INaviFunction> functions = new FilledList<INaviFunction>();
    functions.add(module.getContent().getFunctionContainer().getFunctions().get(0));
    final ICallgraphView nativeCallgraph = module.getContent().getViewContainer().getNativeCallgraphView();
    final ImmutableList<IFlowgraphView> nativeFlowgraphs = module.getContent().getViewContainer().getNativeFlowgraphViews();
    final List<INaviView> customViews = new ArrayList<INaviView>();
    final ImmutableBiMap<INaviView, INaviFunction> viewFunctionMap = new ImmutableBiMap.Builder<INaviView, INaviFunction>().build();
    new Pair<HashMap<INaviView, INaviFunction>, HashMap<INaviFunction, INaviView>>(null, null);
    final IFilledList<TraceList> traces = new FilledList<TraceList>();
    final SectionContainer sections = new SectionContainer(new SectionContainerBackend(getProvider(), module));
    final TypeInstanceContainer instances = new TypeInstanceContainer(new TypeInstanceContainerBackend(getProvider(), module, module.getTypeManager(), sections), getProvider());
    final CModuleContent moduleContent1 = new CModuleContent(module, getProvider(), listeners, callgraph, functions, nativeCallgraph, nativeFlowgraphs, customViews, viewFunctionMap, traces, sections, instances);
    assertNotNull(moduleContent1);
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(null, null, null, null, null, null, null, null, null, null, sections, instances);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, null, null, null, null, null, null, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), null, null, null, null, null, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, null, null, null, null, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, null, null, null, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, functions, null, null, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, functions, nativeCallgraph, null, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, functions, nativeCallgraph, nativeFlowgraphs, null, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, functions, nativeCallgraph, nativeFlowgraphs, customViews, null, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, functions, nativeCallgraph, nativeFlowgraphs, customViews, viewFunctionMap, null, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
    try {
        @SuppressWarnings("unused") final CModuleContent moduleContent = new CModuleContent(module, getProvider(), listeners, callgraph, functions, nativeCallgraph, nativeFlowgraphs, customViews, viewFunctionMap, traces, null, null);
        fail();
    } catch (final NullPointerException e) {
    }
}
Also used : IFlowgraphView(com.google.security.zynamics.binnavi.disassembly.IFlowgraphView) FilledList(com.google.security.zynamics.zylib.types.lists.FilledList) IFilledList(com.google.security.zynamics.zylib.types.lists.IFilledList) ArrayList(java.util.ArrayList) TypeInstanceContainerBackend(com.google.security.zynamics.binnavi.disassembly.types.TypeInstanceContainerBackend) Pair(com.google.security.zynamics.zylib.general.Pair) SectionContainerBackend(com.google.security.zynamics.binnavi.disassembly.types.SectionContainerBackend) CCallgraph(com.google.security.zynamics.binnavi.disassembly.CCallgraph) ICallgraphView(com.google.security.zynamics.binnavi.disassembly.ICallgraphView) INaviView(com.google.security.zynamics.binnavi.disassembly.views.INaviView) ImmutableBiMap(com.google.common.collect.ImmutableBiMap) SectionContainer(com.google.security.zynamics.binnavi.disassembly.types.SectionContainer) TraceList(com.google.security.zynamics.binnavi.debug.models.trace.TraceList) ListenerProvider(com.google.security.zynamics.zylib.general.ListenerProvider) TypeInstanceContainer(com.google.security.zynamics.binnavi.disassembly.types.TypeInstanceContainer) INaviFunction(com.google.security.zynamics.binnavi.disassembly.INaviFunction) ExpensiveBaseTest(com.google.security.zynamics.binnavi.disassembly.types.ExpensiveBaseTest) Test(org.junit.Test)

Example 3 with CCallgraph

use of com.google.security.zynamics.binnavi.disassembly.CCallgraph in project binnavi by google.

the class CModule method load.

@Override
public void load() throws CouldntLoadDataException, LoadCancelledException {
    synchronized (m_loadReporter) {
        if (isLoaded()) {
            return;
        }
        if (!isInitialized()) {
            throw new IllegalStateException("IE02617: The module is not initialized yet");
        }
        m_isLoading = true;
        try {
            if (!m_loadReporter.report(ModuleLoadEvents.Starting)) {
                throw new LoadCancelledException();
            }
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingCallgraphView)) {
                throw new LoadCancelledException();
            }
            final ICallgraphView nativeCallgraph = m_provider.loadNativeCallgraph(this);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingFlowgraphs)) {
                throw new LoadCancelledException();
            }
            // When loading views, an empty flow graph (imported function) can not
            // be distinguished
            // from an empty call graph. This leads to problems in modules without
            // functions. In
            // these cases, the empty call graph is loaded as an imported function
            // view. This is
            // obviously wrong, so we are correcting this here.
            final ImmutableList<IFlowgraphView> nativeFlowgraphs = nativeCallgraph.getNodeCount() == 0 ? new ImmutableList.Builder<IFlowgraphView>().build() : m_provider.loadNativeFlowgraphs(this);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingCallgraphViews)) {
                throw new LoadCancelledException();
            }
            final List<ICallgraphView> userCallgraphs = m_provider.loadCallgraphViews(this);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingFlowgraphViews)) {
                throw new LoadCancelledException();
            }
            final ImmutableList<IFlowgraphView> userFlowgraphs = m_provider.loadFlowgraphs(this);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingMixedViews)) {
                throw new LoadCancelledException();
            }
            final List<INaviView> userMixedGraphs = m_provider.loadMixedgraphs(this);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingCallgraph)) {
                throw new LoadCancelledException();
            }
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingFunctions)) {
                throw new LoadCancelledException();
            }
            // Note: the type manager needs to be loaded prior to functions, since a function might
            // have an associated stack frame, which in turn needs the type system.
            typeManager = new TypeManager(new TypeManagerDatabaseBackend(m_provider, this));
            final List<INaviFunction> functions = m_provider.loadFunctions(this, nativeFlowgraphs);
            final ImmutableBiMap<INaviView, INaviFunction> viewFunctionMap = m_provider.loadViewFunctionMapping(nativeFlowgraphs, functions, this);
            final CCallgraph callgraph = m_provider.loadCallgraph(this, nativeCallgraph.getConfiguration().getId(), functions);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingTraces)) {
                throw new LoadCancelledException();
            }
            final List<TraceList> traces = m_provider.loadTraces(this);
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingGlobalVariables)) {
                throw new LoadCancelledException();
            }
            final List<INaviView> customViews = new ArrayList<INaviView>();
            customViews.addAll(userCallgraphs);
            customViews.addAll(userFlowgraphs);
            customViews.addAll(userMixedGraphs);
            final List<INaviView> currentViews = new ArrayList<INaviView>(nativeFlowgraphs);
            currentViews.addAll(customViews);
            Collections.sort(currentViews, new Comparator<INaviView>() {

                @Override
                public int compare(final INaviView lhs, final INaviView rhs) {
                    return lhs.getConfiguration().getId() - rhs.getConfiguration().getId();
                }
            });
            // Map viewId to corresponding index in currentViews.
            final Map<Integer, Integer> viewIdToIndex = new HashMap<Integer, Integer>();
            for (int i = 0; i < currentViews.size(); ++i) {
                viewIdToIndex.put(currentViews.get(i).getConfiguration().getId(), i);
            }
            if (!m_loadReporter.report(ModuleLoadEvents.LoadingTypes)) {
                throw new LoadCancelledException();
            }
            final SectionContainer sections = new SectionContainer(new SectionContainerBackend(m_provider, this));
            final TypeInstanceContainer typeInstances = new TypeInstanceContainer(new TypeInstanceContainerBackend(m_provider, this, typeManager, sections), m_provider);
            m_content = new CModuleContent(this, m_provider, m_listeners, callgraph, functions, nativeCallgraph, nativeFlowgraphs, customViews, viewFunctionMap, traces, sections, typeInstances);
            typeInstances.initialize();
        } catch (final CouldntLoadDataException e) {
            m_isLoading = false;
            throw e;
        } catch (final LoadCancelledException e) {
            m_isLoading = false;
            throw e;
        } finally {
            m_loadReporter.report(ModuleLoadEvents.Finished);
        }
        for (final IModuleListener listener : m_listeners) {
            try {
                listener.loadedModule(this);
            } catch (final Exception exception) {
                CUtilityFunctions.logException(exception);
            }
        }
        m_isLoading = false;
    }
}
Also used : IFlowgraphView(com.google.security.zynamics.binnavi.disassembly.IFlowgraphView) HashMap(java.util.HashMap) CouldntLoadDataException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException) ArrayList(java.util.ArrayList) TypeInstanceContainerBackend(com.google.security.zynamics.binnavi.disassembly.types.TypeInstanceContainerBackend) SectionContainerBackend(com.google.security.zynamics.binnavi.disassembly.types.SectionContainerBackend) CCallgraph(com.google.security.zynamics.binnavi.disassembly.CCallgraph) LoadCancelledException(com.google.security.zynamics.binnavi.Database.Exceptions.LoadCancelledException) CouldntSaveDataException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntSaveDataException) CouldntLoadDataException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException) ICallgraphView(com.google.security.zynamics.binnavi.disassembly.ICallgraphView) INaviView(com.google.security.zynamics.binnavi.disassembly.views.INaviView) TypeManagerDatabaseBackend(com.google.security.zynamics.binnavi.disassembly.types.TypeManagerDatabaseBackend) SectionContainer(com.google.security.zynamics.binnavi.disassembly.types.SectionContainer) TypeManager(com.google.security.zynamics.binnavi.disassembly.types.TypeManager) TraceList(com.google.security.zynamics.binnavi.debug.models.trace.TraceList) LoadCancelledException(com.google.security.zynamics.binnavi.Database.Exceptions.LoadCancelledException) TypeInstanceContainer(com.google.security.zynamics.binnavi.disassembly.types.TypeInstanceContainer) INaviFunction(com.google.security.zynamics.binnavi.disassembly.INaviFunction)

Example 4 with CCallgraph

use of com.google.security.zynamics.binnavi.disassembly.CCallgraph in project binnavi by google.

the class CCallgraphCombiner method createCombinedCallgraph.

/**
 * Combines the call graphs of the modules of an address space.
 *
 * @param project The project where the combined view is created.
 * @param addressSpace Provides the modules whose call graphs are combined.
 *
 * @return The view that contains the combined call graph.
 */
public static INaviView createCombinedCallgraph(final INaviProject project, final INaviAddressSpace addressSpace) {
    final INaviView view = project.getContent().createView("Combined Callgraph", "");
    final Map<INaviFunction, CFunctionNode> nodeMap = new HashMap<INaviFunction, CFunctionNode>();
    final Map<INaviFunction, INaviFunction> resolvedMap = new HashMap<INaviFunction, INaviFunction>();
    final List<INaviModule> modules = addressSpace.getContent().getModules();
    // functions that are not forwarded.
    for (final INaviModule module : modules) {
        final CCallgraph callgraph = module.getContent().getNativeCallgraph();
        for (final ICallgraphNode callgraphNode : callgraph) {
            final INaviFunction function = callgraphNode.getFunction();
            final INaviFunction resolvedFunction = getResolvedFunction(function, modules);
            if (resolvedFunction == null) {
                final CFunctionNode node = view.getContent().createFunctionNode(function);
                node.setColor(CFunctionNodeColorizer.getFunctionColor(function.getType()));
                nodeMap.put(function, node);
            } else {
                resolvedMap.put(function, resolvedFunction);
            }
        }
    }
    // for the forwarded functions.
    for (final INaviModule module : modules) {
        final CCallgraph callgraph = module.getContent().getNativeCallgraph();
        for (final ICallgraphEdge callgraphEdge : callgraph.getEdges()) {
            final INaviFunction source = resolvedMap.containsKey(callgraphEdge.getSource().getFunction()) ? resolvedMap.get(callgraphEdge.getSource().getFunction()) : callgraphEdge.getSource().getFunction();
            final INaviFunction target = resolvedMap.containsKey(callgraphEdge.getTarget().getFunction()) ? resolvedMap.get(callgraphEdge.getTarget().getFunction()) : callgraphEdge.getTarget().getFunction();
            view.getContent().createEdge(nodeMap.get(source), nodeMap.get(target), EdgeType.JUMP_UNCONDITIONAL);
        }
    }
    return view;
}
Also used : ICallgraphEdge(com.google.security.zynamics.binnavi.disassembly.ICallgraphEdge) CFunctionNode(com.google.security.zynamics.binnavi.disassembly.CFunctionNode) ICallgraphNode(com.google.security.zynamics.binnavi.disassembly.ICallgraphNode) INaviView(com.google.security.zynamics.binnavi.disassembly.views.INaviView) INaviModule(com.google.security.zynamics.binnavi.disassembly.INaviModule) HashMap(java.util.HashMap) INaviFunction(com.google.security.zynamics.binnavi.disassembly.INaviFunction) CCallgraph(com.google.security.zynamics.binnavi.disassembly.CCallgraph)

Aggregations

CCallgraph (com.google.security.zynamics.binnavi.disassembly.CCallgraph)4 INaviFunction (com.google.security.zynamics.binnavi.disassembly.INaviFunction)3 INaviView (com.google.security.zynamics.binnavi.disassembly.views.INaviView)3 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3 CouldntLoadDataException (com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException)2 TraceList (com.google.security.zynamics.binnavi.debug.models.trace.TraceList)2 ICallgraphEdge (com.google.security.zynamics.binnavi.disassembly.ICallgraphEdge)2 ICallgraphView (com.google.security.zynamics.binnavi.disassembly.ICallgraphView)2 IFlowgraphView (com.google.security.zynamics.binnavi.disassembly.IFlowgraphView)2 SectionContainer (com.google.security.zynamics.binnavi.disassembly.types.SectionContainer)2 SectionContainerBackend (com.google.security.zynamics.binnavi.disassembly.types.SectionContainerBackend)2 TypeInstanceContainer (com.google.security.zynamics.binnavi.disassembly.types.TypeInstanceContainer)2 TypeInstanceContainerBackend (com.google.security.zynamics.binnavi.disassembly.types.TypeInstanceContainerBackend)2 ImmutableBiMap (com.google.common.collect.ImmutableBiMap)1 CConnection (com.google.security.zynamics.binnavi.Database.CConnection)1 CouldntSaveDataException (com.google.security.zynamics.binnavi.Database.Exceptions.CouldntSaveDataException)1 LoadCancelledException (com.google.security.zynamics.binnavi.Database.Exceptions.LoadCancelledException)1 CFunctionNode (com.google.security.zynamics.binnavi.disassembly.CFunctionNode)1 ICallgraphNode (com.google.security.zynamics.binnavi.disassembly.ICallgraphNode)1