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

📄 htle.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
📖 第 1 页 / 共 2 页
字号:
		createHostStruct(&le_shared->objmap.header[i], LE_OBJECT_HEADER_struct, le_shared->byteorder);		/* sum up page sizes to find object's physical size */		uint psize = 0;		for (uint j=0; j<le_shared->objmap.header[i].page_map_count; j++) {			psize += le_shared->pagemap.psize[j+le_shared->objmap.header[i].page_map_index-1];			/* FIXME: security hole: array-index uncontrolled */			if (j == le_shared->objmap.header[i].page_map_count-1)				le_shared->pagemap.vsize[j+le_shared->objmap.header[i].page_map_index-1]=le_shared->objmap.header[i].vsize % le_shared->hdr.pagesize;			else				le_shared->pagemap.vsize[j+le_shared->objmap.header[i].page_map_index-1]=le_shared->hdr.pagesize;		}// FIXME: alternative which one is right ???#if 1		le_shared->objmap.psize[i] = MIN(psize, le_shared->objmap.header[i].vsize);		le_shared->objmap.vsize[i] = MIN(psize, le_shared->objmap.header[i].vsize);#else		le_shared->objmap.psize[i] = le_shared->objmap.header[i].vsize;		le_shared->objmap.vsize[i] = le_shared->objmap.header[i].vsize;#endif	}/* create temporary address space for LEAddress's *//*	le_shared->le_addr = ht_malloc(sizeof *le_shared->le_addr * le_shared->objmap.count);	uint a = 0;	for (uint i = 0; i<le_shared->objmap.count; i++) {		le_shared->le_addr[i] = a;		a += le_shared->objmap.header[i].page_map_count * le_shared->hdr.pagesize;	}*/}void ht_le::loc_enum_start(){//	loc_enum=true;}bool ht_le::loc_enum_next(ht_format_loc *loc){#if 0	ht_le_shared_data *sh=(ht_le_shared_data*)shared_data;	if (loc_enum) {		loc->name="le";		loc->start=sh->hdr_ofs;		loc->length=file->get_size()-loc->start;	/* FIXME: ENOTOK */				loc_enum=false;		return true;	}#endif		return false;}/* *	CLASS ht_le_page_file */ht_le_page_file::ht_le_page_file(File *file, bool own_file, ht_le_pagemap *pm, uint32 pms, uint32 ps)	: FileLayer(file, own_file){	pagemap = pm;	pagemapsize = pms;	page_size = ps;	ofs = 0;}bool ht_le_page_file::isdirty(FileOfs offset, FileOfs range){	FileOfs mofs;	FileOfs msize;	while (range) {		FileOfs s = range;		if (!map_ofs(offset, &mofs, &msize)) break;		if (s > msize) s = msize;		bool isdirty;		mFile->cntl(FCNTL_MODS_IS_DIRTY, mofs, s, &isdirty);		if (isdirty) return true;		range -= s;		ofs += s;	}	return false;}/** *	Map a paged and linearized LE offset to its corresponding *	physical file offset */bool ht_le_page_file::map_ofs(uint32 lofs, FileOfs *pofs, FileOfs *maxsize){	uint i = lofs / page_size, j = lofs % page_size;	if (i < pagemapsize) {		if (j < pagemap->vsize[i]) {			*pofs = pagemap->offset[i]+j;			*maxsize = pagemap->vsize[i]-j;			return true;		}	}	return false;}bool ht_le_page_file::unmap_ofs(FileOfs pofs, uint32 *lofs){	for (uint i=0; i<pagemapsize; i++) {		if ((pofs >= pagemap->offset[i]) && (pofs < pagemap->offset[i]+pagemap->vsize[i])) {			*lofs = pofs - pagemap->offset[i] + i*page_size;			return true;		}	}	return false;}uint ht_le_page_file::read(void *aBuf, uint size){	FileOfs mofs;	FileOfs msize;	int c = 0;	byte *buf = (byte *)aBuf;	while (size) {		uint s = size;		if (!map_ofs(ofs, &mofs, &msize)) break;		if (s > msize) s = msize;		mFile->seek(mofs);		s = mFile->read(buf, s);		if (!s) break;		buf += s;		size -= s;		c += s;		ofs += s;	}	return c;}void ht_le_page_file::seek(FileOfs offset){	ofs = offset;}FileOfs ht_le_page_file::tell() const{	return ofs;}int ht_le_page_file::vcntl(uint cmd, va_list vargs){	switch (cmd) {		case FCNTL_MODS_CLEAR_DIRTY_RANGE: {			FileOfs o = va_arg(vargs, FileOfs);			FileOfs s = va_arg(vargs, FileOfs);			FileOfs ts, ms;			int e;			do {				if (!map_ofs(o, &o, &ms)) return EINVAL;				ts = (s < ms) ? s : ms;				e = FileLayer::cntl(cmd, o, ts);				if (e) return e;				s -= ts;			} while (s);			return 0;		}		case FCNTL_MODS_IS_DIRTY: {			FileOfs o = va_arg(vargs, FileOfs);			FileOfs s = va_arg(vargs, FileOfs);			bool *b = va_arg(vargs, bool*);			FileOfs ts, ms;			int e;			*b = false;			do {				if (!map_ofs(o, &o, &ms)) return EINVAL;				ts = (s < ms) ? s : ms;				e = mFile->cntl(cmd, o, ts, b);				if (e) return e;				if (*b) break;				s -= ts;			} while (s);			return 0;		}	}	return FileLayer::vcntl(cmd, vargs);}uint ht_le_page_file::write(const void *aBuf, uint size){	FileOfs mofs;	FileOfs msize;	int c = 0;	const byte *buf = (const byte *)aBuf;	while (size) {		uint s = size;		if (!map_ofs(ofs, &mofs, &msize)) break;		if (s>msize) s = msize;		mFile->seek(mofs);		buf += mFile->write(buf, s);		size -= s;		c += s;		ofs += s;	}	return c;}/* *	CLASS ht_le_reloc_entry */ht_le_reloc_entry::ht_le_reloc_entry(uint o, uint s, LEAddress a, uint8 at, uint8 rt){	ofs = o;	seg = s;	addr = a;	address_type = at;	reloc_type = rt;}/* *	CLASS ht_le_reloc_file */ht_le_reloc_file::ht_le_reloc_file(File *s, bool os, ht_le_shared_data *d)	: ht_reloc_file(s, os){	data = d;}void ht_le_reloc_file::reloc_apply(Object *reloc, byte *data){	ht_le_reloc_entry *e = (ht_le_reloc_entry*)reloc;	switch (e->address_type & LE_FIXUP_ADDR_TYPE_MASK) {		case LE_FIXUP_ADDR_TYPE_0_8:			createForeignInt(data, e->addr, 1, little_endian);			break;		case LE_FIXUP_ADDR_TYPE_16_0:			createForeignInt(data, e->seg, 2, little_endian);			break;		case LE_FIXUP_ADDR_TYPE_16_16:			createForeignInt(data, e->addr, 2, little_endian);			createForeignInt(data, e->seg, 2, little_endian);			break;		case LE_FIXUP_ADDR_TYPE_0_16:			createForeignInt(data, e->addr, 2, little_endian);			break;		case LE_FIXUP_ADDR_TYPE_16_32:			createForeignInt(data, e->addr, 4, little_endian);			createForeignInt(data, e->seg, 2, little_endian);			break;		case LE_FIXUP_ADDR_TYPE_0_32:			createForeignInt(data, e->addr, 4, little_endian);			break;		case LE_FIXUP_ADDR_TYPE_REL32:			createForeignInt(data, e->addr - LE_BASE_ADDR - e->ofs - 4, 4, little_endian);			break;	}}bool ht_le_reloc_file::reloc_unapply(Object *reloc, byte *data){	return false;}/* * */FileOfs LE_get_seg_ofs(ht_le_shared_data *LE_shared, uint i){	assert(i<LE_shared->objmap.count);	return LE_SEG_ADDR(i) - LE_BASE_ADDR;}LEAddress LE_get_seg_addr(ht_le_shared_data *LE_shared, uint i){	assert(i<LE_shared->objmap.count);	return LE_SEG_ADDR(i);}uint LE_get_seg_psize(ht_le_shared_data *LE_shared, uint i){	assert(i<LE_shared->objmap.count);	return LE_shared->objmap.psize[i];}uint LE_get_seg_vsize(ht_le_shared_data *LE_shared, uint i){	assert(i<LE_shared->objmap.count);	return LE_shared->objmap.vsize[i];}bool LE_addr_to_segment(ht_le_shared_data *LE_shared, LEAddress Addr, int *segment){	for (uint i = 0; i < LE_shared->objmap.count; i++) {		LEAddress base = LE_get_seg_addr(LE_shared, i);		uint evsize = MAX(LE_get_seg_vsize(LE_shared, i), LE_get_seg_psize(LE_shared, i));		if ((Addr >= base) && (Addr < base + evsize)) {			*segment = i;			return true;		}	}	return false;}bool LE_addr_is_physical(ht_le_shared_data *LE_shared, LEAddress Addr){	for (uint i = 0; i < LE_shared->objmap.count; i++) {		LEAddress base = LE_get_seg_addr(LE_shared, i);		uint psize = LE_get_seg_psize(LE_shared, i);		if ((Addr >= base) && (Addr < base + psize)) return true;	}	return false;}bool LE_addr_to_ofs(ht_le_shared_data *LE_shared, LEAddress Addr, FileOfs *ofs){	for (uint i = 0; i < LE_shared->objmap.count; i++) {		LEAddress base = LE_get_seg_addr(LE_shared, i);		uint psize = LE_get_seg_psize(LE_shared, i);		if ((Addr >= base) && (Addr < base + psize)) {			*ofs = Addr - LE_BASE_ADDR;			return true;		}	}	return false;}bool LE_ofs_to_addr(ht_le_shared_data *LE_shared, FileOfs ofs, LEAddress *Addr){	for (uint i = 0; i < LE_shared->objmap.count; i++) {		FileOfs sofs = LE_get_seg_ofs(LE_shared, i);		if ((ofs >= sofs) && (ofs < sofs + LE_get_seg_psize(LE_shared, i))) {			*Addr = LE_BASE_ADDR + ofs;			return true;		}	}	return false;}LEAddress LE_MAKE_ADDR(ht_le_shared_data *LE_shared, uint16 seg, uint32 ofs){	return LE_SEG_ADDR(seg) + ofs;}uint16 LE_ADDR_SEG(ht_le_shared_data *LE_shared, LEAddress a){	for (uint i = 0; i<LE_shared->objmap.count; i++) {		LEAddress addr = LE_SEG_ADDR(i);		if ((a >= addr) && (a < addr + LE_shared->objmap.vsize[i])) {			return i;		}	}	return 0xffff;}uint32 LE_ADDR_OFS(ht_le_shared_data *LE_shared, LEAddress a){	for (uint i = 0; i<LE_shared->objmap.count; i++) {		LEAddress addr = LE_SEG_ADDR(i);		if ((a >= addr) && (a < addr + LE_shared->objmap.vsize[i])) {			return a-addr;		}	}	return 0;}

⌨️ 快捷键说明

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