use of com.google.security.zynamics.reil.translators.TranslationResult in project binnavi by google.
the class ImulTranslator method translate_3.
private void translate_3(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
final List<? extends IOperandTree> operands = instruction.getOperands();
final long baseOffset = instruction.getAddress().toLong() * 0x100;
long offset = baseOffset;
// Load source operand.
final TranslationResult firstResult = Helpers.translateOperand(environment, offset, operands.get(1), true);
instructions.addAll(firstResult.getInstructions());
offset = baseOffset + instructions.size();
// Load second operand.
final TranslationResult secondResult = Helpers.translateOperand(environment, offset, operands.get(2), true);
instructions.addAll(secondResult.getInstructions());
offset = baseOffset + instructions.size();
// Load target operand.
final TranslationResult targetResult = Helpers.translateOperand(environment, offset, operands.get(0), true);
instructions.addAll(targetResult.getInstructions());
offset = baseOffset + instructions.size();
// IMUL instructions with 2 or 3 operands must have an output register
final OperandSize resultSize = OperandSize.sizeStringToValue(operands.get(0).getRootNode().getValue());
final String resultRegister = operands.get(0).getRootNode().getChildren().get(0).getValue();
generateImul3(environment, offset, resultSize, resultRegister, firstResult.getSize(), firstResult.getRegister(), secondResult.getSize(), secondResult.getRegister(), instructions);
}
use of com.google.security.zynamics.reil.translators.TranslationResult in project binnavi by google.
the class IncTranslator method translate.
/**
* Translates an INC instruction to REIL code.
*
* @param environment A valid translation environment.
* @param instruction The INC instruction to translate.
* @param instructions The generated REIL code will be added to this list
*
* @throws InternalTranslationException if any of the arguments are null the passed instruction is
* not an INC instruction
*/
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "inc");
if (instruction.getOperands().size() != 1) {
throw new InternalTranslationException("Error: Argument instruction is not an inc instruction (invalid number of operands)");
}
final long baseOffset = instruction.getAddress().toLong() * 0x100;
long offset = baseOffset;
// INC instructions have exactly one operand.
final IOperandTree operand = instruction.getOperands().get(0);
// Load the operand.
final TranslationResult result = Helpers.translateOperand(environment, offset, operand, true);
instructions.addAll(result.getInstructions());
// Adjust the offset of the next REIL instruction.
offset = baseOffset + instructions.size();
final String loadedRegister = result.getRegister();
final OperandSize registerSize = result.getSize();
final OperandSize nextSize = TranslationHelpers.getNextSize(registerSize);
final String msbMask = String.valueOf(TranslationHelpers.getMsbMask(registerSize));
final String shiftMsbLsbMask = String.valueOf(TranslationHelpers.getShiftMsbLsbMask(registerSize));
final String truncMask = String.valueOf(TranslationHelpers.getAllBitsMask(registerSize));
final String maskedMsb = environment.getNextVariableString();
final String addResult = environment.getNextVariableString();
final String maskedMsbResult = environment.getNextVariableString();
final String maskedMsbNeg = environment.getNextVariableString();
final String tempOF = environment.getNextVariableString();
final String truncatedResult = environment.getNextVariableString();
// Isolate the MSB of the operand
instructions.add(ReilHelpers.createAnd(offset, registerSize, loadedRegister, registerSize, msbMask, registerSize, maskedMsb));
// Increment the value
instructions.add(ReilHelpers.createAdd(offset + 1, registerSize, loadedRegister, registerSize, "1", nextSize, addResult));
// Isolate the MSB of the result and put it into the Sign Flag
instructions.add(ReilHelpers.createAnd(offset + 2, nextSize, addResult, registerSize, msbMask, registerSize, maskedMsbResult));
instructions.add(ReilHelpers.createBsh(offset + 3, registerSize, maskedMsbResult, registerSize, shiftMsbLsbMask, OperandSize.BYTE, Helpers.SIGN_FLAG));
// The OF is only set if the result of the inc operation is 0x80
// OF = ( MSB(old) == 0 ) AND ( MSB(new) == 1 )
// OF = NOT(MSB(old)) AND MSB(new)
instructions.add(ReilHelpers.createXor(offset + 4, registerSize, maskedMsb, registerSize, msbMask, registerSize, maskedMsbNeg));
instructions.add(ReilHelpers.createAnd(offset + 5, registerSize, maskedMsbResult, registerSize, maskedMsbNeg, registerSize, tempOF));
// Write the result into the Overflow Flag
instructions.add(ReilHelpers.createBsh(offset + 6, registerSize, tempOF, registerSize, shiftMsbLsbMask, OperandSize.BYTE, Helpers.OVERFLOW_FLAG));
// Truncate the result to fit into the target
instructions.add(ReilHelpers.createAnd(offset + 7, nextSize, addResult, registerSize, truncMask, registerSize, truncatedResult));
// Update the Zero Flag
instructions.add(ReilHelpers.createBisz(offset + 8, registerSize, truncatedResult, OperandSize.BYTE, Helpers.ZERO_FLAG));
// Write the truncated result back into the operand
Helpers.writeBack(environment, offset + 9, operand, truncatedResult, registerSize, result.getAddress(), result.getType(), instructions);
}
use of com.google.security.zynamics.reil.translators.TranslationResult in project binnavi by google.
the class JmpTranslator method translate.
/**
* Translates a JMP instruction to REIL code.
*
* @param environment A valid translation environment.
* @param instruction The JMP instruction to translate.
* @param instructions The generated REIL code will be added to this list
*
* @throws InternalTranslationException if any of the arguments are null the passed instruction is
* not a JMP instruction
*/
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "jmp");
if (instruction.getOperands().size() != 1) {
throw new InternalTranslationException("Error: Argument instruction is not a jmp instruction (invalid number of operands)");
}
final long baseOffset = instruction.getAddress().toLong() * 0x100;
long offset = baseOffset;
// JMP instructions have exactly one operand.
final IOperandTree operand = instruction.getOperands().get(0);
// Load the operand.
final TranslationResult result = Helpers.translateOperand(environment, offset, operand, true);
instructions.addAll(result.getInstructions());
final String jumpTarget = result.getRegister();
// Adjust the offset of the next REIL instruction.
offset = baseOffset + instructions.size();
instructions.add(ReilHelpers.createJcc(offset, OperandSize.BYTE, "1", environment.getArchitectureSize(), jumpTarget));
}
use of com.google.security.zynamics.reil.translators.TranslationResult in project binnavi by google.
the class AdcTranslator method translate.
/**
* Translates an ADC instruction to REIL code.
*
* @param environment A valid translation environment
* @param instruction The ADC instruction to translate
* @param instructions The generated REIL code will be added to this list
*
* @throws InternalTranslationException if any of the arguments are null the passed instruction is
* not an ADC instruction
*/
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "adc");
if (instruction.getOperands().size() != 2) {
throw new InternalTranslationException("Error: Argument instruction is not an adc instruction (invalid number of operands)");
}
final long baseOffset = instruction.getAddress().toLong() * 0x100;
long offset = baseOffset;
final List<? extends IOperandTree> operands = instruction.getOperands();
final IOperandTree targetOperand = operands.get(0);
final IOperandTree sourceOperand = operands.get(1);
// Load source operand.
final TranslationResult sourceResult = Helpers.translateOperand(environment, offset, sourceOperand, true);
instructions.addAll(sourceResult.getInstructions());
// Adjust the offset of the next REIL instruction.
offset = baseOffset + instructions.size();
// Load destination operand.
final TranslationResult targetResult = Helpers.translateOperand(environment, offset, targetOperand, true);
instructions.addAll(targetResult.getInstructions());
// Adjust the offset of the next REIL instruction.
offset = baseOffset + instructions.size();
final OperandSize size = targetResult.getSize();
final String sourceRegister = sourceResult.getRegister();
final String targetRegister = targetResult.getRegister();
final String msbMask = String.valueOf(TranslationHelpers.getMsbMask(size));
final String carryMask = String.valueOf(Helpers.getCarryMask(size));
final String truncateMask = String.valueOf(TranslationHelpers.getAllBitsMask(size));
final String shiftValue = String.valueOf(TranslationHelpers.getShiftMsbLsbMask(size));
final String shiftCarry = String.valueOf(-size.getBitSize());
final OperandSize resultSize = TranslationHelpers.getNextSize(size);
final String msb1 = environment.getNextVariableString();
final String msb2 = environment.getNextVariableString();
final String addResultTemp = environment.getNextVariableString();
final String addResult = environment.getNextVariableString();
final String msbResult = environment.getNextVariableString();
final String msbSameBefore = environment.getNextVariableString();
final String msbSameBeforeNeg = environment.getNextVariableString();
final String msbChanged = environment.getNextVariableString();
final String tempOf = environment.getNextVariableString();
final String tempCf = environment.getNextVariableString();
final String truncatedResult = environment.getNextVariableString();
// Isolate the MSBs of the two operands
instructions.add(ReilHelpers.createAnd(offset, size, sourceRegister, size, msbMask, size, msb1));
instructions.add(ReilHelpers.createAnd(offset + 1, size, targetRegister, size, msbMask, size, msb2));
// Perform the addition
instructions.add(ReilHelpers.createAdd(offset + 2, size, sourceRegister, size, targetRegister, resultSize, addResultTemp));
instructions.add(ReilHelpers.createAdd(offset + 3, resultSize, addResultTemp, OperandSize.BYTE, Helpers.CARRY_FLAG, resultSize, addResult));
// Isolate the MSB of the result and put it into the Sign Flag
instructions.add(ReilHelpers.createAnd(offset + 4, resultSize, addResult, resultSize, msbMask, size, msbResult));
instructions.add(ReilHelpers.createBsh(offset + 5, size, msbResult, size, shiftValue, OperandSize.BYTE, Helpers.SIGN_FLAG));
// Find out if the MSB of the two operands were different and whether the MSB of the first
// operand changed
instructions.add(ReilHelpers.createXor(offset + 6, size, msb1, size, msb2, size, msbSameBefore));
instructions.add(ReilHelpers.createXor(offset + 7, size, msbSameBefore, size, msbMask, size, msbSameBeforeNeg));
instructions.add(ReilHelpers.createXor(offset + 8, size, msb1, size, msbResult, size, msbChanged));
instructions.add(ReilHelpers.createAnd(offset + 9, size, msbSameBeforeNeg, size, msbChanged, size, tempOf));
// Write the result into the Overflow Flag
instructions.add(ReilHelpers.createBsh(offset + 10, size, tempOf, size, shiftValue, OperandSize.BYTE, Helpers.OVERFLOW_FLAG));
// Update the Carry Flag
instructions.add(ReilHelpers.createAnd(offset + 11, resultSize, addResult, resultSize, carryMask, resultSize, tempCf));
instructions.add(ReilHelpers.createBsh(offset + 12, resultSize, tempCf, resultSize, shiftCarry, OperandSize.BYTE, Helpers.CARRY_FLAG));
// Truncate the result to fit into the target
instructions.add(ReilHelpers.createAnd(offset + 13, resultSize, addResult, resultSize, truncateMask, size, truncatedResult));
// Update the Zero Flag
instructions.add(ReilHelpers.createBisz(offset + 14, size, truncatedResult, OperandSize.BYTE, Helpers.ZERO_FLAG));
// Write the result of the ADC operation back into the target register
Helpers.writeBack(environment, offset + 15, targetOperand, truncatedResult, size, targetResult.getAddress(), targetResult.getType(), instructions);
}
use of com.google.security.zynamics.reil.translators.TranslationResult in project binnavi by google.
the class AddTranslator method translate.
/**
* Translates an ADD instruction to REIL code.
*
* @param environment A valid translation environment.
* @param instruction The ADD instruction to translate.
* @param instructions The generated REIL code will be added to this list
*
* @throws InternalTranslationException if any of the arguments are null the passed instruction is
* not an ADD instruction
*/
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "add");
if (instruction.getOperands().size() != 2) {
throw new InternalTranslationException("Error: Argument instruction is not a add instruction (invalid number of operands)");
}
final long baseOffset = instruction.getAddress().toLong() * 0x100;
long offset = baseOffset;
final List<? extends IOperandTree> operands = instruction.getOperands();
final IOperandTree targetOperand = operands.get(0);
final IOperandTree sourceOperand = operands.get(1);
// Load source operand.
final TranslationResult sourceResult = Helpers.translateOperand(environment, offset, sourceOperand, true);
instructions.addAll(sourceResult.getInstructions());
// Adjust the offset of the next REIL instruction.
offset = baseOffset + instructions.size();
// Load destination operand.
final TranslationResult targetResult = Helpers.translateOperand(environment, offset, targetOperand, true);
instructions.addAll(targetResult.getInstructions());
// Adjust the offset of the next REIL instruction.
offset = baseOffset + instructions.size();
final OperandSize size = targetResult.getSize();
final String sourceRegister = sourceResult.getRegister();
final String targetRegister = targetResult.getRegister();
final String msbMask = String.valueOf(TranslationHelpers.getMsbMask(size));
final String carryMask = String.valueOf(Helpers.getCarryMask(size));
final String truncateMask = String.valueOf(TranslationHelpers.getAllBitsMask(size));
final String shiftValue = String.valueOf(TranslationHelpers.getShiftMsbLsbMask(size));
final String shiftCarry = String.valueOf(-size.getBitSize());
final OperandSize resultSize = TranslationHelpers.getNextSize(size);
final String msb1 = environment.getNextVariableString();
final String msb2 = environment.getNextVariableString();
final String addResult = environment.getNextVariableString();
final String msbResult = environment.getNextVariableString();
final String msbSameBefore = environment.getNextVariableString();
final String msbSameBeforeNeg = environment.getNextVariableString();
final String msbChanged = environment.getNextVariableString();
final String tempOf = environment.getNextVariableString();
final String tempCf = environment.getNextVariableString();
final String truncatedResult = environment.getNextVariableString();
// Isolate the MSBs of the two operands
instructions.add(ReilHelpers.createAnd(offset, size, sourceRegister, size, msbMask, size, msb1));
instructions.add(ReilHelpers.createAnd(offset + 1, size, targetRegister, size, msbMask, size, msb2));
// Perform the addition
instructions.add(ReilHelpers.createAdd(offset + 2, size, sourceRegister, size, targetRegister, resultSize, addResult));
// Isolate the MSB of the result and put it into the Sign Flag
instructions.add(ReilHelpers.createAnd(offset + 3, resultSize, addResult, resultSize, msbMask, size, msbResult));
instructions.add(ReilHelpers.createBsh(offset + 4, size, msbResult, size, shiftValue, OperandSize.BYTE, Helpers.SIGN_FLAG));
// Find out if the MSB of the two operands were different and whether the MSB of the first
// operand changed
instructions.add(ReilHelpers.createXor(offset + 5, size, msb1, size, msb2, size, msbSameBefore));
instructions.add(ReilHelpers.createXor(offset + 6, size, msbSameBefore, size, msbMask, size, msbSameBeforeNeg));
instructions.add(ReilHelpers.createXor(offset + 7, size, msb1, size, msbResult, size, msbChanged));
instructions.add(ReilHelpers.createAnd(offset + 8, size, msbSameBeforeNeg, size, msbChanged, size, tempOf));
// Write the result into the Overflow Flag
instructions.add(ReilHelpers.createBsh(offset + 9, size, tempOf, size, shiftValue, OperandSize.BYTE, Helpers.OVERFLOW_FLAG));
// Update the Carry Flag
instructions.add(ReilHelpers.createAnd(offset + 10, resultSize, addResult, resultSize, carryMask, resultSize, tempCf));
instructions.add(ReilHelpers.createBsh(offset + 11, resultSize, tempCf, resultSize, shiftCarry, OperandSize.BYTE, Helpers.CARRY_FLAG));
// Truncate the result to fit into the target
instructions.add(ReilHelpers.createAnd(offset + 12, resultSize, addResult, resultSize, truncateMask, size, truncatedResult));
// Update the Zero Flag
instructions.add(ReilHelpers.createBisz(offset + 13, size, truncatedResult, OperandSize.BYTE, Helpers.ZERO_FLAG));
// Write the result of the ADD operation back into the target register
Helpers.writeBack(environment, offset + 14, targetOperand, truncatedResult, size, targetResult.getAddress(), targetResult.getType(), instructions);
}
Aggregations