Using JPC, it gives something like this:
import java.io.IOException; import org.jpc.emulator.PC; import org.jpc.emulator.processor.Processor; import org.jpc.j2se.VirtualClock; public class EmulateShellcode { public static void main(String[] args) throws IOException { VirtualClock clock = new VirtualClock(); PC pc = new PC(clock, args); Processor cpu = pc.getProcessor(); cpu.cs.setSelector(0); cpu.eip = 0; if(args.length == 0) { System.out.println("Usage: java EmulateShellcode "); System.out.println("*** examples:"); System.out.println("* add al, 0x42:\n\tjava EmulateShellcode 04 42"); System.out.println("* nop:\n\tjava EmulateShellcode 0x90"); System.out.println("* inc edx:\n\tjava EmulateShellcode 42h"); System.exit(1); } System.out.println("Loading shellcode in memory..."); for(int i=0; i<args.length; i++) { String str = args[i]; if(args[i].startsWith("0x")) str = args[i].substring(2); else if(args[i].startsWith("\\x")) str = args[i].substring(2); else if(args[i].endsWith("h")) str = args[i].substring(0, args[i].length()-1); <strong>// the byte at address i is the argument at position i cpu.linearMemory.setByte(i, (byte)Integer.parseInt(str, 16));</strong> } System.out.println("Before execution:"); cpu.printState(); <strong>// execute starting at address 0 cpu.linearMemory.executeProtected(cpu, 0);</strong> System.out.println("\nAfter execution:"); cpu.printState(); } }