Пример #1
0
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
	static struct disassemble_info disasm_obj;
	if (len<4) return -1;
	buf_global = op->buf_asm;
	Offset = a->pc;
	// disasm inverted
	r_mem_swapendian (bytes, buf, 4); // TODO handle thumb

	/* prepare disassembler */
	memset (&disasm_obj,'\0', sizeof (struct disassemble_info));
	disasm_obj.buffer = bytes;
	disasm_obj.read_memory_func = &sparc_buffer_read_memory;
	disasm_obj.symbol_at_address_func = &symbol_at_address;
	disasm_obj.memory_error_func = &memory_error_func;
	disasm_obj.print_address_func = &print_address;
	disasm_obj.endian = !a->big_endian;
	disasm_obj.fprintf_func = &buf_fprintf;
	disasm_obj.stream = stdout;
	disasm_obj.mach = ((a->bits == 64)
			   ? bfd_mach_sparc_v9b
			   : 0);

	op->buf_asm[0]='\0';
	op->size = print_insn_sparc ((bfd_vma)Offset, &disasm_obj);

	if (op->size == -1)
		strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE);
	return op->size;
}
Пример #2
0
// The default endian is LE for streams.
// This function either swaps or copies len bytes depending on bool big_endian
// TODO: Remove completely
R_API void r_mem_swaporcopy(ut8 *dest, const ut8 *src, int len, bool big_endian) {
	if (big_endian) {
		r_mem_swapendian (dest, src, len);
	} else {
		memcpy (dest, src, len);
	}
}
Пример #3
0
static bool check_bytes(const ut8 *buf, ut64 length) {
	bool ret = false;
	int off, version = 0;
	if (buf && length > 32 && !memcmp (buf, "\xca\xfe\xba\xbe", 4)) {
		// XXX not sure about endianness here
		memcpy (&off, buf + 4 * sizeof (int), sizeof (int));
		version = buf[6] | (buf[7] << 8);
		if (version > 1024) {
			// XXX is this correct in all cases? opposite of prev?
			r_mem_swapendian ((ut8 *) &off, (ut8 *) &off, sizeof (int));
			ret = true;
		}
	}
	return ret;
}
Пример #4
0
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
	ut8 buf2[4];
	struct winedbg_arm_insn *arminsn = arm_new();
	arm_set_pc (arminsn, a->pc);
	arm_set_thumb (arminsn, a->bits == 16);
	if (a->big_endian && a->bits == 32) {
		r_mem_swapendian (buf2, buf, 4);
		arm_set_input_buffer (arminsn, buf2);
	} else {
		arm_set_input_buffer (arminsn, buf);
	}
	op->size = arm_disasm_one_insn (arminsn);
	strncpy (op->buf_asm, winedbg_arm_insn_asm (arminsn), R_ASM_BUFSIZE-1);
	strncpy (op->buf_hex, winedbg_arm_insn_hex (arminsn), R_ASM_BUFSIZE-1);
	arm_free (arminsn);
	return op->size;
}
Пример #5
0
static void h8300_anal_jmp(RAnalOp *op, ut64 addr, const ut8 *buf) {
	ut16 ad;

	switch (buf[0]) {
	case H8300_JMP_1:
		op->type = R_ANAL_OP_TYPE_UJMP;
		break;
	case H8300_JMP_2:
		op->type = R_ANAL_OP_TYPE_JMP;
		r_mem_swapendian ((ut8*)&ad, buf + 2, sizeof (ut16));
		op->jump = ad;
		break;
	case H8300_JMP_3:
		op->type = R_ANAL_OP_TYPE_UJMP;
		op->jump = buf[1];
		break;
	}
}
Пример #6
0
static void h8300_anal_jsr(RAnalOp *op, ut64 addr, const ut8 *buf) {
	ut16 ad;

	switch (buf[0]) {
	case H8300_JSR_1:
		op->type = R_ANAL_OP_TYPE_UCALL;
		break;
	case H8300_JSR_2:
		op->type = R_ANAL_OP_TYPE_CALL;
		r_mem_swapendian ((ut8*)&ad, buf + 2, sizeof (ut16));
		op->jump = ad;
		op->fail = addr + 4;
		break;
	case H8300_JSR_3:
		op->type = R_ANAL_OP_TYPE_UCALL;
		op->jump = buf[1];
		break;
	}
}
Пример #7
0
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) {
	static int (*print_insn_hexagon)(bfd_vma, struct disassemble_info *);
	static struct disassemble_info disasm_obj;
	if (len < 4) {
		return -1;
	}
	buf_global = op->buf_asm;
	Offset = a->pc;
	// disasm inverted
	r_mem_swapendian (bytes, buf, 4); // TODO handle thumb

	/* prepare disassembler */
	memset (&disasm_obj,'\0', sizeof (struct disassemble_info));
	disasm_obj.buffer = bytes;
	disasm_obj.read_memory_func = &hexagon_buffer_read_memory;
	disasm_obj.symbol_at_address_func = &symbol_at_address;
	disasm_obj.memory_error_func = &memory_error_func;
	disasm_obj.print_address_func = &print_address;
	disasm_obj.endian = a->big_endian;
	disasm_obj.fprintf_func = &buf_fprintf;
	disasm_obj.stream = stdout;
	disasm_obj.mach = 0;

	op->buf_asm[0] = '\0';
print_insn_hexagon = hexagon_get_disassembler_from_mach(0,0);
	op->size = print_insn_hexagon ((bfd_vma)Offset, &disasm_obj);

	if (!strncmp (op->buf_asm, "unknown", 7)) {
		strncpy (op->buf_asm, "invalid", R_ASM_BUFSIZE);
	}

	if (op->size == -1) {
		strncpy (op->buf_asm, " (data)", R_ASM_BUFSIZE);
	}
	return op->size;
}
Пример #8
0
static int assemble(RAsm *a, RAsmOp *op, const char *str) {
	int ret = mips_assemble (str, a->pc, op->buf);
	if (!a->big_endian)
		r_mem_swapendian (op->buf, op->buf, op->size);
	return ret;
}