Search in sources :

Example 1 with MemoryCell

use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.MemoryCell 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);
        }
    }
}
Also used : Undefined(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Undefined) 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) Dereference(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Dereference) MemoryCell(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.MemoryCell)

Example 2 with MemoryCell

use of com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.MemoryCell 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");
}
Also used : Undefined(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Undefined) IValueElement(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement) OperandType(com.google.security.zynamics.reil.OperandType) ReilOperand(com.google.security.zynamics.reil.ReilOperand) MemoryCell(com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.MemoryCell)

Aggregations

ReilOperand (com.google.security.zynamics.reil.ReilOperand)2 IValueElement (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.IValueElement)2 MemoryCell (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.MemoryCell)2 Undefined (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Undefined)2 OperandType (com.google.security.zynamics.reil.OperandType)1 Dereference (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Dereference)1 Register (com.google.security.zynamics.reil.algorithms.mono.valuetracking.elements.Register)1