package tools; import java.io.*; import java.util.*; import java.net.*; import java.lang.reflect.*; import org.w3c.dom.*; import org.xml.sax.*; import org.jpc.emulator.execution.decoder.*; public class TestGenerator { public static void main(String[] args) throws Exception { BufferedReader disam = new BufferedReader(new FileReader(args[0])); BufferedWriter cases = new BufferedWriter(new FileWriter(args[0]+".cases")); boolean random = args.length > 1 && args[1].equals("-random"); String line; while ((line = disam.readLine()) != null) { String[] parts = line.split(";"); boolean is32Bit = parts[0].endsWith("32"); String cname = parts[1]; String[] hex = parts[2].trim().split(" "); byte[] raw = new byte[hex.length]; for (int i=0; i < raw.length; i++) raw[i] = (byte) Integer.parseInt(hex[i], 16); if (cname.contains("hlt") || cname.contains("in_") || cname.contains("out_") || cname.contains("ins_") || cname.contains("outs_")) continue; generateCases(is32Bit, cname, raw, cases, random); } } private static void generateCases(boolean is32Bit, String cname, byte[] raw, BufferedWriter out, boolean random) throws IOException { int mode = OracleFuzzer.RM; if (cname.contains("pm.")) mode = OracleFuzzer.PM; if (cname.contains("vm.")) mode = OracleFuzzer.VM; int[] inputState = getInputState(is32Bit, mode, cname, random); out.append(String.format("%08x %08x %08x %s\n", mode, 1, 0xffffffff, is32Bit ? "32" : "16")); for (byte b : raw) out.append(String.format("%02x ", b)); out.newLine(); for (int i=0; i < inputState.length; i++) out.append(String.format("%08x ", inputState[i])); // memory input values out.append("\n*****\n"); out.flush(); } private static int[] getInputState(boolean is32Bit, int mode, String cname, boolean random) { if (mode == OracleFuzzer.PM) return OracleFuzzer.getCanonicalProtectedModeInput(OracleFuzzer.codeEIP, is32Bit, random); if (mode == OracleFuzzer.VM) return OracleFuzzer.getCanonicalVM86ModeInput(OracleFuzzer.codeEIP, random); return OracleFuzzer.getCanonicalRealModeInput(OracleFuzzer.codeEIP, random); } }