Beispiel #1
0
int dex_read_sleb128(const char *ptr, int size) {
	int cur, result;
	ut8 len = dex_uleb128_len ((const ut8*)ptr, size);
	if (len > size) {
		return 0;
	}
	ptr += len - 1;
	result = *(ptr--);

	if (result <= 0x7f) {
		SIG_EXTEND (result, 25);
	} else {
		cur = *(ptr--);
		result = (result & 0x7f) | ((cur & 0x7f) << 7);
		if (cur <= 0x7f) {
			SIG_EXTEND (result, 18);
		} else {
			cur = *(ptr--);
			result |= (cur & 0x7f) << 14;
			if (cur <= 0x7f) {
				SIG_EXTEND (result, 11);
			} else {
				cur = *(ptr--);
				result |= (cur & 0x7f) << 21;
				if (cur <= 0x7f) {
					SIG_EXTEND (result, 4);
				} else {
					cur = *(ptr--);
					result |= cur << 28;
				}
			}
		}
	}
	return result;
}
Beispiel #2
0
static RList* strings (RBinArch *arch) {
	RList *ret = NULL;
	RBinString *ptr = NULL;
	struct r_bin_dex_obj_t *bin = (struct r_bin_dex_obj_t *) arch->bin_obj;
	ut32 i;
	char buf[6];
	int len;

	if (!(ret = r_list_new ()))
		return NULL;
	ret->free = free;
	for (i = 0; i < bin->header.strings_size; i++) {
		if (!(ptr = R_NEW (RBinString)))
			break;
		r_buf_read_at (bin->b, bin->strings[i], (ut8*)&buf, 6);
		len = dex_read_uleb128 (buf);
		//	len = R_BIN_SIZEOF_STRINGS-1;
		if (len>0 && len < R_BIN_SIZEOF_STRINGS) {
			r_buf_read_at (bin->b, bin->strings[i]+dex_uleb128_len (buf),
					(ut8*)&ptr->string, len);
			ptr->string[(int) len]='\0';
			ptr->rva = ptr->offset = bin->strings[i];
			ptr->size = len;
			ptr->ordinal = i+1;
			r_list_append (ret, ptr);
		} //else eprintf ("dex_read_uleb128: invalid read\n");
	}
	return ret;
}
Beispiel #3
0
// Move to r_util ??
int dex_read_uleb128(const ut8 *ptr) {
	ut8 len = dex_uleb128_len (ptr);
	const ut8 *in = ptr + len - 1;
	ut32 result = 0;
	ut8 shift = 0;
	ut8 byte;

	while(shift < 29 && len > 0) {
		byte = *(in--);
		result |= (byte & 0x7f << shift);
		if (byte > 0x7f)
			break;
		shift += 7;
		len--;
	}
	return result;
}
Beispiel #4
0
static RList* methods (RBinArch *arch) {
	RList *ret = NULL;
	struct r_bin_dex_obj_t *bin = (struct r_bin_dex_obj_t *) arch->bin_obj;
	int i, j, len;
	char *name, buf[6];
	RBinSymbol *ptr;

	if (!(ret = r_list_new ()))
		return NULL;
	ret->free = free;
	for (i = 0; i<bin->header.method_size; i++) {
		if (!(ptr = R_NEW (RBinSymbol)))
			break;
		r_buf_read_at (bin->b, bin->strings[bin->methods[i].name_id], (ut8*)&buf, 6);
		len = dex_read_uleb128 (buf);

		name = malloc (len);
		if (!name) {
			eprintf ("error malloc string length %d\n", len);
			break;
		}
		r_buf_read_at (bin->b, bin->strings[bin->methods[i].name_id]+
				dex_uleb128_len (buf), (ut8*)name, len);
		snprintf (ptr->name, sizeof (ptr->name), "method.%d.%s", 
				bin->methods[i].class_id, name);
		free (name);

		strncpy (ptr->forwarder, "NONE", R_BIN_SIZEOF_STRINGS);
		strncpy (ptr->bind, "NONE", R_BIN_SIZEOF_STRINGS);
		strncpy (ptr->type, "FUNC", R_BIN_SIZEOF_STRINGS);
		ptr->rva = ptr->offset = bin->header.method_offset +
			(sizeof (struct dex_method_t) * i);
		ptr->size = sizeof (struct dex_method_t);
		ptr->ordinal = i+1;
		r_list_append (ret, ptr);
	}
	j = i;
	for (i = 0; i<bin->header.fields_size; i++) {
		if (!(ptr = R_NEW (RBinSymbol)))
			break;
		r_buf_read_at (bin->b, bin->strings[bin->fields[i].name_id], (ut8*)&buf, 6);

		len = dex_read_uleb128 (buf);
		name = malloc (len);
		if (!name) {
			eprintf ("error malloc string length %d\n", len);
			break;
		}
		r_buf_read_at (bin->b, bin->strings[bin->fields[i].name_id]+
				dex_uleb128_len (buf), (ut8*)name, len);
		snprintf (ptr->name, sizeof (ptr->name), "field.%d.%s", 
			bin->fields[i].class_id, name);
		free (name);

		strncpy (ptr->forwarder, "NONE", R_BIN_SIZEOF_STRINGS);
		strncpy (ptr->bind, "NONE", R_BIN_SIZEOF_STRINGS);
		strncpy (ptr->type, "FUNC", R_BIN_SIZEOF_STRINGS);
		ptr->rva = ptr->offset = bin->header.fields_offset +
			(sizeof (struct dex_field_t) * i);
		ptr->size = sizeof (struct dex_field_t);
		ptr->ordinal = j+i+1;
		r_list_append (ret, ptr);
	}
	return ret;
}