diff udis86-1.4/udcli/udcli.c @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/udis86-1.4/udcli/udcli.c	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,240 @@
+/* -----------------------------------------------------------------------------
+ * udcli.c - front end to udis86.
+ *
+ * Copyright (c) 2004, 2005, 2006 Vivek Mohan <vivek@sig9.com>
+ * All rights reserved.
+ * See (LICENSE)
+ * -----------------------------------------------------------------------------
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "../udis86.h"
+
+#if defined(__amd64__) || defined(__x86_64__)
+#  define FMT "l"
+#else
+#  define FMT "ll"
+#endif
+
+#ifdef _WIN32
+# include <io.h>
+# include <fcntl.h>
+#endif
+
+/* help string */
+static char help[] = 
+{
+  "Usage: %s [-option[s]] file\n"
+  "Options:\n"
+  "    -16      : Set the disassembly mode to 16 bits. \n"
+  "    -32      : Set the disassembly mode to 32 bits. (default)\n"
+  "    -64      : Set the disassembly mode to 64 bits.\n"
+  "    -intel   : Set the output to INTEL (NASM like) syntax. (default)\n"
+  "    -att     : Set the output to AT&T (GAS like) syntax.\n"
+  "    -v <v>   : Set vendor. <v> = {intel, amd}.\n"
+  "    -o <pc>  : Set the value of program counter to <pc>. (default = 0)\n"
+  "    -s <n>   : Set the number of bytes to skip before disassembly to <n>.\n"
+  "    -c <n>   : Set the number of bytes to disassemble to <n>.\n"
+  "    -x       : Set the input mode to whitespace seperated 8-bit numbers in\n"
+  "               hexadecimal representation. Example: 0f 01 ae 00\n"
+  "    -noff    : Do not display the offset of instructions.\n"
+  "    -nohex   : Do not display the hexadecimal code of instructions.\n"
+  "    -h       : Display this help message.\n"
+  "\n"
+  "Udcli is a front-end to the Udis86 Disassembler Library.\n" 
+  "http://udis86.sourceforge.net/\n"
+};
+
+FILE* fptr = NULL;
+uint64_t o_skip = 0;
+uint64_t o_count = 0;
+unsigned char o_do_count= 0;
+unsigned char o_do_off = 1;
+unsigned char o_do_hex = 1;
+unsigned char o_do_x = 0;
+unsigned o_vendor = UD_VENDOR_AMD;
+
+int input_hook_x(ud_t* u);
+int input_hook_file(ud_t* u);
+
+int main(int argc, char **argv)
+{
+  char *prog_path = *argv;
+  char *s;
+  ud_t ud_obj;
+  int mode = 0;
+
+  /* initialize */
+  ud_init(&ud_obj);
+  ud_set_mode(&ud_obj, 32);
+  ud_set_syntax(&ud_obj, UD_SYN_INTEL);
+
+#ifdef _WIN32
+  _setmode(_fileno(stdin), _O_BINARY);
+#endif  
+
+  fptr = stdin;
+
+  argv++;
+
+  /* loop through the args */
+  while(--argc > 0) {
+	if (strcmp(*argv,"-16") == 0) {
+		ud_set_mode(&ud_obj, 16);
+		mode = 16;
+	} else if (strcmp(*argv,"-32") == 0) {
+		ud_set_mode(&ud_obj, 32);
+		mode = 32;
+	} else if (strcmp(*argv,"-64") == 0) {
+		ud_set_mode(&ud_obj, 64);
+		mode = 64;
+	} else if (strcmp(*argv,"-intel") == 0)
+		ud_set_syntax(&ud_obj, UD_SYN_INTEL);
+	else if (strcmp(*argv,"-att") == 0)
+		ud_set_syntax(&ud_obj, UD_SYN_ATT);
+	else if (strcmp(*argv,"-noff") == 0)
+		o_do_off = 0;
+	else if (strcmp(*argv,"-nohex") == 0)
+		o_do_hex = 0;
+	else if (strcmp(*argv,"-x") == 0)
+		o_do_x = 1;
+	else if (strcmp(*argv,"-s") == 0)
+		if (--argc) {
+			s = *(++argv);
+			if (sscanf(s, "%"  FMT "d", &o_skip) == 0)
+				fprintf(stderr, "Invalid value given for -s.\n");
+		} else { 
+			fprintf(stderr, "No value given for -s.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	else if (strcmp(*argv,"-c") == 0)
+		if (--argc) {
+			o_do_count= 1;
+			s = *(++argv);
+			if (sscanf(s, "%" FMT "d", &o_count) == 0)
+				fprintf(stderr, "Invalid value given for -c.\n");
+		} else { 
+			fprintf(stderr, "No value given for -c.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	else if (strcmp(*argv,"-v") == 0)
+		if (--argc) {
+			s = *(++argv);
+			if (*s == 'i')
+				ud_set_vendor(&ud_obj, UD_VENDOR_INTEL);
+		} else { 
+			fprintf(stderr, "No value given for -v.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	else if (strcmp(*argv,"-o") == 0) {
+		if (--argc) {
+			uint64_t pc = 0;
+			s = *(++argv);
+			if (sscanf(s, "%" FMT "x", &pc) == 0)
+				fprintf(stderr, "Invalid value given for -o.\n");
+			ud_set_pc(&ud_obj, pc);
+		} else { 
+			fprintf(stderr, "No value given for -o.\n");
+			printf(help, prog_path);
+			exit(EXIT_FAILURE);
+		}
+	} else if((*argv)[0] == '-') {
+		fprintf(stderr, "Invalid option %s.\n", *argv);
+		printf(help, prog_path);
+		exit(EXIT_FAILURE);
+	} else {
+		static int i = 0;
+		s = *argv;
+		if (i) {
+			fprintf(stderr, "Multiple files specified.\n");
+			exit(EXIT_FAILURE);
+		} else i = 1;
+		if ((fptr = fopen(s, "rb")) == NULL) {
+			fprintf(stderr, "Failed to open file: %s.\n", s);
+				exit(EXIT_FAILURE);
+		}
+	}
+	argv++;
+  }
+
+  if (o_do_x)
+	ud_set_input_hook(&ud_obj, input_hook_x);
+  else	ud_set_input_hook(&ud_obj, input_hook_file);	
+
+  if (o_skip) {
+	o_count += o_skip;
+	ud_input_skip(&ud_obj, o_skip);
+  }
+
+  /* disassembly loop */
+  while (ud_disassemble(&ud_obj)) {
+	if (o_do_off)
+		printf("%016" FMT "x ", ud_insn_off(&ud_obj));
+	if (o_do_hex) {
+		char* hex1, *hex2;
+		char c;
+		hex1 = ud_insn_hex(&ud_obj);
+		hex2 = hex1 + 16;
+		c = hex1[16];
+		hex1[16] = 0;
+		printf("%-16s %-24s", hex1, ud_insn_asm(&ud_obj));
+		hex1[16] = c;
+		if (strlen(hex1) > 16) {
+			printf("\n");
+			if (o_do_off)
+				printf("%15s -", "");
+			printf("%-16s", hex2);
+		}
+	} 
+	else printf(" %-24s", ud_insn_asm(&ud_obj));
+
+	printf("\n");
+  }
+  
+  exit(EXIT_SUCCESS);
+  return 0;
+}
+
+int input_hook_x(ud_t* u)
+{
+  unsigned int c, i;
+
+  if (o_do_count) {
+	if (! o_count)
+		return UD_EOI;
+	else --o_count;
+  }
+
+  i = fscanf(fptr, "%x", &c);
+
+  if (i == EOF)
+	return UD_EOI;
+  if (i == 0) {
+	fprintf(stderr, "Error: Invalid input, should be in hexadecimal form (8-bit).\n");
+	return UD_EOI;
+  }
+  if (c > 0xFF)
+	fprintf(stderr, "Warning: Casting non-8-bit input (%x), to %x.\n", c, c & 0xFF);
+  return (int) (c & 0xFF);
+}	
+
+int input_hook_file(ud_t* u)
+{
+  int c;
+
+  if (o_do_count) {
+	  if (! o_count) {
+		return -1;
+	  } else o_count -- ;
+  }
+
+  if ((c = fgetc(fptr)) == EOF)
+	return UD_EOI;
+  return c;
+}