mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-03 19:01:31 +00:00
475372ec2c
Fix invalid wide string identification in 'ad' command Temporal blocksize syntax ':' has changed to '!' - x @ 1024!33 Fix overlapped IO sections handling Add support for segmented address in temporal seek Fix disassemlby to print more lines than blocksize
212 lines
5.8 KiB
C
212 lines
5.8 KiB
C
/* radare - LGPL - Copyright 2009-2012 - pancake */
|
|
|
|
static int cmd_section(void *data, const char *input) {
|
|
RCore *core = (RCore *)data;
|
|
switch (*input) {
|
|
case '?':
|
|
r_cons_printf (
|
|
" S ; list sections\n"
|
|
" S. ; show current section name\n"
|
|
" S? ; show this help message\n"
|
|
" S* ; list sections (in radare commands)\n"
|
|
" S= ; list sections (in nice ascii-art bars)\n"
|
|
" Sa[-] [arch] [bits] ; Specify arch and bits for given section\n"
|
|
" Sd [file] ; dump current section to a file (see dmd)\n"
|
|
" Sl [file] ; load contents of file into current section (see dml)\n"
|
|
" Sr [name] ; rename section on current seek\n"
|
|
" S [off] [vaddr] [sz] [vsz] [name] [rwx] ; add new section\n"
|
|
" S-[id|0xoff|*] ; remove this section definition\n");
|
|
break;
|
|
case 'a':
|
|
switch (input[1]) {
|
|
case '\0':
|
|
{
|
|
int b = 0;
|
|
const char *n = r_io_section_get_archbits (core->io,
|
|
core->offset, &b);
|
|
if (n) r_cons_printf ("%s %d\n", n, b);
|
|
}
|
|
break;
|
|
case '-':
|
|
r_io_section_set_archbits (core->io, core->offset, NULL, 0);
|
|
break;
|
|
case '?':
|
|
default:
|
|
eprintf ("Usage: Sa[-][arch] [bits] [[off]]\n");
|
|
break;
|
|
case ' ':
|
|
{
|
|
char *p, *str = strdup (input+2); // SKIPSPACES HERE
|
|
p = strchr (str, ' ');
|
|
if (p) {
|
|
*p++ = 0;
|
|
if (r_io_section_set_archbits (core->io,
|
|
core->offset, str, atoi (p))) {
|
|
core->section = NULL;
|
|
r_core_seek (core, core->offset, 0);
|
|
} else eprintf ("Cannot set arch/bits at 0x%08"PFMT64x"\n",
|
|
core->offset);
|
|
} else eprintf ("Missing argument\n");
|
|
free (str);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 'r':
|
|
if (input[1]==' ') {
|
|
RIOSection *s;
|
|
int len = 0;
|
|
ut64 addr;
|
|
char *p = strchr (input+2, ' ');
|
|
if (p) {
|
|
addr = r_num_math (core->num, p+1);
|
|
len = (int)(size_t)(p-input+2);
|
|
} else addr = core->offset;
|
|
s = r_io_section_get (core->io, addr);
|
|
if (s) {
|
|
if (!len) len = sizeof (s->name);
|
|
r_str_ncpy (s->name, input+2, len);
|
|
} else eprintf ("No section found in 0x%08"PFMT64x"\n", core->offset);
|
|
} else eprintf ("Usage: Sr [name] ([offset])\n");
|
|
break;
|
|
case 'd':
|
|
{
|
|
char file[128];
|
|
ut64 o = core->offset;
|
|
RListIter *iter;
|
|
RIOSection *s;
|
|
if (core->io->va || core->io->debug)
|
|
o = r_io_section_vaddr_to_offset (core->io, o);
|
|
r_list_foreach (core->io->sections, iter, s) {
|
|
if (o>=s->offset && o<s->offset+s->size) {
|
|
ut8 *buf = malloc (s->size);
|
|
r_io_read_at (core->io, s->offset, buf, s->size);
|
|
if (input[1]==' ' && input[2]) {
|
|
strncpy (file, input+2, sizeof (file));
|
|
} else snprintf (file, sizeof (file), "0x%08"PFMT64x"-0x%08"PFMT64x"-%s.dmp",
|
|
s->vaddr, s->vaddr+s->size, r_str_rwx_i (s->rwx));
|
|
if (!r_file_dump (file, buf, s->size)) {
|
|
eprintf ("Cannot write '%s'\n", file);
|
|
free (buf);
|
|
return R_FALSE;
|
|
}
|
|
eprintf ("Dumped %d bytes into %s\n", (int)s->size, file);
|
|
free (buf);
|
|
return R_TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 'l':
|
|
{
|
|
ut64 o = core->offset;
|
|
RListIter *iter;
|
|
RIOSection *s;
|
|
if (input[1] != ' ') {
|
|
eprintf ("Usage: Sl [file]\n");
|
|
return R_FALSE;
|
|
}
|
|
if (core->io->va || core->io->debug)
|
|
o = r_io_section_vaddr_to_offset (core->io, o);
|
|
r_list_foreach (core->io->sections, iter, s) {
|
|
if (o>=s->offset && o<s->offset+s->size) {
|
|
int sz;
|
|
char *buf = r_file_slurp (input+2, &sz);
|
|
#warning TODO: use mmap here. we need a portable implementation
|
|
if (!buf) {
|
|
eprintf ("Cannot allocate 0x%08"PFMT64x" bytes\n", s->size);
|
|
return R_FALSE;
|
|
}
|
|
r_io_write_at (core->io, s->vaddr, (const ut8*)buf, sz);
|
|
eprintf ("Loaded %d bytes into the map region at 0x%08"PFMT64x"\n", sz, s->vaddr);
|
|
free (buf);
|
|
return R_TRUE;
|
|
}
|
|
}
|
|
eprintf ("No debug region found here\n");
|
|
return R_FALSE;
|
|
}
|
|
break;
|
|
case '-':
|
|
if (input[1] == '*') {
|
|
// remove all sections
|
|
r_io_section_init (core->io);
|
|
} else
|
|
if (input[1] == '0' && input[2]=='x') {
|
|
RIOSection *s = r_io_section_get (core->io, r_num_get (NULL, input+1));
|
|
// use offset
|
|
r_io_section_rm (core->io, s->id);
|
|
} else {
|
|
r_io_section_rm (core->io, atoi (input+1));
|
|
}
|
|
break;
|
|
case ' ':
|
|
switch (input[1]) {
|
|
case '-': // remove
|
|
if (input[2]=='?' || input[2]=='\0')
|
|
eprintf ("Usage: S -N # where N is the section index\n");
|
|
else r_io_section_rm (core->io, atoi (input+1));
|
|
break;
|
|
default:
|
|
{
|
|
int i, rwx = 7;
|
|
char *ptr = strdup(input+1);
|
|
const char *name = NULL;
|
|
ut64 vaddr = 0LL;
|
|
ut64 offset = 0LL;
|
|
ut64 size = 0LL;
|
|
ut64 vsize = 0LL;
|
|
|
|
i = r_str_word_set0 (ptr);
|
|
switch (i) {
|
|
case 6: // get rwx
|
|
rwx = r_str_rwx (r_str_word_get0 (ptr, 5));
|
|
case 5: // get name
|
|
name = r_str_word_get0 (ptr, 4);
|
|
case 4: // get vsize
|
|
vsize = r_num_math (core->num, r_str_word_get0 (ptr, 3));
|
|
case 3: // get size
|
|
size = r_num_math (core->num, r_str_word_get0 (ptr, 2));
|
|
case 2: // get vaddr
|
|
vaddr = r_num_math (core->num, r_str_word_get0 (ptr, 1));
|
|
case 1: // get offset
|
|
offset = r_num_math (core->num, r_str_word_get0 (ptr, 0));
|
|
}
|
|
r_io_section_add (core->io, offset, vaddr, size, vsize, rwx, name);
|
|
free (ptr);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case '=':
|
|
r_io_section_list_visual (core->io, core->offset, core->blocksize);
|
|
break;
|
|
case '.':
|
|
{
|
|
ut64 o = core->offset;
|
|
RListIter *iter;
|
|
RIOSection *s;
|
|
if (core->io->va || core->io->debug)
|
|
o = r_io_section_vaddr_to_offset (core->io, o);
|
|
r_list_foreach (core->io->sections, iter, s) {
|
|
if (o>=s->offset && o<s->offset+s->size) {
|
|
r_cons_printf ("0x%08"PFMT64x" 0x%08"PFMT64x" %s\n",
|
|
s->offset + s->vaddr,
|
|
s->offset + s->vaddr + s->size,
|
|
s->name);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case '\0':
|
|
r_io_section_list (core->io, core->offset, 0);
|
|
break;
|
|
case '*':
|
|
r_io_section_list (core->io, core->offset, 1);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|