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

📄 asm.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
字号:
/* *	HT Editor *	asm.cc * *	Copyright (C) 1999-2002 Stefan Weyergraf * *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License version 2 as *	published by the Free Software Foundation. * *	This program is distributed in the hope that it will be useful, *	but WITHOUT ANY WARRANTY; without even the implied warranty of *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *	GNU General Public License for more details. * *	You should have received a copy of the GNU General Public License *	along with this program; if not, write to the Free Software *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <cstring>#include <cstdio>#include <stdarg.h>#include <limits.h>#include "asm.h"#include "data.h"#include "atom.h"#include "htdebug.h"#include "snprintf.h"#include "alphadis.h"#include "ia64dis.h"#include "ildis.h"#include "javadis.h"#include "x86dis.h"#include "ppcdis.h"#include "armdis.h"/* *	CLASS Assembler */Assembler::Assembler(bool b){	codes = 0;	bigendian = b;}Assembler::~Assembler(){	free_asm_codes();}asm_insn *Assembler::alloc_insn(){	return NULL;}void Assembler::deletecode(asm_code *code){	asm_code **p=&codes, *c=codes;	while (c) {		if (c == code) {			*p = c->next;			delete c;			return;		}		c = c->next;		p = &(*p)->next;	}}asm_code *Assembler::encode(asm_insn *asm_insn, int _options, CPU_ADDR cur_address){	free_asm_codes();	error = 0;	options = _options;	return 0;}void Assembler::clearcode(){	code.size = 0;}void Assembler::emitbyte(byte b){	code.data[code.size] = b;	code.size++;}void Assembler::emitword(uint16 w){	if (bigendian) {		code.data[code.size+1] = (byte)w;		code.data[code.size+0] = (byte)(w>>8);	} else {		code.data[code.size+0] = (byte)w;		code.data[code.size+1] = (byte)(w>>8);	}	code.size += 2;}void Assembler::emitdword(uint32 d){	if (bigendian) {		code.data[code.size+3] = (byte)d;		code.data[code.size+2] = (byte)(d>>8);		code.data[code.size+1] = (byte)(d>>16);		code.data[code.size+0] = (byte)(d>>24);	} else {		code.data[code.size+0] = (byte)d;		code.data[code.size+1] = (byte)(d>>8);		code.data[code.size+2] = (byte)(d>>16);		code.data[code.size+3] = (byte)(d>>24);	}	code.size += 4;}void Assembler::emitqword(uint64 q){	if (bigendian) {		code.data[code.size+7] = (byte)q;		code.data[code.size+6] = (byte)(q>>8);		code.data[code.size+5] = (byte)(q>>16);		code.data[code.size+4] = (byte)(q>>24);		code.data[code.size+3] = (byte)(q>>32);		code.data[code.size+2] = (byte)(q>>40);		code.data[code.size+1] = (byte)(q>>48);		code.data[code.size+0] = (byte)(q>>56);	} else {		code.data[code.size+0] = (byte)q;		code.data[code.size+1] = (byte)(q>>8);		code.data[code.size+2] = (byte)(q>>16);		code.data[code.size+3] = (byte)(q>>24);		code.data[code.size+4] = (byte)(q>>32);		code.data[code.size+5] = (byte)(q>>40);		code.data[code.size+6] = (byte)(q>>48);		code.data[code.size+7] = (byte)(q>>56);	}	code.size += 8;}void Assembler::free_asm_codes(){	while (codes) {		asm_code *t = codes->next;		delete codes;		codes = t;	}}const char *Assembler::get_error_msg(){	return error_msg;}const char *Assembler::get_name(){	return "generic asm";}void Assembler::newcode(){	code.size = 0;}asm_code *Assembler::shortest(asm_code *codes){	asm_code *best = NULL;	int bestv = INT_MAX;	while (codes) {		if (codes->size < bestv) {			best = codes;			bestv = codes->size;		}		codes = codes->next;	}	return best;}void Assembler::pushcode(){	asm_code **t=&codes;	while (*t) {		t = &(*t)->next;	}	*t = new asm_code;	memcpy(*t, &code, sizeof code);	(*t)->next = NULL;}void Assembler::set_error_msg(const char *format, ...){	va_list arg;	va_start(arg, format);	vsprintf(error_msg, format, arg);	va_end(arg);	error=1;}void Assembler::set_imm_eval_proc(int (*p)(void *context, const char *s, uint64 &v), void *c){	imm_eval_proc = p;	imm_eval_context = c;}/* *	CLASS disassembler */Disassembler::Disassembler(){	disable_highlighting();}void Disassembler::load(ObjectStream &f){	disable_highlighting();}char* (*addr_sym_func)(CPU_ADDR addr, int *symstrlen, void *context) = NULL;void* addr_sym_func_context = NULL;dis_insn *Disassembler::createInvalidInsn(){	return NULL;}void Disassembler::hexd(char **s, int size, int options, uint32 imm){	char ff[16];	char *f = (char*)&ff;	char *t = *s;	*f++ = '%';	if (imm >= 0 && imm <= 9) {		*s += sprintf(*s, "%d", imm);	} else if (options & DIS_STYLE_SIGNED) {		if (!(options & DIS_STYLE_HEX_NOZEROPAD)) f += sprintf(f, "0%d", size);		*f++ = 'd';		*f = 0;		*s += sprintf(*s, ff, imm);	} else {		if (options & DIS_STYLE_HEX_CSTYLE) *f++ = '#';		if (!(options & DIS_STYLE_HEX_NOZEROPAD)) f += sprintf(f, "0%d", size);		if (options & DIS_STYLE_HEX_UPPERCASE) *f++ = 'X'; else			*f++ = 'x';		if (options & DIS_STYLE_HEX_ASMSTYLE) *f++ = 'h';		*f = 0;		*s += sprintf(*s, ff, imm);		if ((options & DIS_STYLE_HEX_NOZEROPAD) && (*t-'0'>9)) {			memmove(t+1, t, strlen(t)+1);			*t = '0';			(*s)++;		}	}}void Disassembler::hexq(char **s, int size, int options, uint64 imm){	char ff[32];	char *f = (char*)&ff;	char *t = *s;	*f++ = '%';	if (imm >= 0 && imm <= 9) {		*s += ht_snprintf(*s, 32, "%qd", imm);	} else if (options & DIS_STYLE_SIGNED) {		if (!(options & DIS_STYLE_HEX_NOZEROPAD)) f += sprintf(f, "0%d", size);		*f++ = 'q';		*f++ = 'd';		*f = 0;		*s += ht_snprintf(*s, 32, ff, imm);	} else {		if (options & DIS_STYLE_HEX_CSTYLE) *f++ = '#';		if (!(options & DIS_STYLE_HEX_NOZEROPAD)) f += sprintf(f, "0%d", size);		if (options & DIS_STYLE_HEX_UPPERCASE) *f++ = 'X'; else		*f++ = 'q';		*f++ = 'x';		if (options & DIS_STYLE_HEX_ASMSTYLE) *f++ = 'h';		*f = 0;		*s += ht_snprintf(*s, 32, ff, imm);		if ((options & DIS_STYLE_HEX_NOZEROPAD) && (*t-'0'>9)) {			memmove(t+1, t, strlen(t)+1);			*t = '0';			(*s)++;		}	}}bool Disassembler::selectNext(dis_insn *disasm_insn){	return false;}const char *Disassembler::str(dis_insn *disasm_insn, int style){	return strf(disasm_insn, style, DISASM_STRF_DEFAULT_FORMAT);}const char *Disassembler::get_cs(AsmSyntaxHighlightEnum style){	const char *highlights[] = {		ASM_SYNTAX_DEFAULT,		ASM_SYNTAX_COMMENT,		ASM_SYNTAX_NUMBER,		ASM_SYNTAX_SYMBOL,		ASM_SYNTAX_STRING	};	return highlight ? highlights[(int)style] : "";}void Disassembler::enable_highlighting(){	highlight = true;}void Disassembler::disable_highlighting(){	highlight = false;}BUILDER(ATOM_DISASM_X86, x86dis, Disassembler)BUILDER(ATOM_DISASM_X86_64, x86_64dis, x86dis)BUILDER(ATOM_DISASM_X86_VXD, x86dis_vxd, x86dis)BUILDER(ATOM_DISASM_ALPHA, Alphadis, Disassembler)BUILDER(ATOM_DISASM_JAVA, javadis, Disassembler)BUILDER(ATOM_DISASM_IA64, IA64Disassembler, Disassembler)BUILDER(ATOM_DISASM_PPC, PPCDisassembler, Disassembler)BUILDER(ATOM_DISASM_IL, ILDisassembler, Disassembler)BUILDER(ATOM_DISASM_ARM, ArmDisassembler, Disassembler)bool init_asm(){	REGISTER(ATOM_DISASM_X86, x86dis)	REGISTER(ATOM_DISASM_X86_VXD, x86dis_vxd)	REGISTER(ATOM_DISASM_ALPHA, Alphadis)	REGISTER(ATOM_DISASM_JAVA, javadis)	REGISTER(ATOM_DISASM_IA64, IA64Disassembler)	REGISTER(ATOM_DISASM_PPC, PPCDisassembler)	REGISTER(ATOM_DISASM_IL, ILDisassembler)	REGISTER(ATOM_DISASM_X86_64, x86_64dis)	REGISTER(ATOM_DISASM_ARM, ArmDisassembler)	return true;}void done_asm(){	UNREGISTER(ATOM_DISASM_ARM, ArmDisassembler)	UNREGISTER(ATOM_DISASM_X86_64, x86dis)	UNREGISTER(ATOM_DISASM_IL, ILDisassembler)	UNREGISTER(ATOM_DISASM_PPC, PPCDisassembler)	UNREGISTER(ATOM_DISASM_IA64, IA64Disassembler)	UNREGISTER(ATOM_DISASM_JAVA, javadis)	UNREGISTER(ATOM_DISASM_ALPHA, Alphadis)	UNREGISTER(ATOM_DISASM_X86_VXD, x86dis_vxd)	UNREGISTER(ATOM_DISASM_X86, x86dis)}

⌨️ 快捷键说明

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