Search in sources :

Example 31 with IOperandTreeNode

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

the class XorDotTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "xor.");
    final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    final IOperandTreeNode registerOperand2 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
    XorGenerator.generate(instruction.getAddress().toLong() * 0x100, environment, instruction, instructions, "xor.", registerOperand2.getValue(), registerOperand1.getValue(), true, false, false, false);
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)

Example 32 with IOperandTreeNode

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

the class XorisTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "xoris");
    final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    final IOperandTreeNode literalOperand1 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
    long baseOffset = instruction.getAddress().toLong() * 0x100;
    final String tmpLiteralValue = environment.getNextVariableString();
    instructions.add(ReilHelpers.createStr(baseOffset++, OperandSize.DWORD, String.valueOf(Long.valueOf(literalOperand1.getValue()) << 16), OperandSize.DWORD, tmpLiteralValue));
    XorGenerator.generate(baseOffset, environment, instruction, instructions, "xoris", registerOperand1.getValue(), tmpLiteralValue, false, false, false, false);
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)

Example 33 with IOperandTreeNode

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

the class SubGenerator method generate.

public static void generate(long baseOffset, final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions, final String mnemonic, final String firstOperand, final String secondOperand, final boolean setCr, final boolean setOverflow, final boolean setCarry, final boolean isExtended) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, mnemonic);
    final IOperandTreeNode registerOperand1 = instruction.getOperands().get(0).getRootNode().getChildren().get(0);
    final String targetRegister = registerOperand1.getValue();
    final String extendedSubResult = environment.getNextVariableString();
    final String twoComplementfirstOperand = environment.getNextVariableString();
    final String tmpResult = environment.getNextVariableString();
    final String tmpVar3 = setOverflow ? environment.getNextVariableString() : null;
    final String tmpVar4 = setOverflow ? environment.getNextVariableString() : null;
    final String overflowTmp = setOverflow ? environment.getNextVariableString() : null;
    final String msbVara = setOverflow ? environment.getNextVariableString() : null;
    final String msbVarb = setOverflow ? environment.getNextVariableString() : null;
    final String msbVarr = setOverflow ? environment.getNextVariableString() : null;
    final String crTemp = setCr ? environment.getNextVariableString() : null;
    // perform actual subtraction in the 2's complement !rA + rB + 1
    instructions.add(ReilHelpers.createXor(baseOffset++, OperandSize.DWORD, firstOperand, OperandSize.DWORD, "4294967295", OperandSize.DWORD, twoComplementfirstOperand));
    instructions.add(ReilHelpers.createAdd(baseOffset++, OperandSize.DWORD, twoComplementfirstOperand, OperandSize.DWORD, secondOperand, OperandSize.QWORD, tmpResult));
    // extended subtraction does !rA + rB + XER[CA] rather then !rA + rB + 1
    if (isExtended) {
        instructions.add(ReilHelpers.createAdd(baseOffset++, OperandSize.QWORD, tmpResult, OperandSize.BYTE, Helpers.XER_CARRY_BIT, OperandSize.QWORD, extendedSubResult));
    } else {
        instructions.add(ReilHelpers.createAdd(baseOffset++, OperandSize.QWORD, tmpResult, OperandSize.BYTE, "1", OperandSize.QWORD, extendedSubResult));
    }
    // reduce to register size
    instructions.add(ReilHelpers.createAnd(baseOffset++, OperandSize.QWORD, extendedSubResult, OperandSize.DWORD, "4294967295", OperandSize.DWORD, targetRegister));
    if (setOverflow) {
        // Isolate summands msb's
        instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, firstOperand, OperandSize.WORD, "-31", OperandSize.DWORD, msbVara));
        instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, secondOperand, OperandSize.WORD, "-31", OperandSize.DWORD, msbVarb));
        // Isolate MSB(Result)
        instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, targetRegister, OperandSize.WORD, "-31", OperandSize.DWORD, msbVarr));
        // perform overflow calculation ( msbA XOR msbB ) AND ( msbB XOR msbR ) == OF
        instructions.add(ReilHelpers.createXor(baseOffset++, OperandSize.DWORD, msbVara, OperandSize.DWORD, msbVarb, OperandSize.DWORD, tmpVar4));
        instructions.add(ReilHelpers.createXor(baseOffset++, OperandSize.DWORD, msbVarb, OperandSize.DWORD, msbVarr, OperandSize.DWORD, tmpVar3));
        instructions.add(ReilHelpers.createAnd(baseOffset++, OperandSize.DWORD, tmpVar4, OperandSize.DWORD, tmpVar3, OperandSize.DWORD, overflowTmp));
        // set XER register bits according to the current register state and overflow calculation
        instructions.add(ReilHelpers.createStr(baseOffset++, OperandSize.DWORD, overflowTmp, OperandSize.WORD, Helpers.XER_OVERFLOW));
        instructions.add(ReilHelpers.createOr(baseOffset++, OperandSize.WORD, Helpers.XER_SUMMARY_OVERFLOW, OperandSize.DWORD, overflowTmp, OperandSize.WORD, Helpers.XER_SUMMARY_OVERFLOW));
    }
    if (setCarry) {
        // isolate the carry bit
        instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.QWORD, extendedSubResult, OperandSize.DWORD, "-32", OperandSize.WORD, Helpers.XER_CARRY_BIT));
    }
    if (setCr) {
        // EQ CR0
        instructions.add(ReilHelpers.createBisz(baseOffset++, OperandSize.DWORD, targetRegister, OperandSize.BYTE, Helpers.CR0_EQUAL));
        // LT CR0
        instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, targetRegister, OperandSize.WORD, "-31", OperandSize.BYTE, Helpers.CR0_LESS_THEN));
        // GT CR0
        instructions.add(ReilHelpers.createOr(baseOffset++, OperandSize.BYTE, Helpers.CR0_EQUAL, OperandSize.BYTE, Helpers.CR0_LESS_THEN, OperandSize.BYTE, crTemp));
        instructions.add(ReilHelpers.createBisz(baseOffset++, OperandSize.BYTE, crTemp, OperandSize.BYTE, Helpers.CR0_GREATER_THEN));
        // SO CR0
        instructions.add(ReilHelpers.createStr(baseOffset, OperandSize.BYTE, Helpers.XER_SUMMARY_OVERFLOW, OperandSize.BYTE, Helpers.CRO_SUMMARY_OVERFLOW));
    }
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)

Example 34 with IOperandTreeNode

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

the class SubfcDotTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "subfc.");
    final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    final IOperandTreeNode registerOperand2 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
    SubGenerator.generate(instruction.getAddress().toLong() * 0x100, environment, instruction, instructions, "subfc.", registerOperand1.getValue(), registerOperand2.getValue(), true, false, true, false);
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)

Example 35 with IOperandTreeNode

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

the class SubfeDotTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "subfe.");
    final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    final IOperandTreeNode registerOperand2 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
    SubGenerator.generate(instruction.getAddress().toLong() * 0x100, environment, instruction, instructions, "subfe.", registerOperand1.getValue(), registerOperand2.getValue(), true, false, true, true);
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)

Aggregations

IOperandTreeNode (com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)518 OperandSize (com.google.security.zynamics.reil.OperandSize)257 BigInteger (java.math.BigInteger)5 INaviFunction (com.google.security.zynamics.binnavi.disassembly.INaviFunction)3 InternalTranslationException (com.google.security.zynamics.reil.translators.InternalTranslationException)2 IAddress (com.google.security.zynamics.zylib.disassembly.IAddress)2 IReference (com.google.security.zynamics.zylib.disassembly.IReference)2 INaviInstruction (com.google.security.zynamics.binnavi.disassembly.INaviInstruction)1 INaviModule (com.google.security.zynamics.binnavi.disassembly.INaviModule)1 ExpensiveBaseTest (com.google.security.zynamics.binnavi.disassembly.types.ExpensiveBaseTest)1 INaviView (com.google.security.zynamics.binnavi.disassembly.views.INaviView)1 ReilOperandNode (com.google.security.zynamics.reil.ReilOperandNode)1 TranslationResult (com.google.security.zynamics.reil.translators.TranslationResult)1 IInstruction (com.google.security.zynamics.zylib.disassembly.IInstruction)1 ArrayList (java.util.ArrayList)1 Test (org.junit.Test)1