use of com.google.security.zynamics.reil.ReilOperand in project binnavi by google.
the class RegisterTrackingTransformationProvider method transformStm.
@Override
protected Pair<RegisterSetLatticeElement, RegisterSetLatticeElement> transformStm(final ReilInstruction ins, final RegisterSetLatticeElement state) {
final ReilOperand op1 = ins.getFirstOperand();
if (op1.getType().equals(OperandType.REGISTER)) {
if (state.isTainted(op1.getValue())) {
final RegisterSetLatticeElement newState = state.copy();
newState.addReadReg(op1.getValue());
return new Pair<RegisterSetLatticeElement, RegisterSetLatticeElement>(newState, null);
}
}
return new Pair<RegisterSetLatticeElement, RegisterSetLatticeElement>(state, null);
}
use of com.google.security.zynamics.reil.ReilOperand 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.ReilOperand 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