/* * MagicInstructions.java - This file is part of the Jakstab project. * Copyright 2007-2015 Johannes Kinder <jk@jakstab.org> * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, see <http://www.gnu.org/licenses/>. */ package org.jakstab.ssl; import org.jakstab.rtl.expressions.ExpressionFactory; import org.jakstab.rtl.expressions.RTLVariable; import org.jakstab.rtl.expressions.Writable; import org.jakstab.rtl.statements.*; import org.jakstab.util.Logger; /** * @author Johannes Kinder */ public class MagicInstructions { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(MagicInstructions.class); private final SSLInstruction allocPrototype; private final SSLInstruction deallocPrototype; private final SSLInstruction nondet8Prototype; private final SSLInstruction nondet16Prototype; private final SSLInstruction nondet32Prototype; private final SSLInstruction havoc8leqPrototype; private final SSLInstruction havoc16leqPrototype; private final SSLInstruction havoc32leqPrototype; private final SSLInstruction assertGTPrototype; private final SSLInstruction assertGEPrototype; private final SSLInstruction assertEQPrototype; protected MagicInstructions() { RTLVariable reg8 = ExpressionFactory.createVariable("reg8"); RTLVariable reg16 = ExpressionFactory.createVariable("reg16"); RTLVariable reg32 = ExpressionFactory.createVariable("reg32"); RTLVariable i8 = ExpressionFactory.createVariable("i8"); RTLVariable i16 = ExpressionFactory.createVariable("i16"); RTLVariable i32 = ExpressionFactory.createVariable("i32"); Writable modrm = ExpressionFactory.createVariable("modrm"); allocPrototype = makePrototype( "ALLOC", new RTLAlloc(reg32), reg32.toString() ); deallocPrototype = makePrototype( "DEALLOC", new RTLDealloc(ExpressionFactory.createVariable("modrm")), modrm.toString() ); nondet8Prototype = makePrototype( "NONDET8", new AssignmentTemplate(8, reg8, ExpressionFactory.nondet(8)), reg8.toString(), i8.toString() ); nondet16Prototype = makePrototype( "NONDET16", new AssignmentTemplate(16, reg16, ExpressionFactory.nondet(16)), reg16.toString(), i16.toString() ); nondet32Prototype = makePrototype( "NONDET32", new AssignmentTemplate(32, reg32, ExpressionFactory.nondet(32)), reg32.toString(), i32.toString() ); havoc8leqPrototype = makePrototype( "HAVOC8ULEQ", new RTLHavoc(reg8, i8), reg8.toString(), i8.toString() ); havoc16leqPrototype = makePrototype( "HAVOC16ULEQ", new RTLHavoc(reg16, i16), reg16.toString(), i16.toString() ); havoc32leqPrototype = makePrototype( "HAVOC32ULEQ", new RTLHavoc(reg32, i32), reg32.toString(), i32.toString() ); assertGTPrototype = makePrototype( "ASSERTGT", new RTLAssert(ExpressionFactory.createGreaterThan( reg32, ExpressionFactory.createCast(modrm, ExpressionFactory.createNumber(32, 8)))), reg32.toString(), modrm.toString() ); assertGEPrototype = makePrototype( "ASSERTGE", new RTLAssert(ExpressionFactory.createGreaterOrEqual( reg32, ExpressionFactory.createCast(modrm, ExpressionFactory.createNumber(32, 8)))), reg32.toString(), modrm.toString() ); assertEQPrototype = makePrototype( "ASSERTEQ", new RTLAssert(ExpressionFactory.createEqual( reg32, ExpressionFactory.createCast(modrm, ExpressionFactory.createNumber(32, 8)))), reg32.toString(), modrm.toString() ); } private SSLInstruction makePrototype(String name, RTLStatement statement, String... params) { StatementSequence seq = new StatementSequence(); seq.addFirst(statement); return new SSLInstruction(name, params, seq); } public SSLInstruction getAllocPrototype() { return allocPrototype; } public SSLInstruction getDeallocPrototype() { return deallocPrototype; } public SSLInstruction getNondet8Prototype() { return nondet8Prototype; } public SSLInstruction getNondet16Prototype() { return nondet16Prototype; } public SSLInstruction getNondet32Prototype() { return nondet32Prototype; } public SSLInstruction getHavoc8Prototype() { return havoc8leqPrototype; } public SSLInstruction getHavoc16Prototype() { return havoc16leqPrototype; } public SSLInstruction getHavoc32Prototype() { return havoc32leqPrototype; } public SSLInstruction getAssertGTPrototype() { return assertGTPrototype; } public SSLInstruction getAssertGEPrototype() { return assertGEPrototype; } public SSLInstruction getAssertEQPrototype() { return assertEQPrototype; } }