Search in sources :

Example 6 with Register

use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Register in project binnavi by google.

the class BaseTransformer method transformLiterals.

/**
   * Transforms MNEM L1, L2, R1 to (R1 => CALC(L1, L2))
   * 
   * @param instruction The instruction in question.
   * @param incomingState The incoming state from the parents of the instruction.
   * @param generator Combines the input operand values of the instruction.
   * 
   * @return The new state of the graph node that represents the instruction.
   */
protected static ValueTrackerElement transformLiterals(final ReilInstruction instruction, final ValueTrackerElement incomingState, final IElementGenerator generator) {
    // The easiest case is handling the combination of two integer literals.
    // The result of this combination is obviously another literal.
    final ReilOperand firstOperand = instruction.getFirstOperand();
    final ReilOperand secondOperand = instruction.getSecondOperand();
    final String thirdOperand = instruction.getThirdOperand().getValue();
    // Now we can update the state of the registers after this instruction is executed.
    // The register in the output operand is updated while the values of all other
    // registers are taken from the incoming state.
    final Register resultAloc = new Register(thirdOperand);
    final IValueElement alocValue = generator.generate(getAtomicType(firstOperand), getAtomicType(secondOperand));
    assert alocValue instanceof Literal : "The combination of two literals was not a literal";
    return incomingState.update(instruction, resultAloc, alocValue);
}
Also used : IValueElement(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement) Register(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Register) Literal(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Literal) ReilOperand(com.google.security.zynamics.reil.ReilOperand)

Example 7 with Register

use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Register in project binnavi by google.

the class StrTransformer method transform.

public static ValueTrackerElement transform(final ReilInstruction instruction, final ValueTrackerElement incomingState) {
    // STR x, , y
    final ReilOperand inputOperand = instruction.getFirstOperand();
    final ReilOperand outputOperand = instruction.getThirdOperand();
    final Register outputRegister = new Register(outputOperand.getValue());
    final IValueElement previousState = getOperandValue(inputOperand, incomingState);
    if (previousState == null) {
        final IValueElement inputValue = getAtomicType(inputOperand);
        return incomingState.update(instruction, outputRegister, inputValue);
    } else {
        return incomingState.update(instruction, outputRegister, previousState.clone());
    }
}
Also used : IValueElement(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement) Register(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Register) ReilOperand(com.google.security.zynamics.reil.ReilOperand)

Aggregations

ReilOperand (com.google.security.zynamics.reil.ReilOperand)7 IValueElement (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement)7 Register (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Register)7 BitwiseAnd (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.BitwiseAnd)2 Literal (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Literal)2 Undefined (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Undefined)2 Dereference (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Dereference)1 MemoryCell (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.MemoryCell)1 BigInteger (java.math.BigInteger)1