Search in sources :

Example 6 with Pair

use of com.google.security.zynamics.zylib.general.Pair in project binnavi by google.

the class CDatabaseConnection method connect.

public static Pair<CConnection, SQLProvider> connect(final CDatabaseConfiguration m_databaseConfiguration, final IDatabaseLoadProgressReporter<LoadEvents> reporter) throws CouldntLoadDriverException, CouldntConnectException, CouldntInitializeDatabaseException, InvalidDatabaseException, InvalidExporterDatabaseFormatException, LoadCancelledException {
    try {
        reportProgress(reporter, LoadEvents.CONNECTING_TO_DATABASE);
        final CConnection connection = new CConnection(m_databaseConfiguration);
        final AbstractSQLProvider sql = new PostgreSQLProvider(connection);
        reportProgress(reporter, LoadEvents.CHECKING_EXPORTER_TABLE_FORMAT);
        if (!sql.isExporterDatabaseFormatValid()) {
            throw new InvalidExporterDatabaseFormatException("E00202: Database exporter format is not compatible with " + Constants.PROJECT_NAME_VERSION);
        }
        reportProgress(reporter, LoadEvents.CHECKING_INITIALIZATION_STATUS);
        final DatabaseVersion databaseVersion = sql.getDatabaseVersion();
        final DatabaseVersion currentVersion = new DatabaseVersion(Constants.PROJECT_VERSION);
        if ((databaseVersion.compareTo(currentVersion) == 0) && !sql.isInitialized()) {
            reportProgress(reporter, LoadEvents.INITIALIZING_DATABASE_TABLES);
            sql.initializeDatabase();
        }
        if ((databaseVersion.compareTo(currentVersion) == 0) && !sql.isInitialized()) {
            throw new CouldntInitializeDatabaseException("E00052: Database could not be initialized.");
        }
        return new Pair<CConnection, SQLProvider>(connection, sql);
    } catch (final CouldntLoadDataException e) {
        throw new CouldntConnectException(e, 0, "");
    } catch (final SQLException e) {
        throw new CouldntConnectException(e, e.getErrorCode(), e.getSQLState());
    }
}
Also used : SQLException(java.sql.SQLException) CouldntLoadDataException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException) CouldntInitializeDatabaseException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntInitializeDatabaseException) CouldntConnectException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntConnectException) InvalidExporterDatabaseFormatException(com.google.security.zynamics.binnavi.Database.Exceptions.InvalidExporterDatabaseFormatException) Pair(com.google.security.zynamics.zylib.general.Pair)

Example 7 with Pair

use of com.google.security.zynamics.zylib.general.Pair in project binnavi by google.

the class PostgreSQLNodeSaver method saveCodeNodes.

/**
 * Saves the code nodes to the database.
 *
 * @param provider The connection to the database.
 * @param nodes The nodes to save.
 * @param firstNode The database index of the first node.
 * @param codeNodeIndices Index into the nodes list that identifies the code nodes.
 *
 * @throws SQLException Thrown if saving the code node instructions failed.
 */
protected static void saveCodeNodes(final SQLProvider provider, final List<INaviViewNode> nodes, final int firstNode, final List<Integer> codeNodeIndices) throws SQLException {
    if (!codeNodeIndices.isEmpty()) {
        final List<Pair<INaviCodeNode, INaviInstruction>> instructionsWithUnsavedLocalComments = PostgreSQLNodeSaver.saveCodeNodeInstructions(provider, nodes, firstNode, codeNodeIndices);
        final String query = "INSERT INTO " + CTableNames.CODE_NODES_TABLE + "(module_id, node_id, parent_function, comment_id) VALUES (?, ?, ?, ?)";
        final ArrayList<INaviCodeNode> codeNodesWithUnsavedComments = new ArrayList<INaviCodeNode>();
        final PreparedStatement preparedStatement = provider.getConnection().getConnection().prepareStatement(query);
        try {
            for (final int index : codeNodeIndices) {
                final INaviCodeNode codeNode = (INaviCodeNode) nodes.get(index);
                codeNode.setId(firstNode + index);
                INaviFunction function = null;
                try {
                    function = codeNode.getParentFunction();
                } catch (final MaybeNullException e) {
                }
                final int moduleId = Iterables.getLast(codeNode.getInstructions()).getModule().getConfiguration().getId();
                final List<IComment> comment = codeNode.getComments().getLocalCodeNodeComment();
                final Integer commentId = comment == null ? null : comment.size() == 0 ? null : Iterables.getLast(comment).getId();
                if ((comment != null) && (comment.size() != 0) && (commentId == null)) {
                    codeNodesWithUnsavedComments.add(codeNode);
                }
                preparedStatement.setInt(1, moduleId);
                preparedStatement.setInt(2, firstNode + index);
                if (function == null) {
                    preparedStatement.setNull(3, Types.BIGINT);
                } else {
                    preparedStatement.setObject(3, function.getAddress().toBigInteger(), Types.BIGINT);
                }
                if (commentId == null) {
                    preparedStatement.setNull(4, Types.INTEGER);
                } else {
                    preparedStatement.setInt(4, commentId);
                }
                preparedStatement.addBatch();
            }
            preparedStatement.executeBatch();
        } finally {
            preparedStatement.close();
        }
        // implementation.
        for (final INaviCodeNode codeNode : codeNodesWithUnsavedComments) {
            final ArrayList<IComment> codeNodecomments = new ArrayList<IComment>();
            for (final IComment comment : codeNode.getComments().getLocalCodeNodeComment()) {
                try {
                    final Integer commentId = PostgreSQLNodeFunctions.appendLocalCodeNodeComment(provider, codeNode, comment.getComment(), comment.getUser().getUserId());
                    final IComment newComment = new CComment(commentId, comment.getUser(), comment.getParent(), comment.getComment());
                    codeNodecomments.add(newComment);
                } catch (final CouldntSaveDataException exception) {
                    CUtilityFunctions.logException(exception);
                }
            }
            codeNode.getComments().initializeLocalCodeNodeComment(codeNodecomments);
        }
        // implementation.
        for (final Pair<INaviCodeNode, INaviInstruction> pair : instructionsWithUnsavedLocalComments) {
            final ArrayList<IComment> localInstructionComments = new ArrayList<IComment>();
            for (final IComment comment : pair.first().getComments().getLocalInstructionComment(pair.second())) {
                try {
                    final int commentId = PostgreSQLInstructionFunctions.appendLocalInstructionComment(provider, pair.first(), pair.second(), comment.getComment(), comment.getUser().getUserId());
                    final IComment newComment = new CComment(commentId, comment.getUser(), comment.getParent(), comment.getComment());
                    localInstructionComments.add(newComment);
                } catch (final CouldntSaveDataException exception) {
                    CUtilityFunctions.logException(exception);
                }
            }
            pair.first().getComments().initializeLocalInstructionComment(pair.second(), localInstructionComments);
        }
    }
}
Also used : IComment(com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.Interfaces.IComment) MaybeNullException(com.google.security.zynamics.binnavi.Exceptions.MaybeNullException) CouldntSaveDataException(com.google.security.zynamics.binnavi.Database.Exceptions.CouldntSaveDataException) ArrayList(java.util.ArrayList) PreparedStatement(java.sql.PreparedStatement) CComment(com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.CComment) INaviCodeNode(com.google.security.zynamics.binnavi.disassembly.INaviCodeNode) INaviFunction(com.google.security.zynamics.binnavi.disassembly.INaviFunction) Pair(com.google.security.zynamics.zylib.general.Pair) INaviInstruction(com.google.security.zynamics.binnavi.disassembly.INaviInstruction)

Example 8 with Pair

use of com.google.security.zynamics.zylib.general.Pair in project binnavi by google.

the class PostgreSQLNodeSaver method saveCodeNodeInstructions.

/**
 * Saves the mapping between code nodes and their instructions to the database.
 *
 * @param provider The provider used to access the database.
 * @param nodes The nodes to save.
 * @param firstNode The database index of the first node.
 * @param codeNodeIndices Index into the nodes list that identifies the code nodes.
 *
 * @throws SQLException Thrown if saving the code node instructions failed.
 */
protected static ArrayList<Pair<INaviCodeNode, INaviInstruction>> saveCodeNodeInstructions(final SQLProvider provider, final List<INaviViewNode> nodes, final int firstNode, final List<Integer> codeNodeIndices) throws SQLException {
    if (!nodes.isEmpty()) {
        final Set<INaviInstruction> unsavedInstructions = new HashSet<INaviInstruction>();
        for (final int index : codeNodeIndices) {
            final CCodeNode node = (CCodeNode) nodes.get(index);
            final Iterable<INaviInstruction> instructions = node.getInstructions();
            for (final INaviInstruction instruction : instructions) {
                if (!(instruction.isStored())) {
                    unsavedInstructions.add(instruction);
                }
            }
        }
        PostgreSQLInstructionFunctions.createInstructions(provider, unsavedInstructions);
        final String query = "INSERT INTO " + CTableNames.CODENODE_INSTRUCTIONS_TABLE + " (module_id, node_id, position, address, comment_id) VALUES (?, ?, ?, ?, ?)";
        final PreparedStatement preparedStatement = provider.getConnection().getConnection().prepareStatement(query);
        final ArrayList<Pair<INaviCodeNode, INaviInstruction>> instructionsWithUnsavedLocalComments = new ArrayList<Pair<INaviCodeNode, INaviInstruction>>();
        try {
            for (final Integer index : codeNodeIndices) {
                final INaviCodeNode codeNode = (INaviCodeNode) nodes.get(index);
                int position = 0;
                for (final INaviInstruction instruction : codeNode.getInstructions()) {
                    final List<IComment> comments = codeNode.getComments().getLocalInstructionComment(instruction);
                    final Integer commentId = comments == null ? null : comments.size() == 0 ? null : Iterables.getLast(comments).getId();
                    if ((comments != null) && (comments.size() != 0) && (commentId == null)) {
                        instructionsWithUnsavedLocalComments.add(new Pair<INaviCodeNode, INaviInstruction>(codeNode, instruction));
                    }
                    final int moduleId = instruction.getModule().getConfiguration().getId();
                    preparedStatement.setInt(1, moduleId);
                    preparedStatement.setInt(2, firstNode + index);
                    preparedStatement.setInt(3, position);
                    preparedStatement.setObject(4, instruction.getAddress().toBigInteger(), Types.BIGINT);
                    if (commentId == null) {
                        preparedStatement.setNull(5, Types.INTEGER);
                    } else {
                        preparedStatement.setInt(5, commentId);
                    }
                    position++;
                    preparedStatement.addBatch();
                }
            }
            preparedStatement.executeBatch();
        } finally {
            preparedStatement.close();
        }
        return instructionsWithUnsavedLocalComments;
    }
    return null;
}
Also used : IComment(com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.Interfaces.IComment) ArrayList(java.util.ArrayList) PreparedStatement(java.sql.PreparedStatement) INaviCodeNode(com.google.security.zynamics.binnavi.disassembly.INaviCodeNode) CCodeNode(com.google.security.zynamics.binnavi.disassembly.CCodeNode) INaviInstruction(com.google.security.zynamics.binnavi.disassembly.INaviInstruction) HashSet(java.util.HashSet) Pair(com.google.security.zynamics.zylib.general.Pair)

Example 9 with Pair

use of com.google.security.zynamics.zylib.general.Pair in project binnavi by google.

the class CWindowFunctions method showAboutDialog.

/**
 * Shows the BinNavi About dialog.
 *
 * @param parent Parent window used for dialogs.
 */
public static void showAboutDialog(final JFrame parent) {
    try {
        final List<Pair<String, URL>> urls = new ArrayList<>();
        urls.add(new Pair<>("zynamics Website", new URL("http://www.zynamics.com")));
        urls.add(new Pair<>("BinNavi Product Site", new URL("http://www.zynamics.com/binnavi.html")));
        urls.add(new Pair<>("Report Bugs", new URL("mailto:zynamics-support@google.com")));
        final String message = Constants.PROJECT_NAME_VERSION_BUILD + "\n\nCopyright \u00a92004-2011 zynamics GmbH.\nCopyright \u00a92011-2016 Google Inc.\n";
        final String description = "\nParts of this software were created by third parties and have different licensing " + "requirements.\nPlease see the manual file for a complete list.\n";
        final Image appImage = new ImageIcon(CMain.class.getResource("data/binnavi_logo3_border.png")).getImage();
        final CDialogAboutEx dlg = new CDialogAboutEx(parent, new ImageIcon(appImage), Constants.PROJECT_NAME_VERSION, message, description, urls);
        GuiHelper.centerOnScreen(dlg);
        dlg.setVisible(true);
    } catch (final Exception e) {
        CUtilityFunctions.logException(e);
    }
}
Also used : ImageIcon(javax.swing.ImageIcon) CDialogAboutEx(com.google.security.zynamics.zylib.gui.CDialogAboutEx) ArrayList(java.util.ArrayList) Image(java.awt.Image) URL(java.net.URL) Pair(com.google.security.zynamics.zylib.general.Pair)

Example 10 with Pair

use of com.google.security.zynamics.zylib.general.Pair in project binnavi by google.

the class COperandsDeterminer method getRegisters.

/**
 * Returns the registers read and written by a native instruction.
 *
 * @param instruction The instruction whose accessed registers are returned.
 *
 * @return The read and written registers of the instruction.
 *
 * @throws InternalTranslationException Thrown if the instruction could not be translated to REIL.
 */
public static Pair<Set<String>, Set<String>> getRegisters(final INaviInstruction instruction) throws InternalTranslationException {
    final Set<String> inSet = new HashSet<String>();
    final Set<String> outSet = new HashSet<String>();
    final ReilTranslator<INaviInstruction> translator = new ReilTranslator<INaviInstruction>();
    final DirectedGraph<ReilBlock, ReilEdge> reilCode = translator.translate(new StandardEnvironment(), instruction);
    final boolean translatingReil = instruction.getArchitecture().equals("REIL");
    for (final ReilBlock reilBlock : reilCode) {
        for (final ReilInstruction reilInstruction : reilBlock) {
            if (writesThirdOperand(reilInstruction, translatingReil)) {
                outSet.add(reilInstruction.getThirdOperand().getValue());
            }
            if (!writesThirdOperand(reilInstruction, translatingReil) && isRegister(reilInstruction.getThirdOperand(), translatingReil)) {
                // JCC + STM
                inSet.add(reilInstruction.getThirdOperand().getValue());
            }
            if (isRegister(reilInstruction.getFirstOperand(), translatingReil)) {
                inSet.add(reilInstruction.getFirstOperand().getValue());
            }
            if (isRegister(reilInstruction.getSecondOperand(), translatingReil)) {
                inSet.add(reilInstruction.getSecondOperand().getValue());
            }
        }
    }
    return new Pair<Set<String>, Set<String>>(inSet, outSet);
}
Also used : ReilInstruction(com.google.security.zynamics.reil.ReilInstruction) ReilEdge(com.google.security.zynamics.reil.ReilEdge) ReilBlock(com.google.security.zynamics.reil.ReilBlock) ReilTranslator(com.google.security.zynamics.reil.translators.ReilTranslator) HashSet(java.util.HashSet) INaviInstruction(com.google.security.zynamics.binnavi.disassembly.INaviInstruction) StandardEnvironment(com.google.security.zynamics.reil.translators.StandardEnvironment) Pair(com.google.security.zynamics.zylib.general.Pair)

Aggregations

Pair (com.google.security.zynamics.zylib.general.Pair)55 ArrayList (java.util.ArrayList)26 IComment (com.google.security.zynamics.binnavi.Gui.GraphWindows.CommentDialogs.Interfaces.IComment)7 RelocatedAddress (com.google.security.zynamics.binnavi.disassembly.RelocatedAddress)7 INaviInstruction (com.google.security.zynamics.binnavi.disassembly.INaviInstruction)6 INaviModule (com.google.security.zynamics.binnavi.disassembly.INaviModule)6 CAddress (com.google.security.zynamics.zylib.disassembly.CAddress)6 IAddress (com.google.security.zynamics.zylib.disassembly.IAddress)6 IDebugger (com.google.security.zynamics.binnavi.debug.debugger.interfaces.IDebugger)4 INaviFunction (com.google.security.zynamics.binnavi.disassembly.INaviFunction)4 Test (org.junit.Test)4 CouldntLoadDataException (com.google.security.zynamics.binnavi.Database.Exceptions.CouldntLoadDataException)3 Breakpoint (com.google.security.zynamics.binnavi.debug.models.breakpoints.Breakpoint)3 BreakpointAddress (com.google.security.zynamics.binnavi.debug.models.breakpoints.BreakpointAddress)3 MemoryModule (com.google.security.zynamics.binnavi.debug.models.processmanager.MemoryModule)3 INaviCodeNode (com.google.security.zynamics.binnavi.disassembly.INaviCodeNode)3 ReilBlock (com.google.security.zynamics.reil.ReilBlock)3 ReilInstruction (com.google.security.zynamics.reil.ReilInstruction)3 BigInteger (java.math.BigInteger)3 HashSet (java.util.HashSet)3