Add 16-bit example, tracking upstream

This commit is contained in:
Chris Eagle 2015-08-25 21:01:48 -07:00
parent 065fd60d4c
commit e280088caf

View file

@ -38,6 +38,7 @@ public class Sample_x86 {
public static final byte[] X86_CODE32_JMP_INVALID = {-23,-23,-18,-18,-18,65,74}; public static final byte[] X86_CODE32_JMP_INVALID = {-23,-23,-18,-18,-18,65,74};
public static final byte[] X86_CODE32_INOUT = {65,-28,63,74,-26,70,67}; public static final byte[] X86_CODE32_INOUT = {65,-28,63,74,-26,70,67};
public static final byte[] X86_CODE64 = {65,-68,59,-80,40,42,73,15,-55,-112,77,15,-83,-49,73,-121,-3,-112,72,-127,-46,-118,-50,119,53,72,-9,-39,77,41,-12,73,-127,-55,-10,-118,-58,83,77,-121,-19,72,15,-83,-46,73,-9,-44,72,-9,-31,77,25,-59,77,-119,-59,72,-9,-42,65,-72,79,-115,107,89,77,-121,-48,104,106,30,9,60,89}; public static final byte[] X86_CODE64 = {65,-68,59,-80,40,42,73,15,-55,-112,77,15,-83,-49,73,-121,-3,-112,72,-127,-46,-118,-50,119,53,72,-9,-39,77,41,-12,73,-127,-55,-10,-118,-58,83,77,-121,-19,72,15,-83,-46,73,-9,-44,72,-9,-31,77,25,-59,77,-119,-59,72,-9,-42,65,-72,79,-115,107,89,77,-121,-48,104,106,30,9,60,89};
public static final byte[] X86_CODE16 = {0, 0}; // add byte ptr [bx + si], al
// memory address where emulation starts // memory address where emulation starts
public static final int ADDRESS = 0x1000000; public static final int ADDRESS = 0x1000000;
@ -585,6 +586,41 @@ public class Sample_x86 {
u.close(); u.close();
} }
static void test_x86_16()
{
byte[] eax = toBytes(7);
byte[] ebx = toBytes(5);
byte[] esi = toBytes(6);
System.out.print("Emulate x86 16-bit code\n");
// Initialize emulator in X86-16bit mode
Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_16);
// map 8KB memory for this emulation
u.mem_map(0, 8 * 1024);
// write machine code to be emulated to memory
u.mem_write(0, X86_CODE16);
// initialize machine registers
u.reg_write(Unicorn.UC_X86_REG_EAX, eax);
u.reg_write(Unicorn.UC_X86_REG_EBX, ebx);
u.reg_write(Unicorn.UC_X86_REG_ESI, esi);
// emulate machine code in infinite time (last param = 0), or when
// finishing all the code.
u.emu_start(0, X86_CODE16.length, 0, 0);
// now print out some registers
System.out.print(">>> Emulation done. Below is the CPU context\n");
// read from memory
byte[] tmp = u.mem_read(11, 1);
u.close();
}
public static void main(String args[]) public static void main(String args[])
{ {
if (args.length == 1) { if (args.length == 1) {
@ -602,6 +638,10 @@ public class Sample_x86 {
test_x86_64(); test_x86_64();
} }
if (args[0].equals("-16")) {
test_x86_16();
}
// test memleak // test memleak
if (args[0].equals("-0")) { if (args[0].equals("-0")) {
while(true) { while(true) {
@ -610,7 +650,7 @@ public class Sample_x86 {
} }
} }
} else { } else {
System.out.print("Syntax: java Sample_x86 <-32|-64>\n"); System.out.print("Syntax: java Sample_x86 <-16|-32|-64>\n");
} }
} }