亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? analy_x86.cc

?? 功能較全面的反匯編器:反匯編器ht-2.0.15.tar.gz
?? CC
字號:
/*  *	HT Editor *	analy_x86.cc * *	Copyright (C) 1999-2002 Sebastian Biallas (sb@biallas.net) * *	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 <string.h>#include "analy_register.h"#include "analy_x86.h"#include "htdebug.h"#include "snprintf.h"#include "x86dis.h"bool AddressX86Flat32::add(int offset){	// check for overflow	if ((int)offset < 0) {		if (addr+offset > addr) return false;	} else {		if (addr+offset < addr) return false;	}	addr+=offset;	return true;}int AddressX86Flat32::byteSize(){	return 4;}int AddressX86Flat32::compareTo(const Object *obj) const{	assert(getObjectID() == obj->getObjectID());	if (addr > ((AddressX86Flat32 *)obj)->addr) return 1;	if (addr < ((AddressX86Flat32 *)obj)->addr) return -1;	return 0;}int AddressX86Flat32::compareDelinear(Address *to){	assert(getObjectID() == to->getObjectID());	uint32 da = delinearize(addr);	uint32 db = delinearize(((AddressFlat32 *)to)->addr);	if (da > db) return 1;	if (da < db) return -1;	return 0;}bool AddressX86Flat32::difference(int &result, Address *to){	if (getObjectID() == to->getObjectID()) {		result = addr-((AddressX86Flat32 *)to)->addr;		return true;	} else {		return false;	}}AddressX86Flat32 *AddressX86Flat32::clone() const{	return new AddressX86Flat32(*this);}void AddressX86Flat32::getFromArray(const byte *array){	UNALIGNED_MOVE(addr, *(uint32*)array);}void AddressX86Flat32::getFromCPUAddress(CPU_ADDR *ca){	addr = ca->addr32.offset;}bool AddressX86Flat32::getFromUInt64(uint64 u){	if (u <= 0xffffffff) {		addr = u;		return true;	} else {		return false;	}}void AddressX86Flat32::load(ObjectStream &s){	GET_INT32X(s, addr);}ObjectID AddressX86Flat32::getObjectID() const{	return ATOM_ADDRESS_X86_FLAT_32;}int AddressX86Flat32::parseString(const char *s, int length, Analyser *a){	return 0;}void AddressX86Flat32::putIntoArray(byte *array) const{	UNALIGNED_MOVE(*(uint32*)array, addr);}void AddressX86Flat32::putIntoCPUAddress(CPU_ADDR *ca) const{	ca->addr32.offset = addr;}bool AddressX86Flat32::putIntoUInt64(uint64 &u) const{	u = addr;	return true;}void AddressX86Flat32::store(ObjectStream &s) const{	PUT_INT32X(s, addr);}int AddressX86Flat32::stringify(char *s, int max_length, int format) const{	const char *formats[] = {		"%s%x%s",		"%s%8x%s",		"%s%08x%s",		"",		"%s%X%s",		"%s%8X%s",		"%s%08X%s",		"",	};	return ht_snprintf(s, max_length, formats[format&7], (format & ADDRESS_STRING_FORMAT_ADD_0X) ? "0x":"", addr, (format & ADDRESS_STRING_FORMAT_ADD_H) ? "h":"");}int AddressX86Flat32::stringSize() const{	return 8;}AddressX86_1632::AddressX86_1632(uint16 Seg, uint32 Addr){	seg = Seg;	addr = Addr;}bool AddressX86_1632::add(int offset){	// check for overflow	if ((int)offset < 0) {		if (addr+offset > addr) return false;	} else {		if (addr+offset < addr) return false;	}	addr+=offset;	return true;}int AddressX86_1632::byteSize(){	return 6;}int AddressX86_1632::compareTo(const Object *obj) const{	assert(getObjectID() == obj->getObjectID());	if (seg > ((AddressX86_1632 *)obj)->seg) return 1;	if (seg < ((AddressX86_1632 *)obj)->seg) return -1;	if (addr > ((AddressX86_1632 *)obj)->addr) return 1;	if (addr < ((AddressX86_1632 *)obj)->addr) return -1;	return 0;}int AddressX86_1632::compareDelinear(Address *to){	assert(getObjectID() == to->getObjectID());	uint32 s1 = delinearize(seg);	uint32 s2 = delinearize(((AddressX86_1632 *)to)->seg);	if (s1 > s2) return 1;	if (s1 < s2) return -1;	uint32 a1 = delinearize(addr);	uint32 a2 = delinearize(((AddressX86_1632 *)to)->addr);	if (a1 > a2) return 1;	if (a1 < a2) return -1;	return 0;}bool AddressX86_1632::difference(int &result, Address *to){	if ((getObjectID() == to->getObjectID()) && (seg == ((AddressX86_1632 *)to)->seg)) {		result = addr-((AddressX86_1632 *)to)->addr;		return true;	} else {		return false;	}}AddressX86_1632 *AddressX86_1632::clone() const{	return new AddressX86_1632(*this);}void AddressX86_1632::getFromArray(const byte *array){	UNALIGNED_MOVE(addr, *(uint32*)array);	UNALIGNED_MOVE(seg, *(uint16*)(array+sizeof addr));}void AddressX86_1632::getFromCPUAddress(CPU_ADDR *ca){	seg = ca->addr32.seg;	addr = ca->addr32.offset;}bool AddressX86_1632::getFromUInt64(uint64 u){	return false;}void AddressX86_1632::load(ObjectStream &s){	GET_INT16X(s, seg);	GET_INT16X(s, addr);}ObjectID AddressX86_1632::getObjectID() const{	return ATOM_ADDRESS_X86_1632;}int AddressX86_1632::parseString(const char *s, int length, Analyser *a){	return 0;}void AddressX86_1632::putIntoArray(byte *array) const{	UNALIGNED_MOVE(*(uint32*)array, addr);	UNALIGNED_MOVE(*(uint16*)(array+sizeof addr), seg);}void AddressX86_1632::putIntoCPUAddress(CPU_ADDR *ca) const{	ca->addr32.seg = seg;	ca->addr32.offset = addr;}bool AddressX86_1632::putIntoUInt64(uint64 &u) const{	return false;}void AddressX86_1632::store(ObjectStream &s) const{	PUT_INT16X(s, seg);	PUT_INT16X(s, addr);}int AddressX86_1632::stringify(char *s, int max_length, int format) const{	const char *formats[] = {		"%s%x%s:%s%x%s",		"%s%4x%s:%s%08x%s",		"%s%04x%s:%s%08x%s",		"",		"%s%X%s:%s%X%s",		"%s%4X%s:%s%08X%s",		"%s%04X%s:%s%08X%s",		"",	};	return ht_snprintf(s, max_length, formats[format&7],	(format & ADDRESS_STRING_FORMAT_ADD_0X) ? "0x":"", seg, (format & ADDRESS_STRING_FORMAT_ADD_H) ? "h":"",	(format & ADDRESS_STRING_FORMAT_ADD_0X) ? "0x":"", addr, (format & ADDRESS_STRING_FORMAT_ADD_H) ? "h":"");}int AddressX86_1632::stringSize() const{	return 14;}/* * */AddressX86_1616::AddressX86_1616(uint16 Seg, uint16 Addr){	seg = Seg;	addr = Addr;}bool AddressX86_1616::add(int offset){	// check for overflow	if ((int)offset < 0) {		if (addr+offset > addr) return false;	} else {		if (addr+offset < addr) return false;	}	addr+=offset;	return true;}int AddressX86_1616::byteSize(){	return 4;}int AddressX86_1616::compareTo(const Object *obj) const{	assert(getObjectID() == obj->getObjectID());	if (seg > ((AddressX86_1616 *)obj)->seg) return 1;	if (seg < ((AddressX86_1616 *)obj)->seg) return -1;	if (addr > ((AddressX86_1616 *)obj)->addr) return 1;	if (addr < ((AddressX86_1616 *)obj)->addr) return -1;	return 0;}int AddressX86_1616::compareDelinear(Address *to){	assert(getObjectID() == to->getObjectID());	uint32 s1 = delinearize(seg);	uint32 s2 = delinearize(((AddressX86_1616 *)to)->seg);	if (s1 > s2) return 1;	if (s1 < s2) return -1;	uint32 a1 = delinearize(addr);	uint32 a2 = delinearize(((AddressX86_1616 *)to)->addr);	if (a1 > a2) return 1;	if (a1 < a2) return -1;	return 0;}bool AddressX86_1616::difference(int &result, Address *to){	if ((getObjectID() == to->getObjectID()) && (seg == ((AddressX86_1616 *)to)->seg)) {		result = (int)addr-(int)((AddressX86_1616 *)to)->addr;		return true;	} else {		return false;	}}AddressX86_1616 *AddressX86_1616::clone() const{	return new AddressX86_1616(*this);}void AddressX86_1616::getFromArray(const byte *array){	UNALIGNED_MOVE(addr, *(uint16*)array);	UNALIGNED_MOVE(seg, *(uint16*)(array+sizeof addr));}bool AddressX86_1616::getFromUInt64(uint64 u){	return false;}void AddressX86_1616::getFromCPUAddress(CPU_ADDR *ca){	seg = ca->addr32.seg;	addr = ca->addr32.offset;}void AddressX86_1616::load(ObjectStream &s){	GET_INT16X(s, seg);	GET_INT16X(s, addr);}ObjectID AddressX86_1616::getObjectID() const{	return ATOM_ADDRESS_X86_1616;}int AddressX86_1616::parseString(const char *s, int length, Analyser *a){	return 0;}void AddressX86_1616::putIntoArray(byte *array) const{	UNALIGNED_MOVE(*(uint16*)array, addr);	UNALIGNED_MOVE(*(uint16*)(array+sizeof seg), seg);}void AddressX86_1616::putIntoCPUAddress(CPU_ADDR *ca) const{	ca->addr32.seg = seg;	ca->addr32.offset = addr;}bool AddressX86_1616::putIntoUInt64(uint64 &u) const{	return false;}void AddressX86_1616::store(ObjectStream &s) const{	PUT_INT16X(s, seg);	PUT_INT16X(s, addr);}int AddressX86_1616::stringify(char *s, int max_length, int format) const{	const char *formats[] = {		"%s%x%s:%s%04x%s",		"%s%4x%s:%s%04x%s",		"%s%04x%s:%s%04x%s",		"",		"%s%X%s:%s%04X%s",		"%s%4X%s:%s%04X%s",		"%s%04X%s:%s%04X%s",		"",	};	return ht_snprintf(s, max_length, formats[format&7],	(format & ADDRESS_STRING_FORMAT_ADD_0X) ? "0x":"", seg, (format & ADDRESS_STRING_FORMAT_ADD_H) ? "h":"",	(format & ADDRESS_STRING_FORMAT_ADD_0X) ? "0x":"", addr, (format & ADDRESS_STRING_FORMAT_ADD_H) ? "h":"");}int AddressX86_1616::stringSize() const{	return 9;}void AnalyX86Disassembler::init(Analyser *A, int f){	flags = f;	createUnasm();	AnalyDisassembler::init(A);}/* * */void AnalyX86Disassembler::load(ObjectStream &f){	GET_INT32X(f, flags);	AnalyDisassembler::load(f);}/* * */ObjectID AnalyX86Disassembler::getObjectID() const{	return ATOM_ANALY_X86;}Address *AnalyX86Disassembler::createAddress(uint16 segment, uint64 offset){	if (flags & (ANALYX86DISASSEMBLER_FLAGS_FLAT64 | ANALYX86DISASSEMBLER_FLAGS_AMD64)) {		return new AddressFlat64(offset);	} else if (flags & ANALYX86DISASSEMBLER_FLAGS_SEGMENTED) {		if (offset <= 0xffff) {			return new AddressX86_1616(segment, offset);		} else {			// FIXME//			return new AddressX86_1632(segment, offset);			return new AddressX86_1616(segment, offset);		}	} else {		return new AddressX86Flat32(offset);	}}void AnalyX86Disassembler::createUnasm(){	if (flags & ANALYX86DISASSEMBLER_FLAGS_AMD64) {		disasm = new x86_64dis();	} else {		if (flags & ANALYX86DISASSEMBLER_FLAGS_VXD_X86DIS) {			if (flags & ANALYX86DISASSEMBLER_FLAGS_16BIT) {				disasm = new x86dis_vxd(X86_OPSIZE16, X86_ADDRSIZE16);			} else {				disasm = new x86dis_vxd(X86_OPSIZE32, X86_ADDRSIZE32);			}		} else {			if (flags & ANALYX86DISASSEMBLER_FLAGS_16BIT) {				disasm = new x86dis(X86_OPSIZE16, X86_ADDRSIZE16);			} else {				disasm = new x86dis(X86_OPSIZE32, X86_ADDRSIZE32);			}		}	}}uint16 AnalyX86Disassembler::getSegment(Address *addr){	if (addr->getObjectID() == ATOM_ADDRESS_X86_1616) {		return ((AddressX86_1616*)addr)->seg;	} else if (addr->getObjectID() == ATOM_ADDRESS_X86_1632) {		return ((AddressX86_1632*)addr)->seg;	} else {		assert(0);		return 0;	}}/* * */Address *AnalyX86Disassembler::branchAddr(OPCODE *opcode, branch_enum_t branchtype, bool examine){	Address *addr;	x86dis_insn *o = (x86dis_insn*)opcode;	assert(o->op[1].type == X86_OPTYPE_EMPTY);	switch (o->op[0].type) {		case X86_OPTYPE_IMM: {						uint16 seg = 0;			if (flags & ANALYX86DISASSEMBLER_FLAGS_SEGMENTED) {				seg = getSegment(analy->addr);			}			addr = createAddress(seg, o->op[0].imm);			return addr;		}		case X86_OPTYPE_FARPTR:			if (flags & ANALYX86DISASSEMBLER_FLAGS_SEGMENTED) {				addr = createAddress(o->op[0].farptr.seg, o->op[0].farptr.offset);			} else {				break;			}			return addr;		case X86_OPTYPE_MEM: {			taccess access;			addr = NULL;			if (o->op[0].mem.hasdisp) {				addr = createAddress(0, o->op[0].mem.disp);				access.type = acread;				access.indexed = (o->op[0].mem.base != X86_REG_NO) || (o->op[0].mem.index != X86_REG_NO);				access.size = o->op[0].size;			} else {				break;			}			if (examine && analy->validAddress(addr, scvalid)) {				analy->dataAccess(addr, access);				xref_enum_t xref;				switch (branchtype) {					case br_jXX:					case br_jump:						xref = xrefijump;						break;					case br_call:						xref = xreficall;						break;					default: {assert(0);}				}				analy->addXRef(addr, analy->addr, xref);			}			if (examine) {				delete addr;				break;			} else {				return addr;			}		}		default: break;	}	return new InvalidAddress();}/* * */void	AnalyX86Disassembler::examineOpcode(OPCODE *opcode){	x86dis_insn *o = (x86dis_insn*)opcode;	for (int i = 0; i < 5; i++) {		x86_insn_op *op = &o->op[i];		Address *addr = NULL;		taccess access;		xref_enum_t xref = xrefoffset;		switch (op->type) {		case X86_OPTYPE_IMM:			access.type = acoffset;			access.indexed = false;			addr = createAddress(0, op->imm);			break;		case X86_OPTYPE_FARPTR:			if (flags & ANALYX86DISASSEMBLER_FLAGS_SEGMENTED) {				addr = createAddress(op->farptr.seg, op->farptr.offset);			}			access.type = acoffset;			access.indexed = false;			break;		case X86_OPTYPE_MEM:			if (op->mem.hasdisp) {				addr = createAddress(0, op->mem.disp);				access.type = acread;				access.indexed = (op->mem.base != X86_REG_NO) || (op->mem.index != X86_REG_NO);				access.size = op->size;				if (strcmp(o->name, "cmp")==0 || strcmp(o->name, "test")==0 || strcmp(o->name, "push")==0) {					xref = xrefread;				} else {					xref = (i==0) ? xrefwrite : xrefread;				}			}			break;		default: continue;		}		if (addr) {			if (analy->validAddress(addr, scvalid)) {				analy->dataAccess(addr, access);				analy->addXRef(addr, analy->addr, xref);			}			delete addr;		}	}}/* * */branch_enum_t AnalyX86Disassembler::isBranch(OPCODE *opcode){	x86dis_insn *o = (x86dis_insn*)opcode;	const char *opcode_str = o->name;	if (opcode_str[0] == '~') {		opcode_str++;	}	if (opcode_str[0] == '|') {		opcode_str++;	}	if (opcode_str[0]=='j') {		if (opcode_str[1]=='m') return br_jump; else return br_jXX;	} else if ((opcode_str[0]=='l') && (opcode_str[1]=='o')  && (opcode_str[2]=='o')) {		// loop opcode will be threated like a jXX		return br_jXX;	} else if ((opcode_str[0]=='c') && (opcode_str[1]=='a')) {		return br_call;	} else if ((opcode_str[0]=='r') && (opcode_str[1]=='e')) {		return br_return;	} else return br_nobranch;}/* * */void AnalyX86Disassembler::store(ObjectStream &f) const{	PUT_INT32X(f, flags);	AnalyDisassembler::store(f);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费在线一区观看| 91福利国产精品| 欧美写真视频网站| 国产亚洲一区字幕| 午夜精品福利久久久| 国产成人av一区二区| 欧美日韩精品一区二区天天拍小说 | 国产精品毛片久久久久久| 日本成人中文字幕在线视频| 成人夜色视频网站在线观看| 在线电影国产精品| 亚洲综合另类小说| 色偷偷一区二区三区| 国产欧美精品一区| 国产伦精品一区二区三区免费迷| 欧美日韩精品一区二区天天拍小说| 亚洲欧洲另类国产综合| 国产风韵犹存在线视精品| 日韩三级av在线播放| 午夜精品在线看| 欧美在线观看一二区| 一区二区三国产精华液| 99视频精品在线| 最新中文字幕一区二区三区 | 欧美成人a视频| 日韩精品视频网| 欧美日韩亚洲国产综合| 亚洲一区二区三区中文字幕 | 亚洲精品高清视频在线观看| 97久久精品人人做人人爽50路| 中文字幕欧美日本乱码一线二线| 国产高清亚洲一区| 国产色综合久久| 国产成人精品三级| 欧美丰满嫩嫩电影| 久久精品国产99国产| 欧美不卡视频一区| 美女视频一区在线观看| 欧美va亚洲va香蕉在线| 国产一区二区三区美女| 日本电影亚洲天堂一区| 亚洲午夜久久久久久久久电影网 | 欧美一区二区久久久| hitomi一区二区三区精品| 日韩激情中文字幕| 亚洲日本在线天堂| 中文字幕 久热精品 视频在线| 91精品久久久久久蜜臀| 色香色香欲天天天影视综合网| 国产精品自拍三区| 日韩国产欧美在线视频| 夜夜亚洲天天久久| 亚洲欧洲成人精品av97| 亚洲精品一区二区三区香蕉| 欧美色男人天堂| 日本乱码高清不卡字幕| 暴力调教一区二区三区| 国产精品小仙女| 精品中文字幕一区二区| 天天色图综合网| 亚洲一区二区三区精品在线| 亚洲精品乱码久久久久久 | 欧美色综合天天久久综合精品| 国产91对白在线观看九色| 久久国产精品一区二区| 日本在线播放一区二区三区| 亚洲国产一区二区a毛片| 一区二区三区毛片| 一区二区不卡在线播放| 一区二区三区蜜桃网| 亚洲精品视频一区二区| 亚洲精品免费播放| 夜夜操天天操亚洲| 亚洲成人福利片| 天天色天天爱天天射综合| 午夜精品久久久久久久| 日本不卡视频在线| 美国三级日本三级久久99| 美女看a上一区| 韩国一区二区在线观看| 国产成人在线免费| av一区二区久久| 95精品视频在线| 欧美午夜精品一区二区蜜桃 | 3atv一区二区三区| 日韩亚洲欧美成人一区| 欧美一区二区播放| 久久夜色精品国产噜噜av| 久久欧美一区二区| 中文字幕一区日韩精品欧美| 亚洲人成精品久久久久久| 亚洲国产乱码最新视频 | 欧美精品一区二区三区四区| 26uuu亚洲| 中文字幕在线不卡国产视频| 亚洲精品高清视频在线观看| 婷婷亚洲久悠悠色悠在线播放| 理论片日本一区| 国产福利一区二区| 91麻豆精品一区二区三区| 欧美一a一片一级一片| 欧美xxxxxxxxx| 中文字幕成人av| 亚洲成人免费看| 国产乱妇无码大片在线观看| 色综合av在线| 欧美大尺度电影在线| 国产蜜臀97一区二区三区| 亚洲夂夂婷婷色拍ww47| 极品尤物av久久免费看| 91美女片黄在线观看91美女| 日韩视频中午一区| 国产精品久久久久久久午夜片| 亚洲高清免费一级二级三级| 国产精品99久久久久久似苏梦涵| 日本道色综合久久| 精品国产伦一区二区三区观看方式 | 亚洲男同1069视频| 精品一区二区三区久久久| av资源站一区| 精品国产三级电影在线观看| 一区二区三区毛片| 国产成人自拍网| 欧美精品777| 亚洲色图制服诱惑| 国产一区二区调教| 欧美日韩免费在线视频| 国产精品三级电影| 久久99热狠狠色一区二区| 色婷婷av一区二区三区gif| 久久亚洲精华国产精华液 | 色偷偷久久一区二区三区| 久久综合国产精品| 日韩激情视频在线观看| 一本大道av一区二区在线播放| 久久久久国色av免费看影院| 亚洲第一福利视频在线| 91在线精品一区二区| 久久婷婷一区二区三区| 美女视频黄免费的久久| 在线观看精品一区| 国产精品成人一区二区三区夜夜夜 | 国产欧美一区二区三区网站| 日本欧美一区二区三区| 欧美视频中文字幕| 亚洲三级小视频| 成人开心网精品视频| www亚洲一区| 捆绑调教美女网站视频一区| 欧美精品色一区二区三区| 亚洲美女一区二区三区| 97国产一区二区| 国产欧美日产一区| 国内欧美视频一区二区| 日韩美女在线视频| 日韩av一区二区三区| 欧美日韩一区三区四区| 亚洲综合在线视频| 91精彩视频在线观看| 亚洲男人的天堂av| 91国产福利在线| 一区二区三区四区视频精品免费| av电影一区二区| 亚洲视频一区二区在线| 91美女福利视频| 夜夜嗨av一区二区三区中文字幕| 色呦呦国产精品| 亚洲国产婷婷综合在线精品| 欧美日韩一区二区三区不卡| 首页国产欧美日韩丝袜| 日韩欧美色综合| 激情综合亚洲精品| 国产欧美日韩综合| 99热这里都是精品| 亚洲黄色录像片| 欧美日韩免费视频| 日韩极品在线观看| 精品国产成人系列| 成人小视频在线观看| 综合色中文字幕| 欧美日韩专区在线| 毛片基地黄久久久久久天堂| 久久久久免费观看| av不卡一区二区三区| 亚洲国产精品一区二区久久恐怖片| 欧美亚洲自拍偷拍| 久久草av在线| 国产精品福利电影一区二区三区四区 | 91福利国产成人精品照片| 午夜视频久久久久久| 精品日韩成人av| 不卡的av在线播放| 亚洲成人动漫在线免费观看| 日韩精品一区二区在线观看| 国产成人综合在线| 亚洲一二三级电影| 久久免费视频色| 在线观看不卡视频| 九九国产精品视频| 亚洲免费观看高清完整版在线 |