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);
}
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());
}
}
Aggregations