use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement in project binnavi by google.
the class BiszTransformer method transform.
public static ValueTrackerElement transform(final ReilInstruction instruction, final ValueTrackerElement incomingState) {
final ReilOperand inputOperand = instruction.getFirstOperand();
final ReilOperand outputOperand = instruction.getThirdOperand();
final Register outputRegister = new Register(outputOperand.getValue());
final IValueElement inputValue = getOperandValue(inputOperand, incomingState);
final IValueElement outputValue = getOutputValue(inputOperand, inputValue);
return incomingState.update(instruction, outputRegister, outputValue);
}
use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement in project binnavi by google.
the class StmTransformer method transform.
public static ValueTrackerElement transform(final ReilInstruction instruction, final ValueTrackerElement state) {
// STM x, , y
final ReilOperand inputOperand = instruction.getFirstOperand();
final ReilOperand addressOperand = instruction.getThirdOperand();
final OperandType inputOperandType = inputOperand.getType();
if (inputOperandType == OperandType.INTEGER_LITERAL) {
final IValueElement previousAddressState = state.getState(addressOperand.getValue());
final IValueElement outputValue = getValue(inputOperand, previousAddressState);
if ((previousAddressState == null) || (previousAddressState instanceof Undefined)) {
final IValueElement newThirdState = getAtomicType(addressOperand);
return state.update(instruction, new MemoryCell(newThirdState), outputValue);
} else {
final IValueElement previousState2b = state.getState(new MemoryCell(previousAddressState));
if ((previousState2b == null) || (previousState2b instanceof Undefined)) {
return state.update(instruction, new MemoryCell(previousAddressState), outputValue);
} else {
return state.update(instruction, new MemoryCell(previousState2b), outputValue);
}
}
} else if (inputOperandType == OperandType.REGISTER) {
final IValueElement newThirdState = getAtomicType(addressOperand);
final IValueElement previousStateInput = state.getState(inputOperand.getValue());
final IValueElement previousState2 = getOperandValue(addressOperand, state);
if ((previousStateInput == null) && (previousState2 == null)) {
return state.update(instruction, new MemoryCell(newThirdState), getAtomicType(inputOperand));
} else if ((previousStateInput == null) && (previousState2 != null)) {
final IValueElement previousState2b = state.getState(new MemoryCell(previousState2));
if (previousState2b == null) {
return state.update(instruction, new MemoryCell(previousState2), getAtomicType(inputOperand));
} else {
return state.update(instruction, new MemoryCell(previousState2b), getAtomicType(inputOperand));
}
} else if ((previousStateInput != null) && (previousState2 == null)) {
return state.update(instruction, new MemoryCell(newThirdState), previousStateInput);
} else if (previousState2 instanceof Undefined) {
return state.update(instruction, new MemoryCell(newThirdState), new Undefined());
} else {
final IValueElement previousState2b = state.getState(new MemoryCell(previousState2));
if ((previousState2b == null) || (previousState2b instanceof Undefined)) {
return state.update(instruction, new MemoryCell(previousState2), previousStateInput);
} else {
return state.update(instruction, new MemoryCell(previousState2b), previousStateInput);
}
}
}
throw new IllegalStateException("Not yet implemented");
}
use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement in project binnavi by google.
the class BaseTransformer method transformRegisterLiteral.
/**
* Transforms MNEM R1, L1, R2 to (R2 => COMBINE(R1, L1))
*
* @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 transformRegisterLiteral(final ReilInstruction instruction, final ValueTrackerElement incomingState, final IElementGenerator generator) {
// Combine a register to a literal. This means we have to look up the state of the input
// register
// in the incoming state.
final boolean registerFirst = inputOperandsAreRegisterLiteral(instruction);
final ReilOperand registerOperand = registerFirst ? instruction.getFirstOperand() : instruction.getSecondOperand();
final ReilOperand literalOperand = registerFirst ? instruction.getSecondOperand() : instruction.getFirstOperand();
final ReilOperand outputOperand = instruction.getThirdOperand();
final IValueElement previousState = incomingState.getState(registerOperand.getValue());
final IValueElement result = getOutputValue(registerOperand, previousState, literalOperand, null, generator);
if (previousState instanceof BitwiseAnd) {
return AndSimplifier.simplifyAnd(instruction, registerOperand, literalOperand, (BitwiseAnd) previousState, incomingState, generator);
} else {
return incomingState.update(instruction, new Register(outputOperand.getValue()), result);
}
}
use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement in project binnavi by google.
the class LdmTransformer method transform.
public static ValueTrackerElement transform(final ReilInstruction instruction, final ValueTrackerElement incomingState) {
final ReilOperand memoryAddressOperand = instruction.getFirstOperand();
final ReilOperand outputOperand = instruction.getThirdOperand();
final Register outputRegister = new Register(outputOperand.getValue());
final IValueElement memoryAddress = getOperandValue(memoryAddressOperand, incomingState);
if ((memoryAddress == null) || (memoryAddress instanceof Undefined)) {
final IValueElement memoryAddressValue = getAtomicType(memoryAddressOperand);
final Dereference dereference = new Dereference(memoryAddressValue);
return incomingState.update(instruction, outputRegister, dereference);
} else {
final IValueElement previousState2 = incomingState.getState(new MemoryCell(memoryAddress));
if (previousState2 == null) {
return incomingState.update(instruction, outputRegister, new Dereference(memoryAddress));
} else {
return incomingState.update(instruction, outputRegister, previousState2);
}
}
}
use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement in project binnavi by google.
the class StateCombiner method combine.
private static ValueTrackerElement combine(final ValueTrackerElement state1, final ValueTrackerElement state2) {
final Map<IAloc, IValueElement> values1 = state1.getStates();
final Map<IAloc, IValueElement> values2 = state2.getStates();
final Map<IAloc, IValueElement> combinedState = new HashMap<IAloc, IValueElement>();
final Set<ReilInstruction> combinedInfluences = state1.getInfluences();
combinedInfluences.addAll(state2.getInfluences());
final Map<String, Set<IAddress>> combinedWritten = new HashMap<String, Set<IAddress>>();
combinedWritten.putAll(state1.getLastWritten());
for (final Map.Entry<String, Set<IAddress>> lastWritten : state2.getLastWritten().entrySet()) {
if (combinedWritten.containsKey(lastWritten.getKey())) {
combinedWritten.get(lastWritten.getKey()).addAll(lastWritten.getValue());
} else {
combinedWritten.put(lastWritten.getKey(), new HashSet<IAddress>(lastWritten.getValue()));
}
}
for (final Map.Entry<IAloc, IValueElement> entry : values1.entrySet()) {
final IAloc aloc = entry.getKey();
if (values2.containsKey(aloc)) {
final IValueElement lhs = entry.getValue();
final IValueElement rhs = values2.get(aloc);
combinedState.put(aloc, combine(lhs, rhs));
} else {
combinedState.put(aloc, new Undefined());
}
}
for (final Map.Entry<IAloc, IValueElement> entry : values2.entrySet()) {
final IAloc aloc = entry.getKey();
if (!values1.containsKey(aloc)) {
combinedState.put(aloc, new Undefined());
}
}
if ((combinedState.size() < state1.getStates().size()) || (combinedState.size() < state2.getStates().size())) {
throw new IllegalStateException();
}
return new ValueTrackerElement(combinedInfluences, combinedState, combinedWritten);
}
Aggregations