R_API RBinJavaObj* r_bin_java_new_buf(RBuffer *buf) { RBinJavaObj *bin = R_NEW0 (RBinJavaObj); if (!bin) return NULL; bin->b = buf; bin->size = buf->length; buf->cur = 0; // rewind if (!javasm_init (bin)) return r_bin_java_free (bin); return bin; }
RBinJavaObj* r_bin_java_new(const char* file) { ut8 *buf; RBinJavaObj *bin = R_NEW0 (RBinJavaObj); bin->file = file; if (!(buf = (ut8*)r_file_slurp (file, &bin->size))) return r_bin_java_free (bin); bin->b = r_buf_new (); if (!r_buf_set_bytes (bin->b, buf, bin->size)) return r_bin_java_free (bin); free (buf); if (!javasm_init (bin)) return r_bin_java_free (bin); return bin; }
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, ut64 len) { void *cp; RBinJavaObj *obj = NULL; RBin *b = a->binb.bin; if (!strcmp (b->cur.curplugin->name, "java")) { // XXX slow obj = b->cur.bin_obj; //o; if (obj) r_java_setcp (obj->cp_items, obj->cf.cp_count); } // XXX: crossmodule dependency // TODO: get class info from rbin if loaded #if 0 RCore *core = (RCore*)a->user; if (core && core->file && lastfile != core->file->filename) { lastfile = core->file->filename; java_classdump (lastfile, 0); } else javasm_init (); #endif return op->inst_len = r_java_disasm (a->pc, buf, op->buf_asm, sizeof (op->buf_asm)); }
int java_classdump(const char *file, int verbose) { RBinJavaClass2 cf2; unsigned short sz, sz2; int this_class; char buf[0x9999]; int i,j; FILE *fd = fopen(file, "rb"); if (fd == NULL) return -1; /* start parsing */ fread (&cf, 10, 1, fd); //sizeof(struct classfile), 1, fd); if (memcmp (cf.cafebabe, "\xCA\xFE\xBA\xBE", 4)) { eprintf ("java_classdump: Invalid header\n"); return -1; } javasm_init (); /* show class version information */ V printf ("Version: 0x%02x%02x 0x%02x%02x\n", cf.major[1],cf.major[0], cf.minor[1],cf.minor[0]); cf.cp_count = r_num_ntohs(cf.cp_count); if (cf.major[0]==cf.major[1] && cf.major[0]==0) { eprintf ("Oops. this is a Mach-O\n"); return 0; } cf.cp_count--; V printf ("ConstantPoolCount %d\n", cf.cp_count); cp_items = malloc (sizeof (struct cp_item)*(cf.cp_count+1)); for (i=0;i<cf.cp_count;i++) { struct constant_t *c; fread (buf, 1, 1, fd); c = NULL; for (j=0; r_bin_java_constants[j].name; j++) { if (r_bin_java_constants[j].tag == buf[0]) { c = &r_bin_java_constants[j]; break; } } if (c == NULL) { eprintf ("Invalid tag '%d'\n", buf[0]); return 0; } V eprintf (" %3d %s: ", i+1, c->name); /* store constant pool item */ strcpy (cp_items[i].name, c->name); cp_items[i].tag = c->tag; cp_items[i].value = NULL; // no string by default cp_items[i].off = ftell(fd)-1; /* read bytes */ switch (c->tag) { case 1: // utf 8 string fread (buf, 2, 1, fd); sz = USHORT (buf,0); //cp_items[i].len = sz; fread(buf, sz, 1, fd); buf[sz] = '\0'; break; default: fread(buf, c->len, 1, fd); } memcpy (cp_items[i].bytes, buf, 5); /* parse value */ switch(c->tag) { case 1: V printf ("%s\n", buf); cp_items[i].value = strdup(buf); break; case 7: V printf ("%d\n", USHORT(buf,0)); break; case 8: V printf ("string ptr %d\n", USHORT(buf, 0)); break; case 9: case 11: case 10: // METHOD REF V printf("class = %d, ", USHORT(buf,0)); V printf("name_type = %d\n", USHORT(buf,2)); break; case 12: V printf("name = %d, ", USHORT(buf,0)); V printf("descriptor = %d\n", USHORT(buf,2)); break; default: V printf("%d\n", UINT(buf, 40)); } } fread (&cf2, sizeof (RBinJavaClass2), 1, fd); check_eof(fd); V printf("Access flags: 0x%04x\n", cf2.access_flags); this_class = r_num_ntohs (cf2.this_class); V printf ("This class: %d\n", this_class); check_eof (fd); //printf("This class: %d (%s)\n", ntohs(cf2.this_class), cp_items[ntohs(cf2.this_class)-1].value); // XXX this is a double pointer !!1 //printf("Super class: %d (%s)\n", ntohs(cf2.super_class), cp_items[ntohs(cf2.super_class)-1].value); sz = read_short (fd); V printf ("Interfaces count: %d\n", sz); if (sz>0) { fread (buf, sz*2, 1, fd); sz = read_short (fd); for (i=0; i<sz; i++) { eprintf ("interfaces: TODO\n"); } } sz = read_short(fd); V printf("Fields count: %d\n", sz); if (sz>0) { for (i=0;i<sz;i++) { fread(buf, 8, 1, fd); V printf("%2d: Access Flags: %d\n", i, USHORT(buf, 0)); V printf(" Name Index: %d (%s)\n", USHORT(buf, 2), get_cp(USHORT(buf,2)-1)->value); V printf(" Descriptor Index: %d\n", USHORT(buf, 4)); //, cp_items[USHORT(buf, 4)-1].value); sz2 = USHORT(buf, 6); V printf(" field Attributes Count: %d\n", sz2); attributes_walk(fd, sz2, 1, verbose); } } sz = read_short(fd); V printf("Methods count: %d\n", sz); if (sz>0) { for (i=0;i<sz;i++) { fread(buf, 8, 1, fd); check_eof(fd); V printf("%2d: Access Flags: %d\n", i, USHORT(buf, 0)); V printf(" Name Index: %d (%s)\n", USHORT(buf, 2), get_cp(USHORT(buf, 2)-1)->value); V printf(" Descriptor Index: %d (%s)\n", USHORT(buf, 4), get_cp(USHORT(buf, 4)-1)->value); sz2 = USHORT(buf, 6); V printf(" method Attributes Count: %d\n", sz2); attributes_walk(fd, sz2, 0, verbose); } } fclose(fd); return 0; }