From fe296d1c9e3d2d6a459bac4b3279038828074443 Mon Sep 17 00:00:00 2001 From: Bet4 <0xbet4@gmail.com> Date: Wed, 13 Oct 2021 11:51:27 +0800 Subject: [PATCH] Improve Java bindings --- .gitignore | 1 + bindings/java/Makefile.build | 17 ++--- .../java/samples/SampleNetworkAuditing.java | 12 ++-- bindings/java/samples/Sample_arm.java | 8 +-- bindings/java/samples/Sample_arm64.java | 6 +- bindings/java/samples/Sample_m68k.java | 40 ++++++------ bindings/java/samples/Sample_mips.java | 4 +- bindings/java/samples/Sample_sparc.java | 6 +- bindings/java/samples/Sample_x86.java | 62 +++++++++---------- bindings/java/samples/Sample_x86_mmr.java | 2 +- bindings/java/samples/Shellcode.java | 4 +- bindings/java/unicorn/Unicorn.java | 2 +- 12 files changed, 83 insertions(+), 81 deletions(-) diff --git a/.gitignore b/.gitignore index 9ecf5c78..9c529c95 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ _*.txt _*.diff tmp/ +bindings/java/unicorn_Unicorn.h bindings/python/build/ bindings/python/dist/ bindings/python/src/ diff --git a/bindings/java/Makefile.build b/bindings/java/Makefile.build index c63fef3a..62b2b76e 100644 --- a/bindings/java/Makefile.build +++ b/bindings/java/Makefile.build @@ -1,9 +1,11 @@ .PHONY: gen_const clean -JAVA_HOME := $(shell jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));') +JC=javac -JAVA_INC := $(shell realpath $(JAVA_HOME)/../include) +JAVA_HOME := $(shell readlink -f `which $(JC)` | sed "s:/bin/$(JC)::") + +JAVA_INC := $(shell realpath $(JAVA_HOME)/include) JAVA_PLATFORM_INC := $(shell dirname `find $(JAVA_INC) -name jni_md.h`) @@ -28,7 +30,6 @@ LIBS=-lunicorn LIBDIR=-L../../ INCS=-I$(JAVA_INC) -I$(JAVA_PLATFORM_INC) -I$(UNICORN_INC) -JC=javac CLASSPATH=./ .SUFFIXES: .java .class @@ -46,7 +47,7 @@ all: lib jar samples $(CC) -c $(CFLAGS) $(INCS) $< -o $@ unicorn_Unicorn.h: unicorn/Unicorn.java - javah unicorn.Unicorn + javac -h . $< unicorn_Unicorn.o: unicorn_Unicorn.c unicorn_Unicorn.h $(CC) -c $(CFLAGS) $(INCS) $< -o $@ @@ -63,12 +64,12 @@ jar: jarfiles jar cf $(JARFILE) unicorn/*.class install: lib jar - cp libunicorn_java$(LIB_EXT) $(JAVA_HOME)/lib/ext - cp $(JARFILE) $(JAVA_HOME)/lib/ext + cp libunicorn_java$(LIB_EXT) /usr/lib + cp $(JARFILE) /usr/share/java uninstall: - rm $(JAVA_HOME)/lib/ext/libunicorn_java$(LIB_EXT) - rm $(JAVA_HOME)/lib/ext/$(JARFILE) + rm /usr/lib/libunicorn_java$(LIB_EXT) + rm /usr/share/java/$(JARFILE) gen_const: cd .. && python const_generator.py java diff --git a/bindings/java/samples/SampleNetworkAuditing.java b/bindings/java/samples/SampleNetworkAuditing.java index 929ceb9c..7a822acb 100644 --- a/bindings/java/samples/SampleNetworkAuditing.java +++ b/bindings/java/samples/SampleNetworkAuditing.java @@ -30,12 +30,12 @@ import java.util.*; public class SampleNetworkAuditing { - public static int next_id = 3; + public static long next_id = 3; public static final int SIZE_REG = 4; private static LogChain fd_chains = new LogChain(); - public static int get_id() { + public static long get_id() { return next_id++; } @@ -112,7 +112,7 @@ public class SampleNetworkAuditing { long mode = edx; String filename = read_string(uc, filename_addr); - Long dummy_fd = new Long(get_id()); + Long dummy_fd = get_id(); uc.reg_write(Unicorn.UC_X86_REG_EAX, dummy_fd); String msg = String.format("open file (filename=%s flags=%d mode=%d) with fd(%d)", filename, flags, mode, dummy_fd); @@ -144,8 +144,8 @@ public class SampleNetworkAuditing { long sock_type = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); long protocol = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); - Long dummy_fd = new Long(get_id()); - uc.reg_write(Unicorn.UC_X86_REG_EAX, dummy_fd.intValue()); + Long dummy_fd = get_id(); + uc.reg_write(Unicorn.UC_X86_REG_EAX, dummy_fd); if (family == 2) { // AF_INET String msg = String.format("create socket (%s, %s) with fd(%d)", ADDR_FAMILY.get(family), SOCKET_TYPES.get(sock_type), dummy_fd); @@ -401,7 +401,7 @@ public class SampleNetworkAuditing { mu.mem_write(ADDRESS, code); // initialize stack - mu.reg_write(Unicorn.UC_X86_REG_ESP, new Long(ADDRESS + 0x200000)); + mu.reg_write(Unicorn.UC_X86_REG_ESP, ADDRESS + 0x200000L); // handle interrupt ourself mu.hook_add(new MyInterruptHook(), null); diff --git a/bindings/java/samples/Sample_arm.java b/bindings/java/samples/Sample_arm.java index a4bd1952..4d85fb7d 100644 --- a/bindings/java/samples/Sample_arm.java +++ b/bindings/java/samples/Sample_arm.java @@ -40,9 +40,9 @@ public class Sample_arm { static void test_arm() { - Long r0 = new Long(0x1234); // R0 register - Long r2 = new Long(0x6789); // R1 register - Long r3 = new Long(0x3333); // R2 register + Long r0 = 0x1234L; // R0 register + Long r2 = 0x6789L; // R1 register + Long r3 = 0x3333L; // R2 register Long r1; // R1 register System.out.print("Emulate ARM code\n"); @@ -85,7 +85,7 @@ public class Sample_arm { static void test_thumb() { - Long sp = new Long(0x1234); // R0 register + Long sp = 0x1234L; // R0 register System.out.print("Emulate THUMB code\n"); diff --git a/bindings/java/samples/Sample_arm64.java b/bindings/java/samples/Sample_arm64.java index 56a7212f..0f7e5f32 100644 --- a/bindings/java/samples/Sample_arm64.java +++ b/bindings/java/samples/Sample_arm64.java @@ -69,9 +69,9 @@ public class Sample_arm64 { static void test_arm64() { - Long x11 = new Long(0x1234); // X11 register - Long x13 = new Long(0x6789); // X13 register - Long x15 = new Long(0x3333); // X15 register + Long x11 = 0x1234L; // X11 register + Long x13 = 0x6789L; // X13 register + Long x15 = 0x3333L; // X15 register System.out.print("Emulate ARM64 code\n"); diff --git a/bindings/java/samples/Sample_m68k.java b/bindings/java/samples/Sample_m68k.java index cae025a6..f4658aff 100644 --- a/bindings/java/samples/Sample_m68k.java +++ b/bindings/java/samples/Sample_m68k.java @@ -68,26 +68,26 @@ public class Sample_m68k { static void test_m68k() { - Long d0 = new Long(0x0000); // d0 data register - Long d1 = new Long(0x0000); // d1 data register - Long d2 = new Long(0x0000); // d2 data register - Long d3 = new Long(0x0000); // d3 data register - Long d4 = new Long(0x0000); // d4 data register - Long d5 = new Long(0x0000); // d5 data register - Long d6 = new Long(0x0000); // d6 data register - Long d7 = new Long(0x0000); // d7 data register - - Long a0 = new Long(0x0000); // a0 address register - Long a1 = new Long(0x0000); // a1 address register - Long a2 = new Long(0x0000); // a2 address register - Long a3 = new Long(0x0000); // a3 address register - Long a4 = new Long(0x0000); // a4 address register - Long a5 = new Long(0x0000); // a5 address register - Long a6 = new Long(0x0000); // a6 address register - Long a7 = new Long(0x0000); // a6 address register - - Long pc = new Long(0x0000); // program counter - Long sr = new Long(0x0000); // status register + Long d0 = 0x0000L; // d0 data register + Long d1 = 0x0000L; // d1 data register + Long d2 = 0x0000L; // d2 data register + Long d3 = 0x0000L; // d3 data register + Long d4 = 0x0000L; // d4 data register + Long d5 = 0x0000L; // d5 data register + Long d6 = 0x0000L; // d6 data register + Long d7 = 0x0000L; // d7 data register + + Long a0 = 0x0000L; // a0 address register + Long a1 = 0x0000L; // a1 address register + Long a2 = 0x0000L; // a2 address register + Long a3 = 0x0000L; // a3 address register + Long a4 = 0x0000L; // a4 address register + Long a5 = 0x0000L; // a5 address register + Long a6 = 0x0000L; // a6 address register + Long a7 = 0x0000L; // a6 address register + + Long pc = 0x0000L; // program counter + Long sr = 0x0000L; // status register System.out.print("Emulate M68K code\n"); diff --git a/bindings/java/samples/Sample_mips.java b/bindings/java/samples/Sample_mips.java index d977c231..e338864f 100644 --- a/bindings/java/samples/Sample_mips.java +++ b/bindings/java/samples/Sample_mips.java @@ -70,7 +70,7 @@ public class Sample_mips { static void test_mips_eb() { - Long r1 = new Long(0x6789); // R1 register + Long r1 = 0x6789L; // R1 register System.out.print("Emulate MIPS code (big-endian)\n"); @@ -107,7 +107,7 @@ public class Sample_mips { static void test_mips_el() { - Long r1 = new Long(0x6789); // R1 register + Long r1 = 0x6789L; // R1 register System.out.print("===========================\n"); System.out.print("Emulate MIPS code (little-endian)\n"); diff --git a/bindings/java/samples/Sample_sparc.java b/bindings/java/samples/Sample_sparc.java index 85d26367..b2849f45 100644 --- a/bindings/java/samples/Sample_sparc.java +++ b/bindings/java/samples/Sample_sparc.java @@ -69,9 +69,9 @@ public class Sample_sparc { static void test_sparc() { - Long g1 = new Long(0x1230); // G1 register - Long g2 = new Long(0x6789); // G2 register - Long g3 = new Long(0x5555); // G3 register + Long g1 = 0x1230L; // G1 register + Long g2 = 0x6789L; // G2 register + Long g3 = 0x5555L; // G3 register System.out.print("Emulate SPARC code\n"); diff --git a/bindings/java/samples/Sample_x86.java b/bindings/java/samples/Sample_x86.java index e25df640..652663f8 100644 --- a/bindings/java/samples/Sample_x86.java +++ b/bindings/java/samples/Sample_x86.java @@ -171,8 +171,8 @@ public class Sample_x86 { } static void test_i386() { - Long r_ecx = new Long(0x1234); // ECX register - Long r_edx = new Long(0x7890); // EDX register + Long r_ecx = 0x1234L; // ECX register + Long r_edx = 0x7890L; // EDX register System.out.print("Emulate i386 code\n"); @@ -234,8 +234,8 @@ public class Sample_x86 { static void test_i386_inout() { - Long r_eax = new Long(0x1234); // ECX register - Long r_ecx = new Long(0x6789); // EDX register + Long r_eax = 0x1234L; // ECX register + Long r_ecx = 0x6789L; // EDX register System.out.print("===================================\n"); System.out.print("Emulate i386 code with IN/OUT instructions\n"); @@ -309,8 +309,8 @@ public class Sample_x86 { // emulate code that loop forever static void test_i386_loop() { - Long r_ecx = new Long(0x1234); // ECX register - Long r_edx = new Long(0x7890); // EDX register + Long r_ecx = 0x1234L; // ECX register + Long r_edx = 0x7890L; // EDX register System.out.print("===================================\n"); System.out.print("Emulate i386 code that loop forever\n"); @@ -346,8 +346,8 @@ public class Sample_x86 { // emulate code that read invalid memory static void test_i386_invalid_mem_read() { - Long r_ecx = new Long(0x1234); // ECX register - Long r_edx = new Long(0x7890); // EDX register + Long r_ecx = 0x1234L; // ECX register + Long r_edx = 0x7890L; // EDX register System.out.print("===================================\n"); System.out.print("Emulate i386 code that read from invalid memory\n"); @@ -393,8 +393,8 @@ public class Sample_x86 { // emulate code that read invalid memory static void test_i386_invalid_mem_write() { - Long r_ecx = new Long(0x1234); // ECX register - Long r_edx = new Long(0x7890); // EDX register + Long r_ecx = 0x1234L; // ECX register + Long r_edx = 0x7890L; // EDX register System.out.print("===================================\n"); System.out.print("Emulate i386 code that write to invalid memory\n"); @@ -453,8 +453,8 @@ public class Sample_x86 { // emulate code that jump to invalid memory static void test_i386_jump_invalid() { - Long r_ecx = new Long(0x1234); // ECX register - Long r_edx = new Long(0x7890); // EDX register + Long r_ecx = 0x1234L; // ECX register + Long r_edx = 0x7890L; // EDX register System.out.print("===================================\n"); System.out.print("Emulate i386 code that jumps to invalid memory\n"); @@ -527,22 +527,22 @@ public class Sample_x86 { u.mem_write(ADDRESS, X86_CODE64); // initialize machine registers - u.reg_write(Unicorn.UC_X86_REG_RSP, new Long(rsp)); - - u.reg_write(Unicorn.UC_X86_REG_RAX, new Long(rax)); - u.reg_write(Unicorn.UC_X86_REG_RBX, new Long(rbx)); - u.reg_write(Unicorn.UC_X86_REG_RCX, new Long(rcx)); - u.reg_write(Unicorn.UC_X86_REG_RDX, new Long(rdx)); - u.reg_write(Unicorn.UC_X86_REG_RSI, new Long(rsi)); - u.reg_write(Unicorn.UC_X86_REG_RDI, new Long(rdi)); - u.reg_write(Unicorn.UC_X86_REG_R8, new Long(r8)); - u.reg_write(Unicorn.UC_X86_REG_R9, new Long(r9)); - u.reg_write(Unicorn.UC_X86_REG_R10, new Long(r10)); - u.reg_write(Unicorn.UC_X86_REG_R11, new Long(r11)); - u.reg_write(Unicorn.UC_X86_REG_R12, new Long(r12)); - u.reg_write(Unicorn.UC_X86_REG_R13, new Long(r13)); - u.reg_write(Unicorn.UC_X86_REG_R14, new Long(r14)); - u.reg_write(Unicorn.UC_X86_REG_R15, new Long(r15)); + u.reg_write(Unicorn.UC_X86_REG_RSP, rsp); + + u.reg_write(Unicorn.UC_X86_REG_RAX, rax); + u.reg_write(Unicorn.UC_X86_REG_RBX, rbx); + u.reg_write(Unicorn.UC_X86_REG_RCX, rcx); + u.reg_write(Unicorn.UC_X86_REG_RDX, rdx); + u.reg_write(Unicorn.UC_X86_REG_RSI, rsi); + u.reg_write(Unicorn.UC_X86_REG_RDI, rdi); + u.reg_write(Unicorn.UC_X86_REG_R8, r8); + u.reg_write(Unicorn.UC_X86_REG_R9, r9); + u.reg_write(Unicorn.UC_X86_REG_R10, r10); + u.reg_write(Unicorn.UC_X86_REG_R11, r11); + u.reg_write(Unicorn.UC_X86_REG_R12, r12); + u.reg_write(Unicorn.UC_X86_REG_R13, r13); + u.reg_write(Unicorn.UC_X86_REG_R14, r14); + u.reg_write(Unicorn.UC_X86_REG_R15, r15); // tracing all basic blocks with customized callback u.hook_add(new MyBlockHook(), 1, 0, null); @@ -598,9 +598,9 @@ public class Sample_x86 { static void test_x86_16() { - Long eax = new Long(7); - Long ebx = new Long(5); - Long esi = new Long(6); + Long eax = 7L; + Long ebx = 5L; + Long esi = 6L; System.out.print("Emulate x86 16-bit code\n"); diff --git a/bindings/java/samples/Sample_x86_mmr.java b/bindings/java/samples/Sample_x86_mmr.java index e2b1a6dd..0ecb3a1e 100644 --- a/bindings/java/samples/Sample_x86_mmr.java +++ b/bindings/java/samples/Sample_x86_mmr.java @@ -49,7 +49,7 @@ public class Sample_x86_mmr { uc.reg_write(Unicorn.UC_X86_REG_LDTR, ldtr1); uc.reg_write(Unicorn.UC_X86_REG_GDTR, gdtr1); - uc.reg_write(Unicorn.UC_X86_REG_EAX, new Long(0xdddddddd)); + uc.reg_write(Unicorn.UC_X86_REG_EAX, 0xddddddddL); // read the registers back out eax = (int)((Long)uc.reg_read(Unicorn.UC_X86_REG_EAX)).longValue(); diff --git a/bindings/java/samples/Shellcode.java b/bindings/java/samples/Shellcode.java index 48674a46..e75d922b 100644 --- a/bindings/java/samples/Shellcode.java +++ b/bindings/java/samples/Shellcode.java @@ -113,7 +113,7 @@ public class Shellcode { static void test_i386() { - Long r_esp = new Long(ADDRESS + 0x200000); // ESP register + Long r_esp = ADDRESS + 0x200000L; // ESP register System.out.print("Emulate i386 code\n"); @@ -158,4 +158,4 @@ public class Shellcode { } -} \ No newline at end of file +} diff --git a/bindings/java/unicorn/Unicorn.java b/bindings/java/unicorn/Unicorn.java index 279fdbbf..26f04dec 100644 --- a/bindings/java/unicorn/Unicorn.java +++ b/bindings/java/unicorn/Unicorn.java @@ -25,7 +25,7 @@ import java.util.*; public class Unicorn implements UnicornConst, ArmConst, Arm64Const, M68kConst, SparcConst, MipsConst, X86Const { - private long eng; + public long eng; private int arch; private int mode;