static int keystone_assemble(RAsm *a, RAsmOp *ao, const char *str, ks_arch arch, ks_mode mode) { ks_err err = KS_ERR_ARCH; bool must_init = false; size_t count, size; ut8 *insn = NULL; if (!ks_arch_supported (arch)) { return -1; } must_init = true; //!oldcur || (a->cur != oldcur || oldbit != a->bits); oldcur = a->cur; oldbit = a->bits; if (must_init) { if (ks) { ks_close (ks); ks = NULL; } err = ks_open (arch, mode, &ks); if (err || !ks) { eprintf ("Cannot initialize keystone\n"); ks_free (insn); if (ks) { ks_close (ks); ks = NULL; } return -1; } } if (!ks) { ks_free (insn); if (ks) { ks_close (ks); ks = NULL; } return -1; } if (a->syntax == R_ASM_SYNTAX_ATT) { ks_option (ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT); } else { ks_option (ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM); } int rc = ks_asm (ks, str, a->pc, &insn, &size, &count); if (rc) { eprintf ("ks_asm: %s\n", ks_strerror ((ks_err)ks_errno (ks))); ks_free (insn); if (ks) { ks_close (ks); ks = NULL; } return -1; } memcpy (ao->buf, insn, R_MIN (size, sizeof (ao->buf) -1)); ks_free (insn); if (ks) { ks_close (ks); ks = NULL; } return size; }
static void usage(char *prog) { printf("Kstool v%u.%u.%u for Keystone Assembler Engine (www.keystone-engine.org)\nBy Nguyen Anh Quynh, 2016-2018\n\n", KS_VERSION_MAJOR, KS_VERSION_MINOR, KS_VERSION_EXTRA); printf("Syntax: %s <arch+mode> <assembly-string> [start-address-in-hex-format]\n", prog); printf("\nThe following <arch+mode> options are supported:\n"); if (ks_arch_supported(KS_ARCH_X86)) { printf(" x16: X86 16bit, Intel syntax\n"); printf(" x32: X86 32bit, Intel syntax\n"); printf(" x64: X86 64bit, Intel syntax\n"); printf(" x16att: X86 16bit, AT&T syntax\n"); printf(" x32att: X86 32bit, AT&T syntax\n"); printf(" x64att: X86 64bit, AT&T syntax\n"); printf(" x16nasm: X86 16bit, NASM syntax\n"); printf(" x32nasm: X86 32bit, NASM syntax\n"); printf(" x64nasm: X86 64bit, NASM syntax\n"); } if (ks_arch_supported(KS_ARCH_ARM)) { printf(" arm: ARM - little endian\n"); printf(" armbe: ARM - big endian\n"); printf(" thumb: Thumb - little endian\n"); printf(" thumbbe: Thumb - big endian\n"); printf(" armv8: ARM V8 - little endian\n"); printf(" armv8be: ARM V8 - big endian\n"); printf(" thumbv8: Thumb V8 - little endian\n"); printf(" thumbv8be: Thumb V8 - big endian\n"); } if (ks_arch_supported(KS_ARCH_ARM64)) { printf(" arm64: AArch64\n"); } if (ks_arch_supported(KS_ARCH_HEXAGON)) { printf(" hexagon: Hexagon\n"); } if (ks_arch_supported(KS_ARCH_MIPS)) { printf(" mips: Mips - little endian\n"); printf(" mipsbe: Mips - big endian\n"); printf(" mips64: Mips64 - little endian\n"); printf(" mips64be: Mips64 - big endian\n"); } if (ks_arch_supported(KS_ARCH_PPC)) { printf(" ppc32be: PowerPC32 - big endian\n"); printf(" ppc64: PowerPC64 - little endian\n"); printf(" ppc64be: PowerPC64 - big endian\n"); } if (ks_arch_supported(KS_ARCH_SPARC)) { printf(" sparc: Sparc - little endian\n"); printf(" sparcbe: Sparc - big endian\n"); printf(" sparc64be: Sparc64 - big endian\n"); } if (ks_arch_supported(KS_ARCH_SYSTEMZ)) { printf(" systemz: SystemZ (S390x)\n"); } if (ks_arch_supported(KS_ARCH_EVM)) { printf(" evm: Ethereum Virtual Machine\n"); } printf("\n"); }