⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classview.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
📖 第 1 页 / 共 2 页
字号:
			ht_snprintf(info, sizeof info, "line number table entry [%08x]:", i);			cs->init(f, s2, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(f, g2, 1, "line number table", 1);		g->insertsub(cs2);		break;	case ATTRIB_InnerClasses:		s->add_staticmask_ptable(ainn_hdr, a->offset, true);		f->seek(a->offset+6);		f->read(inp, 2);		j = a->offset + 6 + 2;		tabl_len = (((u2)inp[0]<<8)|inp[1]);		g2 = new ht_group_sub();		g2->init(f);		if (!tabl_len) {			s2 = new ht_mask_sub();			s2->init(f, (*idx)++);			s2->add_mask("<none>");			g2->insertsub(s2);		}		for (i=0; i<tabl_len; i++) {			s2 = new ht_mask_sub();			s2->init(f, (*idx)++);			s2->add_staticmask_ptable(ainn_info, j+i*8, true);			cs = new ht_collapsable_sub();			ht_snprintf(info, sizeof info, "classes entry [%08x]:", i);			cs->init(f, s2, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(f, g2, 1, "classes", 1);		g->insertsub(cs2);		break;	case ATTRIB_Exceptions:		s->add_staticmask_ptable(axpt_hdr, a->offset, true);		f->seek(a->offset+6);		f->read(inp, 2);		j = a->offset + 6 + 2;		tabl_len = (((u2)inp[0]<<8)|inp[1]);		g2 = new ht_group_sub();		g2->init(f);		if (!tabl_len) {			s2 = new ht_mask_sub();			s2->init(f, (*idx)++);			s2->add_mask("<none>");			g2->insertsub(s2);		}		for (i=0; i<tabl_len; i++) {			s2 = new ht_mask_sub();			s2->init(f, (*idx)++);			s2->add_staticmask_ptable(ainn_info, j+i*2, true);			cs = new ht_collapsable_sub();			ht_snprintf(info, sizeof info, "exception index table entry [%08x]:", i);			cs->init(f, s2, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(f, g2, 1, "exception index table", 1);		g->insertsub(cs2);		break;	case ATTRIB_LocalVariableTable:		s->add_staticmask_ptable(aloc_hdr, a->offset, true);		f->seek(a->offset+6);		f->read(inp, 2);		j = a->offset + 6 + 2;		tabl_len = (((u2)inp[0]<<8)|inp[1]);		g2 = new ht_group_sub();		g2->init(f);		if (!tabl_len) {			s2 = new ht_mask_sub();			s2->init(f, (*idx)++);			s2->add_mask("<none>");			g2->insertsub(s2);		}		for (i=0; i<tabl_len; i++) {			s2 = new ht_mask_sub();			s2->init(f, (*idx)++);			s2->add_staticmask_ptable(aloc_info, j+i*10, true);			cs = new ht_collapsable_sub();			ht_snprintf(info, sizeof info, "local variable table entry [%08x]:", i);			cs->init(f, s2, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(f, g2, 1, "local variable table", 1);		g->insertsub(cs2);		break;	case ATTRIB_Synthetic:	case ATTRIB_Deprecated:	default:		break;	}}static void mf_view(ht_group_sub *g, File *f,	   unsigned *idx, classfile *c, mf_info *mf){	ht_group_sub *g2, *g3;	ht_mask_sub *s;	ht_collapsable_sub *cs, *cs2;	char info[128];	s = new ht_mask_sub();	s->init(f, (*idx)++);	s->add_staticmask_ptable(mf_hdr, mf->offset, true);	g->insertsub(s);	g2 = new ht_group_sub();	g2->init(f);	if (!mf->attribs_count) {		s = new ht_mask_sub();		s->init(f, (*idx)++);		s->add_mask("<none>");		g2->insertsub(s);	}	for (uint i=0; i<mf->attribs_count; i++) {		g3 = new ht_group_sub();		g3->init(f);		attrib_view(g3, f, idx, c, mf->attribs[i]);		cs = new ht_collapsable_sub();		ht_snprintf(info, sizeof info, "attribute entry [%08x]: %s", i, c->cpool[mf->attribs[i]->name]->value.string);		cs->init(f, g3, 1, info, 1);		g2->insertsub(cs);	}	cs2 = new ht_collapsable_sub();	cs2->init(f, g2, 1, "attributes", 1);	g->insertsub(cs2);}static ht_view *class_view(Bounds *b, File *file, ht_format_group *group){	ht_mask_sub *s;	ht_collapsable_sub *cs, *cs2;	ht_group_sub *g, *g2, *g3;	classfile *clazz;	char info[128];	unsigned i, j, idx = 0;	clazz = ((ht_class_shared_data *)group->get_shared_data())->file;	if (clazz) {		ht_uformat_viewer *v = new ht_uformat_viewer();		v->init(b, DESC_JAVA_HEADERS, VC_EDIT, file, group);		registerAtom(ATOM_CLS_ACCESS, access_flags);		registerAtom(ATOM_CLS_CPOOL,  cpool_tags);		g = new ht_group_sub();		g->init(file);  		s = new ht_mask_sub();		s->init(file, idx++);		s->add_staticmask_ptable(cls_class1_hdr, clazz->offset, true);		g->insertsub(s);		g2 = new ht_group_sub();		g2->init(file);		for (i=1; i < clazz->cpool_count; i++) {			s = new ht_mask_sub();			s->init(file, idx++);			s->add_staticmask_ptable(cpool_hdr, clazz->cpool[i]->offset, true);			switch (clazz->cpool[i]->tag) {			case CONSTANT_Utf8:				s->add_staticmask_ptable(cpool_utf8, clazz->cpool[i]->offset, true);				break;			case CONSTANT_Integer:			case CONSTANT_Float:				s->add_staticmask_ptable(cpool_if, clazz->cpool[i]->offset, true);				break;			case CONSTANT_Long:			case CONSTANT_Double:				s->add_staticmask_ptable(cpool_ld, clazz->cpool[i]->offset, true);				break;			case CONSTANT_Class:				s->add_staticmask_ptable(cpool_class, clazz->cpool[i]->offset, true);				break;			case CONSTANT_String:				s->add_staticmask_ptable(cpool_str, clazz->cpool[i]->offset, true);				break;			case CONSTANT_Fieldref:			case CONSTANT_Methodref:			case CONSTANT_InterfaceMethodref:				s->add_staticmask_ptable(cpool_fmi, clazz->cpool[i]->offset, true);				break;			case CONSTANT_NameAndType:				s->add_staticmask_ptable(cpool_nat, clazz->cpool[i]->offset, true);				break;			}			cs = new ht_collapsable_sub();			ht_snprintf(info, sizeof info, "constant pool entry [%08x]: %s", i,					(clazz->cpool[i]->tag == CONSTANT_Utf8) 					? clazz->cpool[i]->value.string : "");			cs->init(file, s, 1, info, 1);			g2->insertsub(cs);			if (clazz->cpool[i]->tag == CONSTANT_Long			 || clazz->cpool[i]->tag == CONSTANT_Double) {				i++;			}		}		cs2 = new ht_collapsable_sub();		cs2->init(file, g2, 1, "constant pool", 1);		g->insertsub(cs2);		s = new ht_mask_sub();		s->init(file, idx++);		s->add_staticmask_ptable(cls_class2_hdr, clazz->coffset, true);		g->insertsub(s);		g2 = new ht_group_sub();		g2->init(file);		if (!clazz->interfaces_count) {			s = new ht_mask_sub();			s->init(file, idx++);			s->add_mask("<none>");			g2->insertsub(s);		}		for (i=0; i < clazz->interfaces_count; i++) {			s = new ht_mask_sub();			s->init(file, idx++);			s->add_staticmask_ptable(iface_hdr, clazz->coffset+8+i*2, true);			cs = new ht_collapsable_sub();			j = clazz->cpool[clazz->interfaces[i]]->value.llval[0];			ht_snprintf(info, sizeof info, "interface entry [%08x]: %s", i,				clazz->cpool[j]->value.string);			cs->init(file, s, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(file, g2, 1, "interfaces", 1);		g->insertsub(cs2);		s = new ht_mask_sub();		s->init(file, idx++);		s->add_staticmask_ptable(field_hdr, clazz->foffset, true);		g->insertsub(s);		g2 = new ht_group_sub();		g2->init(file);		if (!clazz->fields_count) {			s = new ht_mask_sub();			s->init(file, idx++);			s->add_mask("<none>");			g2->insertsub(s);		}		for (i=0; i < clazz->fields_count; i++) {			g3 = new ht_group_sub();			g3->init(file);			mf_view(g3, file, &idx, clazz, clazz->fields[i]);			cs = new ht_collapsable_sub();			ht_snprintf(info, sizeof info, "field entry [%08x]: %s", i, clazz->fields[i]->name);				cs->init(file, g3, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(file, g2, 1, "fields", 1);		g->insertsub(cs2);		s = new ht_mask_sub();		s->init(file, idx++);		s->add_staticmask_ptable(method_hdr, clazz->moffset, true);		g->insertsub(s);		g2 = new ht_group_sub();		g2->init(file);		if (!clazz->methods_count) {			s = new ht_mask_sub();			s->init(file, idx++);			s->add_mask("<none>");			g2->insertsub(s);		}		for (i=0; i<clazz->methods_count; i++) {			g3 = new ht_group_sub();			g3->init(file);			mf_view(g3, file, &idx, clazz, clazz->methods[i]);			cs = new ht_collapsable_sub();			ht_snprintf(info, sizeof info, "method entry [%08x]: %s", i, clazz->methods[i]->name);			cs->init(file, g3, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(file, g2, 1, "methods", 1);		g->insertsub(cs2);		s = new ht_mask_sub();		s->init(file, idx++);		s->add_staticmask_ptable(atr_hdr, clazz->aoffset, true);		g->insertsub(s);		g2 = new ht_group_sub();		g2->init(file);		if (!clazz->attribs_count) {			s = new ht_mask_sub();			s->init(file, idx++);			s->add_mask("<none>");			g2->insertsub(s);		}		for (i = 0; i < clazz->attribs_count; i++) {			g3 = new ht_group_sub();			g3->init(file);			attrib_view(g3, file, &idx, clazz, clazz->attribs[i]);			cs = new ht_collapsable_sub();			j = clazz->attribs[i]->name;			ht_snprintf(info, sizeof info, "attribute entry [%08x]: %s", i,			    clazz->cpool[j]->value.string);			cs->init(file, g3, 1, info, 1);			g2->insertsub(cs);		}		cs2 = new ht_collapsable_sub();		cs2->init(file, g2, 1, "attributes", 1);		g->insertsub(cs2);		v->insertsub(g);		return v;	} else {		return NULL;	}}void cview::init(Bounds *b, File *f, format_viewer_if **ifs,		  ht_format_group *g, FileOfs header_ofs, void *shared){	ht_format_group::init(b, VO_SELECTABLE | VO_BROWSABLE | VO_RESIZE, DESC_JAVA, f, false, true, 0, g);	shared_data = shared;	ht_format_group::init_ifs(ifs);}void cview::done(){	ht_format_group::done();	ht_class_shared_data *clazz = (ht_class_shared_data *)shared_data;	if (clazz) {		class_unread(clazz);	}}static format_viewer_if htcls_cview = {	&class_view,	0};static format_viewer_if *htcls_ifs[] = {	&htcls_cview,	&htclassimage_if,	0};static ht_view *class_init(Bounds *b, File *file, ht_format_group *group){	u1 magic[4];	file->seek(0);	file->read(magic, 4);	if (magic[0] == 0xca && magic[1] == 0xfe	 && magic[2] == 0xba && magic[3] == 0xbe) {		file->seek(0);		void *shared_data = (void*)class_read(file);		if (!shared_data) return NULL;		cview *c = new cview();		c->init(b, file, htcls_ifs, group, 0, shared_data);		return c;	}	return NULL;}format_viewer_if htcls_if = {	&class_init,	0};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -